From a7a73b108116833724dcf387c6b0c7c7906bf0c5 Mon Sep 17 00:00:00 2001 From: Relintai Date: Sun, 23 Feb 2025 10:36:14 +0100 Subject: [PATCH] Simplifications and a small rework to the immediate renderer's 2d camera api. - Now camera_2d_projection_set_to_* helper methods won't mess with the model view matrices. - Added camera_2d_reset(). - Added helper methods to clear each matrix separately. - This also fixes a bug where the internal matrices were kept after a reset. --- sfw/render_immediate/renderer.cpp | 42 +++++++++++++++++++++++++------ sfw/render_immediate/renderer.h | 4 +++ 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/sfw/render_immediate/renderer.cpp b/sfw/render_immediate/renderer.cpp index 971a7ba..291bc60 100644 --- a/sfw/render_immediate/renderer.cpp +++ b/sfw/render_immediate/renderer.cpp @@ -369,10 +369,21 @@ void Renderer::draw_mesh_3d_textured(const Ref &p_mesh, const Ref camera_3d_pop_model_view_matrix(); } + void Renderer::camera_2d_bind() { RenderState::model_view_matrix_2d = _camera_2d_model_view_matrix; RenderState::projection_matrix_2d = _camera_2d_projection_matrix; } +void Renderer::camera_2d_reset() { + RenderState::model_view_matrix_2d = Transform2D(); + RenderState::projection_matrix_2d = Transform(); + + _camera_2d_model_view_matrix_stack.clear(); + _camera_2d_projection_matrix_stack.clear(); + + _camera_2d_projection_matrix = RenderState::projection_matrix_2d; + _camera_2d_model_view_matrix = RenderState::model_view_matrix_2d; +} Transform Renderer::camera_2d_get_current_projection_matrix() const { return _camera_2d_projection_matrix; @@ -398,6 +409,12 @@ void Renderer::camera_2d_pop_projection_matrix() { int Renderer::get_camera_2d_projection_matrix_stack_size() const { return _camera_2d_projection_matrix_stack.size(); } +void Renderer::camera_2d_projection_matrix_stack_clear() { + _camera_2d_projection_matrix_stack.clear(); + + _camera_2d_projection_matrix = Transform(); + RenderState::projection_matrix_2d = _camera_2d_projection_matrix; +} Transform2D Renderer::camera_2d_get_current_model_view_matrix() const { return _camera_2d_model_view_matrix; @@ -425,6 +442,12 @@ void Renderer::camera_2d_pop_model_view_matrix() { int Renderer::get_camera_2d_model_view_matrix_stack_size() const { return _camera_2d_model_view_matrix_stack.size(); } +void Renderer::camera_2d_model_view_matrix_stack_clear() { + _camera_2d_model_view_matrix_stack.clear(); + + _camera_2d_model_view_matrix = Transform2D(); + RenderState::model_view_matrix_2d = _camera_2d_model_view_matrix; +} void Renderer::camera_2d_projection_set_to_window() { Vector2 size = get_window_size(); @@ -434,10 +457,9 @@ void Renderer::camera_2d_projection_set_to_window() { //canvas_transform.scale(Vector3(2.0f / size.x, 2.0f / size.y, 1.0f)); canvas_transform.scale(Vector3(2.0f / size.x, -2.0f / size.y, 1.0f)); - RenderState::model_view_matrix_2d = Transform2D(); RenderState::projection_matrix_2d = canvas_transform; - - _camera_2d_model_view_matrix_stack.clear(); + _camera_2d_projection_matrix_stack.clear(); + _camera_2d_projection_matrix = canvas_transform; } void Renderer::camera_2d_projection_set_to_size(const Size2i &p_size) { @@ -446,10 +468,9 @@ void Renderer::camera_2d_projection_set_to_size(const Size2i &p_size) { //canvas_transform.scale(Vector3(2.0f / size.x, 2.0f / size.y, 1.0f)); canvas_transform.scale(Vector3(2.0f / p_size.x, -2.0f / p_size.y, 1.0f)); - RenderState::model_view_matrix_2d = Transform2D(); RenderState::projection_matrix_2d = canvas_transform; - - _camera_2d_model_view_matrix_stack.clear(); + _camera_2d_projection_matrix_stack.clear(); + _camera_2d_projection_matrix = canvas_transform; } void Renderer::camera_2d_projection_set_to_render_target() { @@ -460,10 +481,15 @@ void Renderer::camera_2d_projection_set_to_render_target() { //canvas_transform.scale(Vector3(2.0f / size.x, 2.0f / size.y, 1.0f)); canvas_transform.scale(Vector3(2.0f / size.x, -2.0f / size.y, 1.0f)); - RenderState::model_view_matrix_2d = Transform2D(); RenderState::projection_matrix_2d = canvas_transform; + _camera_2d_projection_matrix_stack.clear(); + _camera_2d_projection_matrix = canvas_transform; +} - _camera_2d_model_view_matrix_stack.clear(); +void Renderer::camera_2d_projection_set_to_transform(const Transform &p_transform) { + RenderState::projection_matrix_2d = p_transform; + _camera_2d_projection_matrix_stack.clear(); + _camera_2d_projection_matrix = p_transform; } void Renderer::camera_3d_bind() { diff --git a/sfw/render_immediate/renderer.h b/sfw/render_immediate/renderer.h index ef47029..37a4acb 100644 --- a/sfw/render_immediate/renderer.h +++ b/sfw/render_immediate/renderer.h @@ -70,20 +70,24 @@ public: //2D Camera API void camera_2d_bind(); + void camera_2d_reset(); Transform camera_2d_get_current_projection_matrix() const; void camera_2d_push_projection_matrix(const Transform &p_transform); void camera_2d_pop_projection_matrix(); int get_camera_2d_projection_matrix_stack_size() const; + void camera_2d_projection_matrix_stack_clear(); Transform2D camera_2d_get_current_model_view_matrix() const; void camera_2d_push_model_view_matrix(const Transform2D &p_transform_2d); void camera_2d_pop_model_view_matrix(); int get_camera_2d_model_view_matrix_stack_size() const; + void camera_2d_model_view_matrix_stack_clear(); void camera_2d_projection_set_to_window(); void camera_2d_projection_set_to_size(const Size2i &p_size); void camera_2d_projection_set_to_render_target(); + void camera_2d_projection_set_to_transform(const Transform &p_transform); //3D Camera API