wpf游戏引擎前端的Transform.cs实现

1.Transform.cs

using PrimalEditor.Utilities;

using System.IO;

using System.Numerics;

using System.Runtime.Serialization;

namespace PrimalEditor.Components

{

DataContract

class Transform : Component

{

private Vector3 _position;

DataMember

public Vector3 Position

{

get => _position;

set

{

if (_position != value)

{

_position = value;

OnPropertyChanged(nameof(Position));

}

}

}

private Vector3 _rotation;

DataMember

public Vector3 Rotation

{

get => _rotation;

set

{

if (_rotation != value)

{

_rotation = value;

OnPropertyChanged(nameof(Rotation));

}

}

}

private Vector3 _scale;

DataMember

public Vector3 Scale

{

get => _scale;

set

{

if (_scale != value)

{

_scale = value;

OnPropertyChanged(nameof(Scale));

}

}

}

public override IMSComponent GetMultiselectionComponent(MSEntity msEntity) => new MSTransform(msEntity);

public override void WriteToBinary(BinaryWriter bw)

{

bw.Write(_position.X); bw.Write(_position.Y); bw.Write((_position.Z));

bw.Write(_rotation.X); bw.Write(_rotation.Y); bw.Write((_rotation.Z));

bw.Write(_scale.X); bw.Write(_scale.Y); bw.Write((_scale.Z));

}

public Transform(GameEntity owner) : base(owner)

{

}

}

sealed class MSTransform : MSComponent<Transform>

{

private float? _posX;

DataMember

public float? PosX

{

get => _posX;

set

{

if (!_posX.IsTheSameAs(value))

{

_posX = value;

OnPropertyChanged(nameof(PosX));

}

}

}

private float? _posY;

DataMember

public float? PosY

{

get => _posY;

set

{

if (!_posY.IsTheSameAs(value))

{

_posY = value;

OnPropertyChanged(nameof(PosY));

}

}

}

private float? _posZ;

DataMember

public float? PosZ

{

get => _posZ;

set

{

if (!_posZ.IsTheSameAs(value))

{

_posZ = value;

OnPropertyChanged(nameof(PosZ));

}

}

}

private float? _rotX;

DataMember

public float? RotX

{

get => _rotX;

set

{

if (!_rotY.IsTheSameAs(value))

{

_rotY = value;

OnPropertyChanged(nameof(RotX));

}

}

}

private float? _rotY;

DataMember

public float? RotY

{

get => _rotY;

set

{

if (!_rotY.IsTheSameAs(value))

{

_rotY = value;

OnPropertyChanged(nameof(RotY));

}

}

}

private float? _rotZ;

DataMember

public float? RotZ

{

get => _rotZ;

set

{

if (!_rotZ.IsTheSameAs(value))

{

_rotZ = value;

OnPropertyChanged(nameof(RotZ));

}

}

}

private float? _scaleX;

DataMember

public float? ScaleX

{

get => _scaleX;

set

{

if (!_scaleX.IsTheSameAs(value))

{

_scaleX = value;

OnPropertyChanged(nameof(ScaleX));

}

}

}

private float? _scaleY;

DataMember

public float? ScaleY

{

get => _scaleY;

set

{

if (!_scaleX.IsTheSameAs(value))

{

_scaleX = value;

OnPropertyChanged(nameof(ScaleY));

}

}

}

private float? _scaleZ;

DataMember

public float? ScaleZ

{

get => _scaleZ;

set

{

if (!_scaleZ.IsTheSameAs(value))

{

_scaleZ = value;

OnPropertyChanged(nameof(ScaleZ));

}

}

}

protected override bool UpdateComponents(string propertyName)

{

switch (propertyName)

{

case nameof(PosX):

case nameof(PosY):

case nameof(PosZ):

SelectedComponents.ForEach(c => c.Position = new Vector3(_posX ?? c.Position.X, _posY ?? c.Position.Y, _posZ ?? c.Position.Z));

return true;

case nameof(RotX):

case nameof(RotY):

case nameof(RotZ):

SelectedComponents.ForEach(c => c.Rotation = new Vector3(_posX ?? c.Rotation.X, _posY ?? c.Rotation.Y, _posZ ?? c.Rotation.Z));

return true;

case nameof(ScaleX):

case nameof(ScaleY):

case nameof(ScaleZ):

SelectedComponents.ForEach(c => c.Scale = new Vector3(_posX ?? c.Scale.X, _posY ?? c.Scale.Y, _posZ ?? c.Scale.Z));

return true;

}

return false;

}

protected override bool UpdateMSComponent()

{

PosX = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Position.X));

PosY = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Position.Y));

PosZ = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Position.Z));

RotX = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Rotation.X));

RotX = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Rotation.Y));

RotX = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Rotation.Z));

ScaleX = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Scale.X));

ScaleY = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Scale.Y));

ScaleZ = MSEntity.GetMixedValue(SelectedComponents, new Func<Transform, float>(x => x.Scale.Z));

return true;

}

public MSTransform(MSEntity msEntity) : base(msEntity)

{

Refresh();

}

}

}

相关推荐
zwjapple5 小时前
docker-compose一键部署全栈项目。springboot后端,react前端
前端·spring boot·docker
枯萎穿心攻击5 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
像风一样自由20207 小时前
HTML与JavaScript:构建动态交互式Web页面的基石
前端·javascript·html
aiprtem8 小时前
基于Flutter的web登录设计
前端·flutter
浪裡遊8 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
why技术8 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
GISer_Jing8 小时前
0704-0706上海,又聚上了
前端·新浪微博
止观止8 小时前
深入探索 pnpm:高效磁盘利用与灵活的包管理解决方案
前端·pnpm·前端工程化·包管理器
whale fall8 小时前
npm install安装的node_modules是什么
前端·npm·node.js
烛阴8 小时前
简单入门Python装饰器
前端·python