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.
This commit is contained in:
Relintai 2025-02-23 10:36:14 +01:00
parent 6bb0a96196
commit a7a73b1081
2 changed files with 38 additions and 8 deletions

View File

@ -369,10 +369,21 @@ void Renderer::draw_mesh_3d_textured(const Ref<Mesh> &p_mesh, const Ref<Texture>
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() {

View File

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