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();

}

}

}

相关推荐
JeffongTan4 小时前
在LWC中镶嵌VF Page获取用户IP
前端·javascript·salesforce
点心的游戏开发世界4 小时前
GDScript 入门笔记(十一):Lambda 与匿名函数
开发语言·笔记·游戏引擎·godot
陆枫Larry6 小时前
Astro 是什么
前端
是立不是利7 小时前
写给设计师的 CSS 博客美学指南
前端·css
默_笙8 小时前
🏝 Docker 就是"房地产开发":从施工图纸到小区物业的容器化指南
前端·javascript
计算机魔术师8 小时前
Rohan Paul 谈用时间跨度衡量智能体能力,并引用 OpenAI 自动化研究实习生里程碑
前端
kyriewen8 小时前
我手写了个极简版 React Router——才搞懂 v6 为什么砍了这么多 API
前端·javascript·程序员
a1117768 小时前
Shirone 二次元博客主题 开源
前端·开源
IT_陈寒8 小时前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端
掘金酱8 小时前
【社区公告】致每一位掘友:关于这次调整, 想再说几句
前端·人工智能