From 8aab1132b693e333d1115842f651999133bc998b Mon Sep 17 00:00:00 2001 From: dnesov Date: Mon, 25 Sep 2023 18:44:35 +0200 Subject: [PATCH] Add pivot offset for rotations. --- .../Source/Rendering/RaylibRenderer.cs | 7 +++--- DaggerFramework/Source/Rendering/Renderer.cs | 3 ++- .../Source/Rendering/StandardRenderer.cs | 2 +- .../Source/SceneGraph/Entities/Drawable2d.cs | 4 +++- .../Source/SceneGraph/Entities/Entity2d.cs | 1 + .../Source/SceneGraph/Entities/Particles2d.cs | 2 +- .../SceneGraph/Entities/RectangleShape2d.cs | 1 + TestGame/TestPlayer.cs | 24 +++++++++++-------- 8 files changed, 27 insertions(+), 17 deletions(-) diff --git a/DaggerFramework/Source/Rendering/RaylibRenderer.cs b/DaggerFramework/Source/Rendering/RaylibRenderer.cs index a65d8f9..adc5b10 100644 --- a/DaggerFramework/Source/Rendering/RaylibRenderer.cs +++ b/DaggerFramework/Source/Rendering/RaylibRenderer.cs @@ -78,9 +78,10 @@ namespace DaggerFramework.Rendering Raylib.DrawCircle((int)_position.X, (int)_position.Y, radius, DaggerColorToRaylibColor(color)); } - public override void SetTransform(Vector2 position, float rotation) + public override void SetTransform(Vector2 position, Vector2 offset, float rotation = 0) { _position = position; + _offset = offset; _rotation = rotation; } @@ -153,7 +154,7 @@ namespace DaggerFramework.Rendering y = _position.Y, width = size.X, height = size.Y - }, Vector2.Zero, _rotation, DaggerColorToRaylibColor(color)); + }, _offset, _rotation, DaggerColorToRaylibColor(color)); } public override void DrawDebugText(string text, int fontSize, Color color) @@ -203,7 +204,7 @@ namespace DaggerFramework.Rendering private List _texturePool = new(); private List _fontPool = new(); - private Vector2 _position; + private Vector2 _position, _offset; private float _rotation; private Vector2 _windowSize; } diff --git a/DaggerFramework/Source/Rendering/Renderer.cs b/DaggerFramework/Source/Rendering/Renderer.cs index 149eff5..cfa6881 100644 --- a/DaggerFramework/Source/Rendering/Renderer.cs +++ b/DaggerFramework/Source/Rendering/Renderer.cs @@ -82,8 +82,9 @@ namespace DaggerFramework.Rendering /// Sets transforms for the next draw operation. /// /// Global transform position. + /// Local offset point around which shapes will rotate. /// Rotation. - public abstract void SetTransform(Vector2 position, float rotation = 0.0f); + public abstract void SetTransform(Vector2 position, Vector2 offset, float rotation = 0.0f); /// /// Sets the transform for the next draw operation. /// diff --git a/DaggerFramework/Source/Rendering/StandardRenderer.cs b/DaggerFramework/Source/Rendering/StandardRenderer.cs index 4f38141..afe337e 100644 --- a/DaggerFramework/Source/Rendering/StandardRenderer.cs +++ b/DaggerFramework/Source/Rendering/StandardRenderer.cs @@ -102,7 +102,7 @@ namespace DaggerFramework.Rendering } /// - public override void SetTransform(Vector2 position, float rotation = 0) + public override void SetTransform(Vector2 position, Vector2 offset, float rotation = 0) { throw new NotImplementedException(); } diff --git a/DaggerFramework/Source/SceneGraph/Entities/Drawable2d.cs b/DaggerFramework/Source/SceneGraph/Entities/Drawable2d.cs index 591bf39..4ced39b 100644 --- a/DaggerFramework/Source/SceneGraph/Entities/Drawable2d.cs +++ b/DaggerFramework/Source/SceneGraph/Entities/Drawable2d.cs @@ -1,12 +1,14 @@ +using System.Numerics; using DaggerFramework.Rendering; namespace DaggerFramework.SceneGraph { public abstract class Drawable2d : Entity2d, IDrawable { + public Vector2 PivotOffset { get; set; } public void Draw(Renderer renderer) { - renderer.SetTransform(Position); + renderer.SetTransform(Position, PivotOffset, Rotation); OnDraw(renderer); } diff --git a/DaggerFramework/Source/SceneGraph/Entities/Entity2d.cs b/DaggerFramework/Source/SceneGraph/Entities/Entity2d.cs index 1262420..93b2ffd 100644 --- a/DaggerFramework/Source/SceneGraph/Entities/Entity2d.cs +++ b/DaggerFramework/Source/SceneGraph/Entities/Entity2d.cs @@ -5,5 +5,6 @@ namespace DaggerFramework.SceneGraph public class Entity2d : Entity { public Vector2 Position { get; set; } + public float Rotation { get; set; } } } \ No newline at end of file diff --git a/DaggerFramework/Source/SceneGraph/Entities/Particles2d.cs b/DaggerFramework/Source/SceneGraph/Entities/Particles2d.cs index 81512fc..2df7250 100644 --- a/DaggerFramework/Source/SceneGraph/Entities/Particles2d.cs +++ b/DaggerFramework/Source/SceneGraph/Entities/Particles2d.cs @@ -31,7 +31,7 @@ namespace DaggerFramework.SceneGraph var scale = MathUtils.Lerp(_settings.ScaleEnd, _settings.ScaleBegin, t); var color = MathUtils.LerpColor(_settings.ColorEnd, _settings.ColorBegin, t); - renderer.SetTransform(particle.Position, particle.Rotation); + renderer.SetTransform(particle.Position, Vector2.Zero, particle.Rotation); renderer.DrawRectangle(Vector2.One * scale, color); } } diff --git a/DaggerFramework/Source/SceneGraph/Entities/RectangleShape2d.cs b/DaggerFramework/Source/SceneGraph/Entities/RectangleShape2d.cs index 4a8a07d..d8079ee 100644 --- a/DaggerFramework/Source/SceneGraph/Entities/RectangleShape2d.cs +++ b/DaggerFramework/Source/SceneGraph/Entities/RectangleShape2d.cs @@ -9,6 +9,7 @@ public class RectangleShape2d : Drawable2d public Color Color { get; set; } = Color.White; public override void OnDraw(Renderer renderer) { + PivotOffset = Size / 2; renderer.DrawRectangle(Size, Color); } } \ No newline at end of file diff --git a/TestGame/TestPlayer.cs b/TestGame/TestPlayer.cs index 99c7c12..4926ed3 100644 --- a/TestGame/TestPlayer.cs +++ b/TestGame/TestPlayer.cs @@ -10,25 +10,29 @@ public class TestPlayer : RectangleShape2d Color = Color.Cyan; _logger.Echo("OnStart"); - _camera = new Camera2d() - { - Current = true, - }; + // _camera = new Camera2d() + // { + // Current = true, + // }; - Layer.AddEntity(_camera); + // Layer.AddEntity(_camera); } protected override void OnUpdate(double dt) { base.OnUpdate(dt); - var sprinting = Input.IsActionDown("sprint"); - _speed = sprinting ? 400f : 200f; + // var sprinting = Input.IsActionDown("sprint"); + // _speed = sprinting ? 400f : 200f; - var velocity = Input.GetInputDirection("left", "right", "up", "down") * _speed; - Position += velocity * (float)dt; + // var velocity = Input.GetInputDirection("left", "right", "up", "down") * _speed; + // Position += velocity * (float)dt; - _camera.Position = MathUtils.LerpVector2(_camera.Position, Position, dt * 5f); + // _camera.Position = MathUtils.LerpVector2(_camera.Position, Position, dt * 5f); + + var mousePos = Input.GetMousePosition(); + Position = MathUtils.LerpVector2(Position, mousePos, dt * 5f); + Rotation += (float)dt * 100f; } private Logger _logger = new(nameof(TestPlayer));