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

}

}

}

相关推荐
奋斗的小羊羊29 分钟前
HTML5关键知识点之多种视频编码工具的使用方法
前端·音视频·html5
前端呆猿36 分钟前
深入解析HTML5中的object-fit属性
前端·css·html5
再学一点就睡36 分钟前
实现大文件上传全流程详解(补偿版本)
前端·javascript·面试
你的人类朋友2 小时前
【Node&Vue】什么是ECMAScript?
前端·javascript·后端
路灯下的光2 小时前
用scss设计一下系统主题有什么方案吗
前端·css·scss
l_tian_tian_2 小时前
SpringClound——网关、服务保护和分布式事务
linux·服务器·前端
一只小风华~3 小时前
CSS @media 媒体查询
前端·css·媒体
shix .3 小时前
最近 | 黄淮教务 | 小工具合集
前端·javascript
John_ToDebug4 小时前
Chrome 内置扩展 vs WebUI:浏览器内核开发中的选择与实践
前端·c++·chrome
烛阴4 小时前
解锁动态键:TypeScript 索引签名完全指南
前端·javascript·typescript