refactor: monogame camera transform caching
This commit is contained in:
		@@ -5,7 +5,7 @@ using Engine.Core;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace Engine.Integration.MonoGame;
 | 
					namespace Engine.Integration.MonoGame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class MonoGameCamera2D : Behaviour, ICamera2D, IFirstFrameUpdate, IPreDraw
 | 
					public class MonoGameCamera2D : Behaviour, ICamera2D, IFirstFrameUpdate, ILastFrameUpdate, IPreDraw
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public Event<MonoGameCamera2D> OnMatrixTransformChanged { get; } = new();
 | 
					    public Event<MonoGameCamera2D> OnMatrixTransformChanged { get; } = new();
 | 
				
			||||||
    public Event<MonoGameCamera2D> OnViewportChanged { get; } = new();
 | 
					    public Event<MonoGameCamera2D> OnViewportChanged { get; } = new();
 | 
				
			||||||
@@ -56,7 +56,7 @@ public class MonoGameCamera2D : Behaviour, ICamera2D, IFirstFrameUpdate, IPreDra
 | 
				
			|||||||
        get => _zoom;
 | 
					        get => _zoom;
 | 
				
			||||||
        set
 | 
					        set
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            float newValue = Engine.Core.Math.Max(0.1f, value);
 | 
					            float newValue = Math.Max(0.1f, value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (_zoom == newValue)
 | 
					            if (_zoom == newValue)
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
@@ -84,22 +84,21 @@ public class MonoGameCamera2D : Behaviour, ICamera2D, IFirstFrameUpdate, IPreDra
 | 
				
			|||||||
        return screenPosition.Scale(EngineConverterExtensions.screenScale);
 | 
					        return screenPosition.Scale(EngineConverterExtensions.screenScale);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void LastActiveFrame() => Transform = null!;
 | 
				
			||||||
    public void FirstActiveFrame()
 | 
					    public void FirstActiveFrame()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Graphics = BehaviourController.UniverseObject.Universe.FindRequiredBehaviour<MonoGameWindowContainer>().Window.Graphics;
 | 
					        Graphics = BehaviourController.UniverseObject.Universe.FindRequiredBehaviour<MonoGameWindowContainer>().Window.Graphics;
 | 
				
			||||||
        Viewport = Graphics.GraphicsDevice.Viewport;
 | 
					        Viewport = Graphics.GraphicsDevice.Viewport;
 | 
				
			||||||
 | 
					        Transform = BehaviourController.GetRequiredBehaviour<ITransform2D>();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void PreDraw()
 | 
					    public void PreDraw()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        MatrixTransform =
 | 
					        MatrixTransform =
 | 
				
			||||||
            Matrix.CreateTranslation(new Vector3(-Position.X, Position.Y, 0f)) *
 | 
					            Matrix.CreateTranslation(new Vector3(-Position.X, Position.Y, 0f)) *
 | 
				
			||||||
            Matrix.CreateRotationZ(Rotation * Engine.Core.Math.DegreeToRadian) *
 | 
					            Matrix.CreateRotationZ(Rotation * Math.DegreeToRadian) *
 | 
				
			||||||
            Matrix.CreateScale(Transform.Scale.X.Max(Transform.Scale.Y)) *
 | 
					            Matrix.CreateScale(Transform.Scale.X.Max(Transform.Scale.Y)) *
 | 
				
			||||||
            Matrix.CreateScale(Zoom) *
 | 
					            Matrix.CreateScale(Zoom) *
 | 
				
			||||||
            Matrix.CreateTranslation(new Vector3(_viewport.Width * .5f, _viewport.Height * .5f, 0f));
 | 
					            Matrix.CreateTranslation(new Vector3(_viewport.Width * .5f, _viewport.Height * .5f, 0f));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    protected sealed override void InitializeInternal() => Transform = BehaviourController.GetRequiredBehaviour<ITransform2D>();
 | 
					 | 
				
			||||||
    protected sealed override void FinalizeInternal() => Transform = null!;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,12 +53,6 @@ public class MonoGameCamera3D : Behaviour, ICamera3D, IFirstFrameUpdate, ILastFr
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Vector3D Position
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        get => Transform.Position;
 | 
					 | 
				
			||||||
        set => Transform.Position = value;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public Viewport Viewport
 | 
					    public Viewport Viewport
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        get => _viewport;
 | 
					        get => _viewport;
 | 
				
			||||||
@@ -115,12 +109,6 @@ public class MonoGameCamera3D : Behaviour, ICamera3D, IFirstFrameUpdate, ILastFr
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Core.Quaternion Rotation
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        get => Transform.Rotation;
 | 
					 | 
				
			||||||
        set => Transform.Rotation = value;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // TODO This causes delay since OnPreDraw calls assuming this is called in in Update 
 | 
					    // TODO This causes delay since OnPreDraw calls assuming this is called in in Update 
 | 
				
			||||||
    public Ray3D ScreenToWorldRay(Vector2D screenPosition)
 | 
					    public Ray3D ScreenToWorldRay(Vector2D screenPosition)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -164,7 +152,7 @@ public class MonoGameCamera3D : Behaviour, ICamera3D, IFirstFrameUpdate, ILastFr
 | 
				
			|||||||
        Vector3 forward = Vector3.Normalize(Transform.Forward.ToVector3());
 | 
					        Vector3 forward = Vector3.Normalize(Transform.Forward.ToVector3());
 | 
				
			||||||
        Vector3 up = Vector3.Normalize(Transform.Up.ToVector3());
 | 
					        Vector3 up = Vector3.Normalize(Transform.Up.ToVector3());
 | 
				
			||||||
        Vector3 right = Vector3.Normalize(Transform.Right.ToVector3());
 | 
					        Vector3 right = Vector3.Normalize(Transform.Right.ToVector3());
 | 
				
			||||||
        Vector3 position = Position.ToVector3();
 | 
					        Vector3 position = Transform.Position.ToVector3();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        View = new Matrix(
 | 
					        View = new Matrix(
 | 
				
			||||||
            right.X, up.X, forward.X, 0,
 | 
					            right.X, up.X, forward.X, 0,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user