Example #1
0
        public override void UpdateEntities(float dt)
        {
            if (!base.Changed())
            {
                return;
            }

            MovedMouseSinceStart = true;
            EditMovementDelta   += MovementRawDelta * dt;
            EditRotationDelta   += RotationDelta * dt;
            EditScaleDelta      += ScaleDelta * dt;

            for (var i = 0; i < ControlledEntities.Count; i++)
            {
                var entity            = ControlledEntities[i];
                var startingTransform = StartingTransforms[i];
                if (RotationDelta.Length() > Constants.Epsilon)
                {
                    var rotation = startingTransform.Rotation.ToRotator().ToFloat4() + EditRotationDelta;//transform.Rotation.ToRotator().ToFloat4();
                    if (AngleAlignment > 0)
                    {
                        rotation -= RyneMath.Mod(rotation, new Float4(AngleAlignment));
                    }
                    entity.Transform.Rotation = new Rotator(rotation).ToQuaternion();

                    if (SharedPivotRotationMode)
                    {
                        var vector = startingTransform.GetLocation() - SharedPivot;
                        // Unrotate with starting rotation
                        vector = startingTransform.Rotation.Inverse().RotateVector(vector);
                        // Rotate to new rotation
                        vector = entity.Transform.Rotation.RotateVector(vector);
                        entity.Transform.SetLocation(SharedPivot + vector);
                    }
                }

                if (MovementRawDelta.Length() > Constants.Epsilon)
                {
                    var position = startingTransform.Position + EditMovementDelta;
                    if (GridAlignment > 0)
                    {
                        position -= RyneMath.Mod(position, new Float4(GridAlignment));
                    }
                    entity.Transform.Position = position;
                }

                if (ScaleDelta.Length() > Constants.Epsilon)
                {
                    var scale = startingTransform.Scale + EditScaleDelta;
                    if (ScaleAlignment > 0)
                    {
                        scale -= RyneMath.Mod(scale, new Float4(ScaleAlignment));
                    }
                    entity.Transform.Scale = scale;
                }
            }

            OnEntitiesChanged?.Invoke();
        }