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

}

}

}

相关推荐
向宇it几秒前
【unity实战】简易的车辆控制系统
游戏·unity·c#·游戏引擎
用户479492835691524 分钟前
mcp是怎么和大模型进行交互的,有哪些交互方式
前端·人工智能
凤年徐33 分钟前
解锁网页魔法:零基础HTML通关秘籍
前端·javascript·css·前端框架·html·web
PineappleCoder36 分钟前
防抖 vs 节流:高频事件的 “性能优化双雄” 怎么用?
前端·javascript·面试
小old弟36 分钟前
🤔面试官问你:什么是高阶函数?举例说明用到过的...
前端
是你的小橘呀37 分钟前
从小区广场舞群聊,看懂前端 er 必懂的发布订阅模式
前端
margicCode38 分钟前
0-1搭建项目基本配置(eslint+prettier)到release-it发布
前端
ZzMemory40 分钟前
CSS 命名太乱?BEM 规范帮你一键搞定,代码清爽到飞起!
前端·css·面试
大道小路41 分钟前
Vue3 组件数据传输小全
前端·javascript·vue.js
初辰ge41 分钟前
pCameraH5 v2.0:轻量级 H5 相机插件全新升级,支持拍照、录像与自定义水印
前端·javascript