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