Fix MathUtils.LerpVector2, add cameras.
This commit is contained in:
@@ -52,6 +52,17 @@ namespace DaggerFramework.Rendering
|
||||
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)
|
||||
{
|
||||
Raylib.ClearBackground(DaggerColorToRaylibColor(color));
|
||||
|
||||
@@ -58,6 +58,10 @@ namespace DaggerFramework.Rendering
|
||||
/// Ends rendering of the frame.
|
||||
/// </summary>
|
||||
public abstract void EndFrame();
|
||||
|
||||
public abstract void BeginCamera2d(Vector2 offset, Vector2 target, float rotation, float zoom);
|
||||
public abstract void EndCamera2d();
|
||||
|
||||
/// <summary>
|
||||
/// Clears the render canvas and sets a background color.
|
||||
/// </summary>
|
||||
|
||||
@@ -166,6 +166,17 @@ namespace DaggerFramework.Rendering
|
||||
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 Glfw _glfw;
|
||||
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.Rendering;
|
||||
|
||||
namespace DaggerFramework.SceneGraph
|
||||
{
|
||||
@@ -7,6 +8,7 @@ namespace DaggerFramework.SceneGraph
|
||||
public EntityLayer Layer { get; set; }
|
||||
public InputHandler Input => Layer.Scene.Input;
|
||||
public AudioBackend Audio => Layer.Scene.Audio;
|
||||
public Renderer Renderer => Layer.Scene.Renderer;
|
||||
public int Id { get; set; }
|
||||
|
||||
public void Start() => OnStart();
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
using DaggerFramework.Rendering;
|
||||
using DaggerFramework.Utils;
|
||||
|
||||
namespace DaggerFramework.SceneGraph
|
||||
{
|
||||
public class EntityLayer : Layer
|
||||
{
|
||||
public List<Entity> Entities { get => _entities; }
|
||||
public Camera2d CurrentCamera { get; set; }
|
||||
|
||||
public EntityLayer(List<Entity> entities)
|
||||
{
|
||||
_entities = entities;
|
||||
@@ -15,11 +18,36 @@ namespace DaggerFramework.SceneGraph
|
||||
_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)
|
||||
{
|
||||
entity.Id = Entities.Count;
|
||||
entity.Layer = this;
|
||||
|
||||
if (entity is Camera2d camera2d)
|
||||
{
|
||||
_cameraEntities.Add(camera2d);
|
||||
UpdateCurrentCamera();
|
||||
}
|
||||
|
||||
Entities.Add(entity);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -30,8 +58,9 @@ namespace DaggerFramework.SceneGraph
|
||||
|
||||
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.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)
|
||||
{
|
||||
foreach (IDrawable drawable in _entities)
|
||||
// TODO: can be done more efficiently, needs rendering redesign.
|
||||
foreach (var entity in _entities)
|
||||
{
|
||||
drawable.Draw(renderer);
|
||||
if (entity is IDrawable drawable)
|
||||
{
|
||||
drawable.Draw(renderer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<Entity> _entities;
|
||||
private List<Camera2d> _cameraEntities = new();
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,9 @@ namespace DaggerFramework.SceneGraph
|
||||
public InputHandler Input { get; set; }
|
||||
public ResourceManager ResourceManager => Scene.ResourceManager;
|
||||
|
||||
public void BeginDraw(Renderer renderer) => OnBeginDraw(renderer);
|
||||
public void Draw(Renderer renderer) => OnDraw(renderer);
|
||||
public void EndDraw(Renderer renderer) => OnEndDraw(renderer);
|
||||
|
||||
public void Start() => OnStart();
|
||||
public void Update(double dt) => OnUpdate(dt);
|
||||
@@ -18,6 +20,8 @@ namespace DaggerFramework.SceneGraph
|
||||
protected virtual void OnStart() { }
|
||||
protected virtual void OnUpdate(double dt) { }
|
||||
protected virtual void OnInput(InputHandler input) { }
|
||||
protected abstract void OnBeginDraw(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)
|
||||
{
|
||||
layer.BeginDraw(_renderer);
|
||||
layer.Draw(_renderer);
|
||||
layer.EndDraw(_renderer);
|
||||
}
|
||||
|
||||
Renderer.EndFrame();
|
||||
@@ -85,7 +87,5 @@ namespace DaggerFramework.SceneGraph
|
||||
private AudioBackend _audioBackend;
|
||||
private InputHandler _input;
|
||||
private ResourceManager _resourceManager;
|
||||
|
||||
private bool _inputDirty;
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,16 @@ namespace DaggerFramework.SceneGraph
|
||||
_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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace DaggerFramework
|
||||
public static Vector2 LerpVector2(Vector2 v1, Vector2 v2, double 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user