wpf游戏引擎前端的Transform.cs实现

发布于:2025-06-12 ⋅ 阅读:(22) ⋅ 点赞:(0)

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


        }

    }


}