feat: added basic window, input & drawing
This commit is contained in:
86
Platforms/Desktop/Engine.Integration.SDL3/Sdl3Camera2D.cs
Normal file
86
Platforms/Desktop/Engine.Integration.SDL3/Sdl3Camera2D.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
using Engine.Core;
|
||||
|
||||
namespace Engine.Integration.SDL3;
|
||||
|
||||
public class Sdl3Camera2D : Behaviour, ICamera2D, IFirstFrameUpdate, ILastFrameUpdate, IPreDraw
|
||||
{
|
||||
public Event<Sdl3Camera2D> OnViewMatrixChanged { get; } = new();
|
||||
public Event<Sdl3Camera2D> OnProjectionMatrixChanged { get; } = new();
|
||||
public Event<Sdl3Camera2D> OnViewportChanged { get; } = new();
|
||||
public Event<Sdl3Camera2D> OnZoomChanged { get; } = new();
|
||||
|
||||
private IWindow window = null!;
|
||||
public ITransform2D Transform { get; private set; } = null!;
|
||||
|
||||
public Matrix4x4 ProjectionMatrix
|
||||
{
|
||||
get;
|
||||
private set
|
||||
{
|
||||
if (field == value)
|
||||
return;
|
||||
|
||||
field = value;
|
||||
OnProjectionMatrixChanged.Invoke(this);
|
||||
}
|
||||
} = Matrix4x4.Identity;
|
||||
|
||||
public Matrix4x4 ViewMatrix
|
||||
{
|
||||
get;
|
||||
private set
|
||||
{
|
||||
if (field == value)
|
||||
return;
|
||||
|
||||
field = value;
|
||||
OnViewMatrixChanged.Invoke(this);
|
||||
}
|
||||
} = Matrix4x4.Identity;
|
||||
|
||||
public float Zoom
|
||||
{
|
||||
get;
|
||||
set
|
||||
{
|
||||
float newValue = Math.Max(0.1f, value);
|
||||
|
||||
if (field == newValue)
|
||||
return;
|
||||
|
||||
field = newValue;
|
||||
OnZoomChanged.Invoke(this);
|
||||
}
|
||||
} = 1f;
|
||||
|
||||
// TODO This causes delay since OnPreDraw calls assuming this is called in in Update
|
||||
public Vector2D ScreenToWorldPosition(Vector2D screenPosition)
|
||||
{
|
||||
Vector2D worldPosition = Vector2D.Transform(screenPosition, Transform);
|
||||
return worldPosition;
|
||||
}
|
||||
|
||||
public Vector2D WorldToScreenPosition(Vector2D worldPosition)
|
||||
{
|
||||
Vector2D screenPosition = Vector2D.Transform(worldPosition, Transform);
|
||||
return screenPosition;
|
||||
}
|
||||
|
||||
public void LastActiveFrame() => Transform = null!;
|
||||
public void FirstActiveFrame()
|
||||
{
|
||||
window = BehaviourController.UniverseObject.Universe.FindRequiredBehaviour<IWindow>();
|
||||
Transform = BehaviourController.GetRequiredBehaviour<ITransform2D>();
|
||||
}
|
||||
|
||||
public void PreDraw()
|
||||
{
|
||||
ProjectionMatrix = Matrix4x4.CreateOrthographicViewCentered(window.Size.X, window.Size.Y);
|
||||
|
||||
ViewMatrix = Matrix4x4.Identity
|
||||
.ApplyScale(Transform.Scale.X.Max(Transform.Scale.Y))
|
||||
.ApplyScale(Zoom)
|
||||
.ApplyRotationZ(-Transform.Rotation * Math.DegreeToRadian)
|
||||
.ApplyTranslation(new Vector3D(-Transform.Position.X, -Transform.Position.Y, 0f));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user