From e0bde10e936160ac07867607784f22935015a3cb Mon Sep 17 00:00:00 2001 From: Relintai Date: Sun, 31 Dec 2023 20:38:51 +0100 Subject: [PATCH] Added a central RenderState. Reworked Cameras to use it. This means that Camera classes are no longer needed in render_core. --- compile_linux.sh | 3 +- game_scene.cpp | 9 +- sfw/render_core/color_material.h | 10 +- sfw/render_core/colored_material.h | 94 ++++++------ sfw/render_core/render_state.cpp | 8 + sfw/render_core/render_state.h | 23 +++ sfw/render_core/texture_material.h | 8 +- sfw/render_core/texture_material_2d.h | 6 +- .../transparent_texture_material.h | 144 +++++++++--------- sfw/render_objects/camera_2d.cpp | 31 +++- sfw/render_objects/camera_2d.h | 11 +- sfw/render_objects/camera_3d.cpp | 62 +++++++- sfw/render_objects/camera_3d.h | 23 ++- sfw/render_objects/mesh_instance_2d.cpp | 38 ++--- sfw/render_objects/mesh_instance_3d.cpp | 38 ++--- sfw/render_objects/tile_map.cpp | 9 +- 16 files changed, 320 insertions(+), 197 deletions(-) create mode 100644 sfw/render_core/render_state.cpp create mode 100644 sfw/render_core/render_state.h diff --git a/compile_linux.sh b/compile_linux.sh index be6fe25..7908938 100755 --- a/compile_linux.sh +++ b/compile_linux.sh @@ -61,6 +61,7 @@ ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/mesh.cpp -o sfw/render ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/mesh_utils.cpp -o sfw/render_core/mesh_utils.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/texture.cpp -o sfw/render_core/texture.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/image.cpp -o sfw/render_core/image.o +ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/render_state.cpp -o sfw/render_core/render_state.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/camera_3d.cpp -o sfw/render_objects/camera_3d.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/object_3d.cpp -o sfw/render_objects/object_3d.o @@ -88,7 +89,7 @@ ccache g++ -Wall -lm -ldl -lpthread -lX11 -D_REENTRANT -g sfw/core/aabb.o sfw/c sfw/object/variant.o sfw/object/variant_op.o sfw/object/psignal.o \ sfw/object/array.o sfw/object/dictionary.o sfw/object/ref_ptr.o \ sfw/object/resource.o \ - sfw/render_core/image.o \ + sfw/render_core/image.o sfw/render_core/render_state.o \ sfw/render_core/application.o sfw/render_core/scene.o sfw/render_core/window.o \ sfw/render_core/shader.o sfw/render_core/material.o sfw/render_core/mesh.o \ sfw/render_core/mesh_utils.o sfw/render_core/texture.o \ diff --git a/game_scene.cpp b/game_scene.cpp index 7ca9249..6ee36fb 100644 --- a/game_scene.cpp +++ b/game_scene.cpp @@ -100,7 +100,9 @@ void GameScene::render() { glClear(GL_COLOR_BUFFER_BIT); static float rot = 0; - camera->camera_transform.basis = Basis(Vector3(0, 1, 0), rot); + Transform t = camera->get_camera_transform(); + t.basis = Basis(Vector3(0, 1, 0), rot); + camera->set_camera_transform(t); rot += 0.01; Ref d = texture->get_data(); @@ -185,12 +187,15 @@ GameScene::GameScene() { tile_map->transform.set_origin(Vector2(500, 500)); camera = new PerspectiveCamera(); + Transform t = camera->get_camera_transform(); //camera->width = 2; //camera->height = 2; //camera->position.x = 0; //camera->position.y = 0; //camera->position.z = -2; - camera->camera_transform.origin.z -= 2; + t.origin.z -= 2; + camera->set_camera_transform(t); + camera->screen_aspect_ratio = 1920.0 / 1080.0; camera_2d = memnew(Camera2D); diff --git a/sfw/render_core/color_material.h b/sfw/render_core/color_material.h index 7b620cb..62cc832 100644 --- a/sfw/render_core/color_material.h +++ b/sfw/render_core/color_material.h @@ -3,7 +3,7 @@ #include "render_core/material.h" -#include "render_objects/camera_3d.h" +#include "render_core/render_state.h" class ColorMaterial : public Material { public: @@ -12,14 +12,14 @@ public: } void bind_uniforms() { - set_uniform(projection_matrix_location, Camera3D::current_camera->projection_matrix); - set_uniform(camera_matrix_location, Camera3D::current_camera->camera_transform); - set_uniform(model_view_matrix_location, Camera3D::current_camera->model_view_matrix); + set_uniform(projection_matrix_location, RenderState::projection_matrix_3d); + set_uniform(camera_matrix_location, RenderState::camera_transform_3d); + set_uniform(model_view_matrix_location, RenderState::model_view_matrix_3d); } void setup_uniforms() { projection_matrix_location = get_uniform("u_proj_matrix"); - camera_matrix_location = get_uniform("u_camera_matrix"); + camera_matrix_location = get_uniform("u_camera_matrix"); model_view_matrix_location = get_uniform("u_model_view_matrix"); } diff --git a/sfw/render_core/colored_material.h b/sfw/render_core/colored_material.h index aa1fd63..48b75c9 100644 --- a/sfw/render_core/colored_material.h +++ b/sfw/render_core/colored_material.h @@ -5,68 +5,66 @@ #include "core/color.h" -#include "render_objects/camera_3d.h" +#include "render_core/render_state.h" class ColoredMaterial : public Material { public: - int get_material_id() { - return 1; - } + int get_material_id() { + return 1; + } - void bind_uniforms() { - //glUniformMatrix4fv(projection_matrix_location, 1, GL_FALSE, glm::value_ptr(Camera3D::current_camera->projection_matrix)); - //glUniformMatrix4fv(model_view_matrix_location, 1, GL_FALSE, glm::value_ptr(Camera3D::current_camera->model_view_matrix)); + void bind_uniforms() { + set_uniform(projection_matrix_location, RenderState::projection_matrix_3d); + set_uniform(model_view_matrix_location, RenderState::model_view_matrix_3d); - glUniform4f(tri_color_uniform_location, color.r, color.g, color.b, color.a); - } + glUniform4f(tri_color_uniform_location, color.r, color.g, color.b, color.a); + } - void setup_uniforms() { - projection_matrix_location = get_uniform("u_proj_matrix"); - model_view_matrix_location = get_uniform("u_model_view_matrix"); + void setup_uniforms() { + projection_matrix_location = get_uniform("u_proj_matrix"); + model_view_matrix_location = get_uniform("u_model_view_matrix"); - tri_color_uniform_location = get_uniform("fragment_color"); - } + tri_color_uniform_location = get_uniform("fragment_color"); + } - const GLchar **get_vertex_shader_source() { - static const GLchar *vertex_shader_source[] = { - "uniform mat4 u_proj_matrix;\n" - "uniform mat4 u_model_view_matrix;\n" - "\n" - "attribute vec4 a_position;\n" - "\n" - "void main() {\n" - " gl_Position = u_proj_matrix * u_model_view_matrix * a_position;\n" - "}" - }; + const GLchar **get_vertex_shader_source() { + static const GLchar *vertex_shader_source[] = { + "uniform mat4 u_proj_matrix;\n" + "uniform mat4 u_model_view_matrix;\n" + "\n" + "attribute vec4 a_position;\n" + "\n" + "void main() {\n" + " gl_Position = u_proj_matrix * u_model_view_matrix * a_position;\n" + "}" + }; - return vertex_shader_source; - } + return vertex_shader_source; + } + const GLchar **get_fragment_shader_source() { + static const GLchar *fragment_shader_source[] = { + "precision mediump float;\n" + "\n" + "uniform vec4 fragment_color;\n" + "\n" + "void main() {\n" + " gl_FragColor = fragment_color;\n" + "}" + }; - const GLchar **get_fragment_shader_source() { - static const GLchar *fragment_shader_source[] = { - "precision mediump float;\n" - "\n" - "uniform vec4 fragment_color;\n" - "\n" - "void main() {\n" - " gl_FragColor = fragment_color;\n" - "}" - }; + return fragment_shader_source; + } - return fragment_shader_source; - } + ColoredMaterial() : + Material() { + } - ColoredMaterial() : Material() { - } + GLint projection_matrix_location; + GLint model_view_matrix_location; - GLint projection_matrix_location; - GLint model_view_matrix_location; - - GLint tri_color_uniform_location; - Color color; + GLint tri_color_uniform_location; + Color color; }; - - #endif // COLORED_MATERIAL_H diff --git a/sfw/render_core/render_state.cpp b/sfw/render_core/render_state.cpp new file mode 100644 index 0000000..a535aff --- /dev/null +++ b/sfw/render_core/render_state.cpp @@ -0,0 +1,8 @@ +#include "render_core/render_state.h" + +Transform RenderState::camera_transform_3d; +Transform RenderState::model_view_matrix_3d; +Projection RenderState::projection_matrix_3d; + +Transform2D RenderState::model_view_matrix_2d; +Transform RenderState::projection_matrix_2d; \ No newline at end of file diff --git a/sfw/render_core/render_state.h b/sfw/render_core/render_state.h new file mode 100644 index 0000000..adbf4de --- /dev/null +++ b/sfw/render_core/render_state.h @@ -0,0 +1,23 @@ +#ifndef RENDER_STATE_H +#define RENDER_STATE_H + +#include "core/projection.h" +#include "core/transform.h" +#include "core/vector3.h" +#include "core/transform_2d.h" +#include "core/vector2.h" + +class RenderState { +public: + static Transform camera_transform_3d; + static Transform model_view_matrix_3d; + static Projection projection_matrix_3d; + + static Transform2D model_view_matrix_2d; + static Transform projection_matrix_2d; + + //TODO should probably add the current shader here, and active material etc. +}; + + +#endif // RENDER_STATE_H diff --git a/sfw/render_core/texture_material.h b/sfw/render_core/texture_material.h index 1eed664..9fa05e8 100644 --- a/sfw/render_core/texture_material.h +++ b/sfw/render_core/texture_material.h @@ -4,7 +4,7 @@ #include "render_core/material.h" #include "render_core/texture.h" -#include "render_objects/camera_3d.h" +#include "render_core/render_state.h" class TextureMaterial : public Material { public: @@ -13,9 +13,9 @@ public: } void bind_uniforms() { - set_uniform(projection_matrix_location, Camera3D::current_camera->projection_matrix); - set_uniform(camera_matrix_location, Camera3D::current_camera->camera_transform); - set_uniform(model_view_matrix_location, Camera3D::current_camera->model_view_matrix); + set_uniform(projection_matrix_location, RenderState::projection_matrix_3d); + set_uniform(camera_matrix_location, RenderState::camera_transform_3d); + set_uniform(model_view_matrix_location, RenderState::model_view_matrix_3d); if (texture) { glActiveTexture(GL_TEXTURE0); diff --git a/sfw/render_core/texture_material_2d.h b/sfw/render_core/texture_material_2d.h index bd62431..118dd6c 100644 --- a/sfw/render_core/texture_material_2d.h +++ b/sfw/render_core/texture_material_2d.h @@ -4,7 +4,7 @@ #include "render_core/material.h" #include "render_core/texture.h" -#include "render_objects/camera_2d.h" +#include "render_core/render_state.h" class TextureMaterial2D : public Material { public: @@ -13,8 +13,8 @@ public: } void bind_uniforms() { - set_uniform(projection_matrix_location, Camera2D::current_camera->projection_matrix); - set_uniform(model_view_matrix_location, Camera2D::current_camera->model_view_matrix); + set_uniform(projection_matrix_location, RenderState::projection_matrix_2d); + set_uniform(model_view_matrix_location, RenderState::model_view_matrix_2d); if (texture) { glActiveTexture(GL_TEXTURE0); diff --git a/sfw/render_core/transparent_texture_material.h b/sfw/render_core/transparent_texture_material.h index 0356890..425eaa3 100644 --- a/sfw/render_core/transparent_texture_material.h +++ b/sfw/render_core/transparent_texture_material.h @@ -4,97 +4,93 @@ #include "render_core/material.h" #include "render_core/texture.h" -#include "./libs/glm/vec4.hpp" -#include "./libs/glm/gtc/type_ptr.hpp" - -#include "render_objects/camera_3d.h" +#include "render_core/render_state.h" class TransparentTextureMaterial : public Material { public: - int get_material_id() { - return 4; - } + int get_material_id() { + return 4; + } - void bind_uniforms() { - glUniformMatrix4fv(projection_matrix_location, 1, GL_FALSE, glm::value_ptr(Camera3D::current_camera->projection_matrix)); - glUniformMatrix4fv(model_view_matrix_location, 1, GL_FALSE, glm::value_ptr(Camera3D::current_camera->model_view_matrix)); + void bind_uniforms() { + set_uniform(projection_matrix_location, RenderState::projection_matrix_3d); + set_uniform(model_view_matrix_location, RenderState::model_view_matrix_3d); - if (texture) { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texture->get_gl_texture()); - glUniform1i(texture_location, 0); - } - } + if (texture) { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texture->get_gl_texture()); + glUniform1i(texture_location, 0); + } + } - void setup_uniforms() { - projection_matrix_location = get_uniform("u_proj_matrix"); - model_view_matrix_location = get_uniform("u_model_view_matrix"); + void setup_uniforms() { + projection_matrix_location = get_uniform("u_proj_matrix"); + model_view_matrix_location = get_uniform("u_model_view_matrix"); - texture_location = get_uniform("u_texture"); - } + texture_location = get_uniform("u_texture"); + } - void unbind() { - glDisable(GL_TEXTURE_2D); - } + void unbind() { + glDisable(GL_TEXTURE_2D); + } - void setup_state() { - glEnable(GL_TEXTURE_2D); - } + void setup_state() { + glEnable(GL_TEXTURE_2D); + } - const GLchar **get_vertex_shader_source() { - static const GLchar *vertex_shader_source[] = { - "uniform mat4 u_proj_matrix;\n" - "uniform mat4 u_model_view_matrix;\n" - "\n" - "attribute vec4 a_position;\n" - "attribute vec2 a_uv;\n" - "\n" - "varying vec2 v_uv;\n" - "\n" - "void main() {\n" - " v_uv = a_uv;\n" - " gl_Position = u_proj_matrix * u_model_view_matrix * a_position;\n" - "}" - }; + const GLchar **get_vertex_shader_source() { + static const GLchar *vertex_shader_source[] = { + "uniform mat4 u_proj_matrix;\n" + "uniform mat4 u_model_view_matrix;\n" + "\n" + "attribute vec4 a_position;\n" + "attribute vec2 a_uv;\n" + "\n" + "varying vec2 v_uv;\n" + "\n" + "void main() {\n" + " v_uv = a_uv;\n" + " gl_Position = u_proj_matrix * u_model_view_matrix * a_position;\n" + "}" + }; - return vertex_shader_source; - } + return vertex_shader_source; + } - const GLchar **get_fragment_shader_source() { - static const GLchar *fragment_shader_source[] = { - "precision mediump float;\n" - "\n" - "uniform sampler2D u_texture;\n" - "\n" - "varying vec2 v_uv;\n" - "\n" - "void main() {\n" - " vec4 col = texture2D(u_texture, v_uv);\n" - "\n" - " if (col.a < 0.1) {\n" - " discard;\n" - " }\n" - "\n" - " gl_FragColor = col;\n" - "}" - }; + const GLchar **get_fragment_shader_source() { + static const GLchar *fragment_shader_source[] = { + "precision mediump float;\n" + "\n" + "uniform sampler2D u_texture;\n" + "\n" + "varying vec2 v_uv;\n" + "\n" + "void main() {\n" + " vec4 col = texture2D(u_texture, v_uv);\n" + "\n" + " if (col.a < 0.1) {\n" + " discard;\n" + " }\n" + "\n" + " gl_FragColor = col;\n" + "}" + }; - return fragment_shader_source; - } + return fragment_shader_source; + } - TransparentTextureMaterial() : Material() { - texture_location = 0; - texture = NULL; - } + TransparentTextureMaterial() : + Material() { + texture_location = 0; + texture = NULL; + } - GLint projection_matrix_location; - GLint model_view_matrix_location; + GLint projection_matrix_location; + GLint model_view_matrix_location; - GLint texture_location; + GLint texture_location; - Texture *texture; + Texture *texture; }; - - #endif // COLORED_MATERIAL_H diff --git a/sfw/render_objects/camera_2d.cpp b/sfw/render_objects/camera_2d.cpp index 1237b5e..abafacc 100644 --- a/sfw/render_objects/camera_2d.cpp +++ b/sfw/render_objects/camera_2d.cpp @@ -2,6 +2,30 @@ #include "core/math_funcs.h" +#include "render_core/render_state.h" + +Transform2D Camera2D::get_model_view_matrix() { + return _model_view_matrix; +} +void Camera2D::set_model_view_matrix(const Transform2D &p_value) { + _model_view_matrix = p_value; + + if (current_camera == this) { + RenderState::model_view_matrix_2d = _model_view_matrix; + } +} + +Transform Camera2D::get_projection_matrix() { + return _projection_matrix; +} +void Camera2D::set_projection_matrix(const Transform &p_value) { + _projection_matrix = p_value; + + if (current_camera == this) { + RenderState::projection_matrix_2d = _projection_matrix; + } +} + void Camera2D::bind() { make_current(); @@ -9,9 +33,12 @@ void Camera2D::bind() { canvas_transform.translate_local(-(size.width / 2.0f), -(size.height / 2.0f), 0.0f); //canvas_transform.scale(Vector3(2.0f / size.width, 2.0f / size.height, 1.0f)); canvas_transform.scale(Vector3(2.0f / size.width, -2.0f / size.height, 1.0f)); - projection_matrix = canvas_transform; - model_view_matrix = Transform2D(); + _projection_matrix = canvas_transform; + _model_view_matrix = Transform2D(); + + RenderState::model_view_matrix_2d = _model_view_matrix; + RenderState::projection_matrix_2d = _projection_matrix; } void Camera2D::make_current() { diff --git a/sfw/render_objects/camera_2d.h b/sfw/render_objects/camera_2d.h index 38c0686..e0a8bdc 100644 --- a/sfw/render_objects/camera_2d.h +++ b/sfw/render_objects/camera_2d.h @@ -11,6 +11,12 @@ class Camera2D : Object2D { public: + Transform2D get_model_view_matrix(); + void set_model_view_matrix(const Transform2D &p_value); + + Transform get_projection_matrix(); + void set_projection_matrix(const Transform &p_value); + virtual void bind(); void make_current(); @@ -29,8 +35,9 @@ public: static Camera2D *current_camera; - Transform2D model_view_matrix; - Transform projection_matrix; +protected: + Transform2D _model_view_matrix; + Transform _projection_matrix; }; #endif // CAMERA_H diff --git a/sfw/render_objects/camera_3d.cpp b/sfw/render_objects/camera_3d.cpp index b941d8c..1eeddad 100644 --- a/sfw/render_objects/camera_3d.cpp +++ b/sfw/render_objects/camera_3d.cpp @@ -2,10 +2,49 @@ #include "core/math_funcs.h" +#include "render_core/render_state.h" + +Transform Camera3D::get_camera_transform() { + return _camera_transform; +} +void Camera3D::set_camera_transform(const Transform &p_value) { + _camera_transform = p_value; + + if (current_camera == this) { + RenderState::camera_transform_3d = _camera_transform; + } +} + +Transform Camera3D::get_model_view_matrix() { + return _model_view_matrix; +} +void Camera3D::set_model_view_matrix(const Transform &p_value) { + _model_view_matrix = p_value; + + if (current_camera == this) { + RenderState::model_view_matrix_3d = _model_view_matrix; + } +} + +Projection Camera3D::get_projection_matrix() { + return _projection_matrix; +} +void Camera3D::set_projection_matrix(const Projection &p_value) { + _projection_matrix = p_value; + + if (current_camera == this) { + RenderState::projection_matrix_3d = _projection_matrix; + } +} + void Camera3D::bind() { make_current(); - model_view_matrix = Transform(); + _model_view_matrix = Transform(); + + RenderState::camera_transform_3d = _camera_transform; + RenderState::model_view_matrix_3d = _model_view_matrix; + RenderState::projection_matrix_3d = _projection_matrix; } void Camera3D::make_current() { @@ -27,13 +66,14 @@ Camera3D::~Camera3D() { Camera3D *Camera3D::current_camera = NULL; void OrthographicCamera::bind() { - Camera3D::bind(); - projection_matrix.set_orthogonal( + _projection_matrix.set_orthogonal( size, screen_aspect_ratio, znear, zfar, vaspect); + + Camera3D::bind(); } OrthographicCamera::OrthographicCamera() : @@ -43,14 +83,14 @@ OrthographicCamera::~OrthographicCamera() { } void PerspectiveCamera::bind() { - Camera3D::bind(); - - projection_matrix.set_perspective( + _projection_matrix.set_perspective( fov, screen_aspect_ratio, znear, zfar, vaspect); + + Camera3D::bind(); } PerspectiveCamera::PerspectiveCamera() : @@ -62,6 +102,14 @@ PerspectiveCamera::~PerspectiveCamera() { } void FrustumCamera::bind() { + _projection_matrix.set_frustum( + size, + screen_aspect_ratio, + offset, + znear, + zfar, + vaspect); + Camera3D::bind(); } @@ -69,7 +117,7 @@ FrustumCamera::FrustumCamera() : Camera3D() { offset = 0; - projection_matrix.set_frustum( + _projection_matrix.set_frustum( size, screen_aspect_ratio, offset, diff --git a/sfw/render_objects/camera_3d.h b/sfw/render_objects/camera_3d.h index cf36bf3..cbf2871 100644 --- a/sfw/render_objects/camera_3d.h +++ b/sfw/render_objects/camera_3d.h @@ -9,6 +9,15 @@ class Camera3D { public: + Transform get_camera_transform(); + void set_camera_transform(const Transform &p_value); + + Transform get_model_view_matrix(); + void set_model_view_matrix(const Transform &p_value); + + Projection get_projection_matrix(); + void set_projection_matrix(const Projection &p_value); + virtual void bind(); void make_current(); @@ -17,16 +26,17 @@ public: virtual ~Camera3D(); float size; - float screen_aspect_ratio; //p_viewport_size.width / (float)p_viewport_size.height, + float screen_aspect_ratio; //p_viewport_size.width / (float)p_viewport_size.height, float znear; float zfar; - bool vaspect; + bool vaspect; static Camera3D *current_camera; - Transform camera_transform; - Transform model_view_matrix; - Projection projection_matrix; +protected: + Transform _camera_transform; + Transform _model_view_matrix; + Projection _projection_matrix; }; class OrthographicCamera : public Camera3D { @@ -50,12 +60,11 @@ public: class FrustumCamera : public Camera3D { public: float offset; - + void bind(); FrustumCamera(); ~FrustumCamera(); }; - #endif // CAMERA_H diff --git a/sfw/render_objects/mesh_instance_2d.cpp b/sfw/render_objects/mesh_instance_2d.cpp index 8311a5f..e04a4f3 100644 --- a/sfw/render_objects/mesh_instance_2d.cpp +++ b/sfw/render_objects/mesh_instance_2d.cpp @@ -3,35 +3,35 @@ #include "render_objects/camera_2d.h" void MeshInstance2D::render() { - if (!mesh) { - return; - } + if (!mesh) { + return; + } - Transform2D mat_orig = Camera2D::current_camera->model_view_matrix; + Transform2D mat_orig = Camera2D::current_camera->get_model_view_matrix(); - Camera2D::current_camera->model_view_matrix *= transform; + Camera2D::current_camera->set_model_view_matrix(mat_orig * transform); - if (material) { - material->bind(); - } + if (material) { + material->bind(); + } - mesh->render(); + mesh->render(); - for (int i = 0; i < children.size(); ++i) { - MeshInstance2D * c = children[i]; + for (int i = 0; i < children.size(); ++i) { + MeshInstance2D *c = children[i]; - if (c) { - c->render(); - } - } + if (c) { + c->render(); + } + } - Camera2D::current_camera->model_view_matrix = mat_orig; + Camera2D::current_camera->set_model_view_matrix(mat_orig); } MeshInstance2D::MeshInstance2D() { - material = NULL; - mesh = NULL; + material = NULL; + mesh = NULL; } MeshInstance2D::~MeshInstance2D() { - children.clear(); + children.clear(); } diff --git a/sfw/render_objects/mesh_instance_3d.cpp b/sfw/render_objects/mesh_instance_3d.cpp index 993e7ee..f115c96 100644 --- a/sfw/render_objects/mesh_instance_3d.cpp +++ b/sfw/render_objects/mesh_instance_3d.cpp @@ -3,35 +3,35 @@ #include "render_objects/camera_3d.h" void MeshInstance3D::render() { - if (!mesh) { - return; - } + if (!mesh) { + return; + } - Transform mat_orig = Camera3D::current_camera->model_view_matrix; + Transform mat_orig = Camera3D::current_camera->get_model_view_matrix(); - Camera3D::current_camera->model_view_matrix *= transform; + Camera3D::current_camera->set_model_view_matrix(mat_orig * transform); - if (material) { - material->bind(); - } + if (material) { + material->bind(); + } - mesh->render(); + mesh->render(); - for (int i = 0; i < children.size(); ++i) { - MeshInstance3D * c = children[i]; + for (int i = 0; i < children.size(); ++i) { + MeshInstance3D *c = children[i]; - if (c) { - c->render(); - } - } + if (c) { + c->render(); + } + } - Camera3D::current_camera->model_view_matrix = mat_orig; + Camera3D::current_camera->set_model_view_matrix(mat_orig); } MeshInstance3D::MeshInstance3D() { - material = NULL; - mesh = NULL; + material = NULL; + mesh = NULL; } MeshInstance3D::~MeshInstance3D() { - children.clear(); + children.clear(); } diff --git a/sfw/render_objects/tile_map.cpp b/sfw/render_objects/tile_map.cpp index 6a1bab5..0776caf 100644 --- a/sfw/render_objects/tile_map.cpp +++ b/sfw/render_objects/tile_map.cpp @@ -98,12 +98,13 @@ void TileMap::set_data(const int x, const int y, const uint8_t value) { } void TileMap::render() { - if (!mesh) + if (!mesh) { return; + } - Transform2D mat_orig = Camera2D::current_camera->model_view_matrix; + Transform2D mat_orig = Camera2D::current_camera->get_model_view_matrix(); - Camera2D::current_camera->model_view_matrix *= transform; + Camera2D::current_camera->set_model_view_matrix(mat_orig * transform); if (material) { material->bind(); @@ -111,7 +112,7 @@ void TileMap::render() { mesh->render(); - Camera2D::current_camera->model_view_matrix = mat_orig; + Camera2D::current_camera->set_model_view_matrix(mat_orig); } TileMap::TileMap() :