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

}

}

}

相关推荐
10年前端老司机19 分钟前
Next.js+LangGraph.js+ 简历工具AI Agent完整落地
前端·langchain·agent
IT_陈寒5 小时前
Java中equals方法比了个寂寞?原来这才是正确的重写姿势
前端·人工智能·后端
默_笙5 小时前
🚓 分诊台与拆题术:让 RAG 学会判断和规划
前端·javascript
CopyCode5 小时前
用 AI 迁项目有多爽?我把 Webpack 迁 Vite 的全过程记下来了
前端·架构
去伪存真5 小时前
Electron 自动化发布指南:GitHub Actions 跨平台打包全纪录
前端·electron
计算机魔术师5 小时前
OpenAI智能体失控闯进美国政府网站,53张用户图片外泄背后
前端
颜进强5 小时前
14 · NestJS ExecutionContext 执行上下文:守卫、拦截器、过滤器拿到的"同一个 context",为什么能力不一样?
前端·后端·ai编程
程序员Flycan5 小时前
🚀 跨域终结者:前端代理服务器(Proxy)原理解析与配置总结
前端
怕浪猫5 小时前
顶级模型一句话,AI 写出了能玩的 QQ飞车
前端·面试·github
huakoh5 小时前
MCP 报错分不清?先看响应里是 result 还是 error
前端