Fix MathUtils.LerpVector2, add cameras.
This commit is contained in:
@@ -52,6 +52,17 @@ namespace DaggerFramework.Rendering
|
|||||||
Raylib.EndDrawing();
|
Raylib.EndDrawing();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void BeginCamera2d(Vector2 offset, Vector2 target, float rotation, float zoom)
|
||||||
|
{
|
||||||
|
var camera = new Camera2D(offset, target, rotation, zoom);
|
||||||
|
Raylib.BeginMode2D(camera);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void EndCamera2d()
|
||||||
|
{
|
||||||
|
Raylib.EndMode2D();
|
||||||
|
}
|
||||||
|
|
||||||
public override void ClearBackground(Color color)
|
public override void ClearBackground(Color color)
|
||||||
{
|
{
|
||||||
Raylib.ClearBackground(DaggerColorToRaylibColor(color));
|
Raylib.ClearBackground(DaggerColorToRaylibColor(color));
|
||||||
|
|||||||
@@ -58,6 +58,10 @@ namespace DaggerFramework.Rendering
|
|||||||
/// Ends rendering of the frame.
|
/// Ends rendering of the frame.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract void EndFrame();
|
public abstract void EndFrame();
|
||||||
|
|
||||||
|
public abstract void BeginCamera2d(Vector2 offset, Vector2 target, float rotation, float zoom);
|
||||||
|
public abstract void EndCamera2d();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Clears the render canvas and sets a background color.
|
/// Clears the render canvas and sets a background color.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -166,6 +166,17 @@ namespace DaggerFramework.Rendering
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void BeginCamera2d(Vector2 offset, Vector2 target, float rotation, float zoom)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void EndCamera2d()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private GL _gl;
|
private GL _gl;
|
||||||
private Glfw _glfw;
|
private Glfw _glfw;
|
||||||
private unsafe WindowHandle* _windowHandle;
|
private unsafe WindowHandle* _windowHandle;
|
||||||
|
|||||||
25
DaggerFramework/Source/SceneGraph/Camera2d.cs
Normal file
25
DaggerFramework/Source/SceneGraph/Camera2d.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
|
||||||
|
namespace DaggerFramework.SceneGraph;
|
||||||
|
|
||||||
|
public class Camera2d : Entity2d
|
||||||
|
{
|
||||||
|
public Vector2 Offset { get; set; }
|
||||||
|
public float Zoom { get; set; } = 1f;
|
||||||
|
public bool Current
|
||||||
|
{
|
||||||
|
get => _current; set
|
||||||
|
{
|
||||||
|
_current = value;
|
||||||
|
Layer?.UpdateCurrentCamera();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnStart()
|
||||||
|
{
|
||||||
|
base.OnStart();
|
||||||
|
Offset = Renderer.WindowSize / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool _current;
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using DaggerFramework.Audio;
|
using DaggerFramework.Audio;
|
||||||
|
using DaggerFramework.Rendering;
|
||||||
|
|
||||||
namespace DaggerFramework.SceneGraph
|
namespace DaggerFramework.SceneGraph
|
||||||
{
|
{
|
||||||
@@ -7,6 +8,7 @@ namespace DaggerFramework.SceneGraph
|
|||||||
public EntityLayer Layer { get; set; }
|
public EntityLayer Layer { get; set; }
|
||||||
public InputHandler Input => Layer.Scene.Input;
|
public InputHandler Input => Layer.Scene.Input;
|
||||||
public AudioBackend Audio => Layer.Scene.Audio;
|
public AudioBackend Audio => Layer.Scene.Audio;
|
||||||
|
public Renderer Renderer => Layer.Scene.Renderer;
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
|
|
||||||
public void Start() => OnStart();
|
public void Start() => OnStart();
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
using DaggerFramework.Rendering;
|
using DaggerFramework.Rendering;
|
||||||
|
using DaggerFramework.Utils;
|
||||||
|
|
||||||
namespace DaggerFramework.SceneGraph
|
namespace DaggerFramework.SceneGraph
|
||||||
{
|
{
|
||||||
public class EntityLayer : Layer
|
public class EntityLayer : Layer
|
||||||
{
|
{
|
||||||
public List<Entity> Entities { get => _entities; }
|
public List<Entity> Entities { get => _entities; }
|
||||||
|
public Camera2d CurrentCamera { get; set; }
|
||||||
|
|
||||||
public EntityLayer(List<Entity> entities)
|
public EntityLayer(List<Entity> entities)
|
||||||
{
|
{
|
||||||
_entities = entities;
|
_entities = entities;
|
||||||
@@ -15,11 +18,36 @@ namespace DaggerFramework.SceneGraph
|
|||||||
_entities = new List<Entity>();
|
_entities = new List<Entity>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateCurrentCamera()
|
||||||
|
{
|
||||||
|
if (_cameraEntities.Count == 1)
|
||||||
|
{
|
||||||
|
CurrentCamera = _cameraEntities[0];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var camera in _cameraEntities)
|
||||||
|
{
|
||||||
|
if (camera.Current) CurrentCamera = camera;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool AddEntity(Entity entity)
|
public bool AddEntity(Entity entity)
|
||||||
{
|
{
|
||||||
entity.Id = Entities.Count;
|
entity.Id = Entities.Count;
|
||||||
entity.Layer = this;
|
entity.Layer = this;
|
||||||
|
|
||||||
|
if (entity is Camera2d camera2d)
|
||||||
|
{
|
||||||
|
_cameraEntities.Add(camera2d);
|
||||||
|
UpdateCurrentCamera();
|
||||||
|
}
|
||||||
|
|
||||||
Entities.Add(entity);
|
Entities.Add(entity);
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,8 +58,9 @@ namespace DaggerFramework.SceneGraph
|
|||||||
|
|
||||||
protected override void OnStart()
|
protected override void OnStart()
|
||||||
{
|
{
|
||||||
foreach (var entity in _entities)
|
for (int i = 0; i < _entities.Count; i++)
|
||||||
{
|
{
|
||||||
|
var entity = _entities[i];
|
||||||
entity.Layer = this;
|
entity.Layer = this;
|
||||||
entity.Start();
|
entity.Start();
|
||||||
}
|
}
|
||||||
@@ -45,14 +74,38 @@ namespace DaggerFramework.SceneGraph
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnBeginDraw(Renderer renderer)
|
||||||
|
{
|
||||||
|
var hasCamera = CurrentCamera != null;
|
||||||
|
if (hasCamera)
|
||||||
|
{
|
||||||
|
renderer.BeginCamera2d(CurrentCamera.Offset, CurrentCamera.Position, 0f, CurrentCamera.Zoom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnEndDraw(Renderer renderer)
|
||||||
|
{
|
||||||
|
var hasCamera = CurrentCamera != null;
|
||||||
|
if (hasCamera)
|
||||||
|
{
|
||||||
|
renderer.EndCamera2d();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected override void OnDraw(Renderer renderer)
|
protected override void OnDraw(Renderer renderer)
|
||||||
{
|
{
|
||||||
foreach (IDrawable drawable in _entities)
|
// TODO: can be done more efficiently, needs rendering redesign.
|
||||||
|
foreach (var entity in _entities)
|
||||||
|
{
|
||||||
|
if (entity is IDrawable drawable)
|
||||||
{
|
{
|
||||||
drawable.Draw(renderer);
|
drawable.Draw(renderer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private List<Entity> _entities;
|
private List<Entity> _entities;
|
||||||
|
private List<Camera2d> _cameraEntities = new();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,7 +9,9 @@ namespace DaggerFramework.SceneGraph
|
|||||||
public InputHandler Input { get; set; }
|
public InputHandler Input { get; set; }
|
||||||
public ResourceManager ResourceManager => Scene.ResourceManager;
|
public ResourceManager ResourceManager => Scene.ResourceManager;
|
||||||
|
|
||||||
|
public void BeginDraw(Renderer renderer) => OnBeginDraw(renderer);
|
||||||
public void Draw(Renderer renderer) => OnDraw(renderer);
|
public void Draw(Renderer renderer) => OnDraw(renderer);
|
||||||
|
public void EndDraw(Renderer renderer) => OnEndDraw(renderer);
|
||||||
|
|
||||||
public void Start() => OnStart();
|
public void Start() => OnStart();
|
||||||
public void Update(double dt) => OnUpdate(dt);
|
public void Update(double dt) => OnUpdate(dt);
|
||||||
@@ -18,6 +20,8 @@ namespace DaggerFramework.SceneGraph
|
|||||||
protected virtual void OnStart() { }
|
protected virtual void OnStart() { }
|
||||||
protected virtual void OnUpdate(double dt) { }
|
protected virtual void OnUpdate(double dt) { }
|
||||||
protected virtual void OnInput(InputHandler input) { }
|
protected virtual void OnInput(InputHandler input) { }
|
||||||
|
protected abstract void OnBeginDraw(Renderer renderer);
|
||||||
protected abstract void OnDraw(Renderer renderer);
|
protected abstract void OnDraw(Renderer renderer);
|
||||||
|
protected abstract void OnEndDraw(Renderer renderer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,9 @@ namespace DaggerFramework.SceneGraph
|
|||||||
|
|
||||||
foreach (var layer in _layers.Values)
|
foreach (var layer in _layers.Values)
|
||||||
{
|
{
|
||||||
|
layer.BeginDraw(_renderer);
|
||||||
layer.Draw(_renderer);
|
layer.Draw(_renderer);
|
||||||
|
layer.EndDraw(_renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer.EndFrame();
|
Renderer.EndFrame();
|
||||||
@@ -85,7 +87,5 @@ namespace DaggerFramework.SceneGraph
|
|||||||
private AudioBackend _audioBackend;
|
private AudioBackend _audioBackend;
|
||||||
private InputHandler _input;
|
private InputHandler _input;
|
||||||
private ResourceManager _resourceManager;
|
private ResourceManager _resourceManager;
|
||||||
|
|
||||||
private bool _inputDirty;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,16 @@ namespace DaggerFramework.SceneGraph
|
|||||||
_controller.Update(dt, Input);
|
_controller.Update(dt, Input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnBeginDraw(Renderer renderer)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnEndDraw(Renderer renderer)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
private ImGuiController _controller;
|
private ImGuiController _controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace DaggerFramework
|
|||||||
public static Vector2 LerpVector2(Vector2 v1, Vector2 v2, double t)
|
public static Vector2 LerpVector2(Vector2 v1, Vector2 v2, double t)
|
||||||
{
|
{
|
||||||
var x = Lerp(v1.X, v2.X, t);
|
var x = Lerp(v1.X, v2.X, t);
|
||||||
var y = Lerp(v1.X, v2.Y, t);
|
var y = Lerp(v1.Y, v2.Y, t);
|
||||||
|
|
||||||
return new Vector2(x, y);
|
return new Vector2(x, y);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class TestGame : Game
|
|||||||
Size = new Vector2(1280, 720)
|
Size = new Vector2(1280, 720)
|
||||||
}, new RendererSettings()
|
}, new RendererSettings()
|
||||||
{
|
{
|
||||||
UseVSync = false
|
UseVSync = true
|
||||||
});
|
});
|
||||||
|
|
||||||
_audioBackend.Initialize();
|
_audioBackend.Initialize();
|
||||||
|
|||||||
@@ -8,6 +8,14 @@ public class TestPlayer : RectangleShape2d
|
|||||||
{
|
{
|
||||||
base.OnStart();
|
base.OnStart();
|
||||||
Color = Color.Cyan;
|
Color = Color.Cyan;
|
||||||
|
_logger.Echo("OnStart");
|
||||||
|
|
||||||
|
_camera = new Camera2d()
|
||||||
|
{
|
||||||
|
Current = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
Layer.AddEntity(_camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnUpdate(double dt)
|
protected override void OnUpdate(double dt)
|
||||||
@@ -19,7 +27,11 @@ public class TestPlayer : RectangleShape2d
|
|||||||
|
|
||||||
var velocity = Input.GetInputDirection("left", "right", "up", "down") * _speed;
|
var velocity = Input.GetInputDirection("left", "right", "up", "down") * _speed;
|
||||||
Position += velocity * (float)dt;
|
Position += velocity * (float)dt;
|
||||||
|
|
||||||
|
_camera.Position = MathUtils.LerpVector2(_camera.Position, Position, dt * 5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Logger _logger = new(nameof(TestPlayer));
|
||||||
private float _speed = 200f;
|
private float _speed = 200f;
|
||||||
|
private Camera2d _camera;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user