Fix MathUtils.LerpVector2, add cameras.

This commit is contained in:
2023-09-25 18:32:36 +02:00
parent 34c65be667
commit 6b5678cdb8
12 changed files with 139 additions and 7 deletions

View File

@@ -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));

View File

@@ -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>

View File

@@ -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;

View 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;
}

View File

@@ -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();

View File

@@ -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)
{ {
drawable.Draw(renderer); if (entity is IDrawable drawable)
{
drawable.Draw(renderer);
}
} }
} }
private List<Entity> _entities; private List<Entity> _entities;
private List<Camera2d> _cameraEntities = new();
} }
} }

View File

@@ -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);
} }
} }

View File

@@ -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;
} }
} }

View File

@@ -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;
} }

View File

@@ -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);
} }

View File

@@ -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();

View File

@@ -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;
} }