From f9ce347ca0715ef5ce0f4c88a5f42488e4347019 Mon Sep 17 00:00:00 2001 From: light7734 Date: Thu, 17 Jul 2025 10:44:00 +0330 Subject: [PATCH] feat: initial math module implementation refactor: replace glm with built-in math library --- modules/CMakeLists.txt | 1 + modules/camera/CMakeLists.txt | 2 +- modules/camera/include/camera/camera.hpp | 13 ++- modules/camera/include/camera/component.hpp | 1 - modules/camera/src/scene.cpp | 32 +++-- .../ecs/components/sprite_renderer.hpp | 6 +- .../ecs/include/ecs/components/transform.hpp | 28 +++-- modules/ecs/include/ecs/scene.hpp | 1 - modules/ecs/src/scene.cpp | 1 - modules/ecs/src/serializer.cpp | 29 ++--- modules/input/CMakeLists.txt | 2 +- modules/input/include/input/events/mouse.hpp | 6 +- modules/input/include/input/events/window.hpp | 10 +- modules/input/include/input/input.hpp | 8 +- modules/input/src/input.cpp | 4 +- modules/math/CMakeLists.txt | 1 + modules/math/include/math/algebra.hpp | 57 +++++++++ modules/math/include/math/mat4.hpp | 109 ++++++++++++++++++ modules/math/include/math/trig.hpp | 26 +++++ modules/math/include/math/vec2.hpp | 56 +++++++++ modules/math/include/math/vec3.hpp | 53 +++++++++ modules/math/include/math/vec4.hpp | 78 +++++++++++++ .../mirror/include/mirror/editor_layer.hpp | 4 +- .../include/mirror/panel/properties.hpp | 3 +- modules/mirror/src/editor_layer.cpp | 13 ++- modules/mirror/src/mirror.cpp | 3 +- modules/mirror/src/panel/properties.cpp | 11 +- .../renderer/include/renderer/framebuffer.hpp | 8 +- .../include/renderer/gl/framebuffers.hpp | 7 +- .../include/renderer/gl/render_command.hpp | 4 +- .../include/renderer/programs/quad.hpp | 6 +- .../include/renderer/programs/texture.hpp | 7 +- .../renderer/programs/tinted_texture.hpp | 9 +- .../include/renderer/render_command.hpp | 5 +- .../renderer/include/renderer/renderer.hpp | 47 ++++---- modules/renderer/include/renderer/shader.hpp | 2 - modules/renderer/src/gl/framebuffers.cpp | 5 +- modules/renderer/src/gl/render_command.cpp | 2 +- modules/renderer/src/gl/shader.cpp | 3 - modules/renderer/src/renderer.cpp | 77 ++++++------- .../window/include/window/linux/window.hpp | 2 +- modules/window/include/window/window.hpp | 8 +- modules/window/src/linux/window.cpp | 2 +- 43 files changed, 564 insertions(+), 188 deletions(-) create mode 100644 modules/math/CMakeLists.txt create mode 100644 modules/math/include/math/algebra.hpp create mode 100644 modules/math/include/math/mat4.hpp create mode 100644 modules/math/include/math/trig.hpp create mode 100644 modules/math/include/math/vec2.hpp create mode 100644 modules/math/include/math/vec3.hpp create mode 100644 modules/math/include/math/vec4.hpp diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index fc2e0fc..09e490d 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -3,6 +3,7 @@ add_subdirectory(./base) add_subdirectory(./time) add_subdirectory(./logger) add_subdirectory(./debug) +add_subdirectory(./math) add_subdirectory(./asset_baker) add_subdirectory(./asset_parser) diff --git a/modules/camera/CMakeLists.txt b/modules/camera/CMakeLists.txt index b1c5525..35083e5 100644 --- a/modules/camera/CMakeLists.txt +++ b/modules/camera/CMakeLists.txt @@ -1,3 +1,3 @@ add_library_module(camera camera.cpp scene.cpp) -target_link_libraries(camera PUBLIC glm::glm) +target_link_libraries(camera PUBLIC math) diff --git a/modules/camera/include/camera/camera.hpp b/modules/camera/include/camera/camera.hpp index 244ca7c..b6c4fa7 100644 --- a/modules/camera/include/camera/camera.hpp +++ b/modules/camera/include/camera/camera.hpp @@ -1,6 +1,7 @@ #pragma once -#include +#include +#include namespace lt { @@ -9,26 +10,26 @@ class Camera public: Camera() = default; - [[nodiscard]] auto get_projection() const -> const glm::mat4 & + [[nodiscard]] auto get_projection() const -> const math::mat4 & { return m_projection; } - [[nodiscard]] auto get_background_color() const -> const glm::vec4 & + [[nodiscard]] auto get_background_color() const -> const math::vec4 & { return m_background_color; } - void set_background_color(const glm::vec4 &color) + void set_background_color(const math::vec4 &color) { m_background_color = color; } protected: - glm::mat4 m_projection {}; + math::mat4 m_projection; private: - glm::vec4 m_background_color = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f); + math::vec4 m_background_color = math::vec4(1.0f, 0.0f, 0.0f, 1.0f); }; } // namespace lt diff --git a/modules/camera/include/camera/component.hpp b/modules/camera/include/camera/component.hpp index 895baea..0bd75ea 100644 --- a/modules/camera/include/camera/component.hpp +++ b/modules/camera/include/camera/component.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include namespace lt { diff --git a/modules/camera/src/scene.cpp b/modules/camera/src/scene.cpp index 038b6d0..466f662 100644 --- a/modules/camera/src/scene.cpp +++ b/modules/camera/src/scene.cpp @@ -1,11 +1,12 @@ #include -#include +#include +#include namespace lt { SceneCamera::SceneCamera() : m_orthographic_specification { .size = 1000.0f, .near_plane = -1.0f, .far_plane = 10000.0f } - , m_perspective_specification { .vertical_fov = glm::radians(45.0f), + , m_perspective_specification { .vertical_fov = math::radians(45.0f), .near_plane = 0.01f, .far_plane = 10000.0f } , m_aspect_ratio(16.0f / 9.0f) @@ -64,26 +65,19 @@ void SceneCamera::set_perspective_near_plane(float near_plane) void SceneCamera::calculate_projection() { + // TODO(Light): implement ortho perspective if (m_projection_type == ProjectionType::Orthographic) { - m_projection = glm::ortho( - -m_orthographic_specification.size * 0.5f * m_aspect_ratio, - m_orthographic_specification.size * 0.5f * m_aspect_ratio, - -m_orthographic_specification.size * 0.5f, - m_orthographic_specification.size * 0.5f, - m_orthographic_specification.far_plane, - m_orthographic_specification.near_plane - ); - } - else // perspective - { - m_projection = glm::perspective( - m_perspective_specification.vertical_fov, - m_aspect_ratio, - m_perspective_specification.near_plane, - m_perspective_specification.far_plane - ); + // throw std::runtime_error { "ortho perspective not supported yet" }; } + + // defaults to perspective for now... + m_projection = math::perspective( + m_perspective_specification.vertical_fov, + m_aspect_ratio, + m_perspective_specification.near_plane, + m_perspective_specification.far_plane + ); } } // namespace lt diff --git a/modules/ecs/include/ecs/components/sprite_renderer.hpp b/modules/ecs/include/ecs/components/sprite_renderer.hpp index ece1fb5..2b11c3d 100644 --- a/modules/ecs/include/ecs/components/sprite_renderer.hpp +++ b/modules/ecs/include/ecs/components/sprite_renderer.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include namespace lt { @@ -15,7 +15,7 @@ struct SpriteRendererComponent SpriteRendererComponent( Ref _texture, - const glm::vec4 &_tint = glm::vec4(1.0f, 1.0f, 1.0f, 1.0f) + const math::vec4 &_tint = math::vec4 { 1.0f, 1.0f, 1.0f, 1.0f } ) : texture(std::move(std::move(_texture))) , tint(_tint) @@ -29,7 +29,7 @@ struct SpriteRendererComponent Ref texture; - glm::vec4 tint {}; + math::vec4 tint {}; }; } // namespace lt diff --git a/modules/ecs/include/ecs/components/transform.hpp b/modules/ecs/include/ecs/components/transform.hpp index a03fd54..cd9fe4e 100644 --- a/modules/ecs/include/ecs/components/transform.hpp +++ b/modules/ecs/include/ecs/components/transform.hpp @@ -1,10 +1,7 @@ #pragma once -#define GLM_ENABLE_EXPERIMENTAL - -#include -#include -#include +#include +#include namespace lt { @@ -13,9 +10,9 @@ struct TransformComponent TransformComponent(const TransformComponent &) = default; TransformComponent( - const glm::vec3 &_translation = glm::vec3(0.0f, 0.0f, 0.0f), - const glm::vec3 &_scale = glm::vec3(1.0f, 1.0f, 1.0f), - const glm::vec3 &_rotation = glm::vec3(0.0f, 0.0f, 0.0f) + const math::vec3 &_translation = math::vec3(0.0f, 0.0f, 0.0f), + const math::vec3 &_scale = math::vec3(1.0f, 1.0f, 1.0f), + const math::vec3 &_rotation = math::vec3(0.0f, 0.0f, 0.0f) ) : translation(_translation) @@ -24,22 +21,23 @@ struct TransformComponent { } - [[nodiscard]] auto get_transform() const -> glm::mat4 + [[nodiscard]] auto get_transform() const -> math::mat4 { - return glm::translate(translation) * glm::rotate(rotation.z, glm::vec3(0.0f, 0.0f, 1.0f)) - * glm::scale(scale); + return math::translate(translation) + * math::rotate(rotation.z, math::vec3 { 0.0f, 0.0f, 1.0f }) // + * math::scale(scale); } - operator const glm::mat4() const + operator const math::mat4() const { return get_transform(); } - glm::vec3 translation; + math::vec3 translation; - glm::vec3 scale; + math::vec3 scale; - glm::vec3 rotation; + math::vec3 rotation; }; } // namespace lt diff --git a/modules/ecs/include/ecs/scene.hpp b/modules/ecs/include/ecs/scene.hpp index 17979dc..02c8911 100644 --- a/modules/ecs/include/ecs/scene.hpp +++ b/modules/ecs/include/ecs/scene.hpp @@ -3,7 +3,6 @@ #include #include #include -#include namespace lt { diff --git a/modules/ecs/src/scene.cpp b/modules/ecs/src/scene.cpp index 2c4e00b..12444fe 100644 --- a/modules/ecs/src/scene.cpp +++ b/modules/ecs/src/scene.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include namespace lt { diff --git a/modules/ecs/src/serializer.cpp b/modules/ecs/src/serializer.cpp index 793226d..3dd1335 100644 --- a/modules/ecs/src/serializer.cpp +++ b/modules/ecs/src/serializer.cpp @@ -2,14 +2,16 @@ #include #include #include +#include +#include #include namespace YAML { template<> -struct convert +struct convert { - static auto encode(const glm::vec3 &rhs) -> Node + static auto encode(const lt::math::vec3 &rhs) -> Node { auto node = Node {}; node.push_back(rhs.x); @@ -18,7 +20,7 @@ struct convert return node; } - static auto decode(const Node &node, glm::vec3 &rhs) -> bool + static auto decode(const Node &node, lt::math::vec3 &rhs) -> bool { if (!node.IsSequence() || node.size() != 3) { @@ -33,9 +35,9 @@ struct convert }; template<> -struct convert +struct convert { - static auto encode(const glm::vec4 &rhs) -> Node + static auto encode(const lt::math::vec4 &rhs) -> Node { auto node = Node {}; node.push_back(rhs.x); @@ -45,7 +47,7 @@ struct convert return node; } - static auto decode(const Node &node, glm::vec4 &rhs) -> bool + static auto decode(const Node &node, lt::math::vec4 &rhs) -> bool { if (!node.IsSequence() || node.size() != 4) { @@ -63,14 +65,14 @@ struct convert namespace lt { -auto operator<<(YAML::Emitter &out, const glm::vec3 &v) -> YAML::Emitter & +auto operator<<(YAML::Emitter &out, const math::vec3 &v) -> YAML::Emitter & { out << YAML::Flow; out << YAML::BeginSeq << v.x << v.y << v.z << YAML::EndSeq; return out; } -auto operator<<(YAML::Emitter &out, const glm::vec4 &v) -> YAML::Emitter & +auto operator<<(YAML::Emitter &out, const math::vec4 &v) -> YAML::Emitter & { out << YAML::Flow; out << YAML::BeginSeq << v.x << v.y << v.z << v.w << YAML::EndSeq; @@ -156,9 +158,10 @@ auto SceneSerializer::deserialize(const std::string &file_path) -> bool .get_component(); entityTransforomComponent.translation = transformComponent["Translation"] - .as(); - entityTransforomComponent.rotation = transformComponent["Rotation"].as(); - entityTransforomComponent.scale = transformComponent["Scale"].as(); + .as(); + entityTransforomComponent.rotation = transformComponent["Rotation"] + .as(); + entityTransforomComponent.scale = transformComponent["Scale"].as(); } /* #TEMPORARY SOLUTION# */ @@ -168,7 +171,7 @@ auto SceneSerializer::deserialize(const std::string &file_path) -> bool auto &entitySpriteRendererComponent = deserializedEntity .add_component(); entitySpriteRendererComponent.tint = spriteRendererComponent["Tint"] - .as(); + .as(); auto texturePath = spriteRendererComponent["Texture"].as(); @@ -213,7 +216,7 @@ auto SceneSerializer::deserialize(const std::string &file_path) -> bool ); entityCameraComponent.camera.set_background_color( - cameraSpecifications["BackgroundColor"].as() + cameraSpecifications["BackgroundColor"].as() ); entityCameraComponent.isPrimary = cameraComponent["IsPrimary"].as(); diff --git a/modules/input/CMakeLists.txt b/modules/input/CMakeLists.txt index f8aa62f..dbf7a96 100644 --- a/modules/input/CMakeLists.txt +++ b/modules/input/CMakeLists.txt @@ -1,2 +1,2 @@ add_library_module(input input.cpp) -target_link_libraries(input PUBLIC glm::glm imgui logger) +target_link_libraries(input PUBLIC math imgui logger) diff --git a/modules/input/include/input/events/mouse.hpp b/modules/input/include/input/events/mouse.hpp index 77b4d8e..99f9128 100644 --- a/modules/input/include/input/events/mouse.hpp +++ b/modules/input/include/input/events/mouse.hpp @@ -1,7 +1,7 @@ #pragma once -#include #include @@ -19,11 +20,11 @@ public: ~TintedTextureRendererProgram() override = default; struct TintedTextureVertexData { - glm::vec4 position; + math::vec4 position; - glm::vec4 tint; + math::vec4 tint; - glm::vec2 texcoord; + math::vec2 texcoord; }; TintedTextureRendererProgram( diff --git a/modules/renderer/include/renderer/render_command.hpp b/modules/renderer/include/renderer/render_command.hpp index 6cefcb1..8908e3d 100644 --- a/modules/renderer/include/renderer/render_command.hpp +++ b/modules/renderer/include/renderer/render_command.hpp @@ -1,7 +1,6 @@ #pragma once - -#include +#include struct GLFWwindow; @@ -23,7 +22,7 @@ public: virtual void swap_buffers() = 0; - virtual void clear_back_buffer(const glm::vec4 &clearColor) = 0; + virtual void clear_back_buffer(const math::vec4 &clearColor) = 0; virtual void draw(unsigned int count) = 0; diff --git a/modules/renderer/include/renderer/renderer.hpp b/modules/renderer/include/renderer/renderer.hpp index ad694b9..5034afc 100644 --- a/modules/renderer/include/renderer/renderer.hpp +++ b/modules/renderer/include/renderer/renderer.hpp @@ -1,6 +1,9 @@ #pragma once // +#include +#include +#include #include #include #include @@ -48,47 +51,51 @@ public: ) -> Scope; static void draw_quad( - const glm::vec3 &position, - const glm::vec2 &size, - const glm::vec4 &tint, + const math::vec3 &position, + const math::vec2 &size, + const math::vec4 &tint, Ref texture ) { s_context->draw_quad_impl(position, size, tint, std::move(texture)); } - static void draw_quad(const glm::vec3 &position, const glm::vec2 &size, const glm::vec4 &tint) + static void draw_quad( + const math::vec3 &position, + const math::vec2 &size, + const math::vec4 &tint + ) { s_context->draw_quad_impl(position, size, tint); } - static void draw_quad(const glm::vec3 &position, const glm::vec2 &size, Ref texture) + static void draw_quad(const math::vec3 &position, const math::vec2 &size, Ref texture) { s_context->draw_quad_impl(position, size, std::move(texture)); } static void draw_quad( - const glm::mat4 &transform, - const glm::vec4 &tint, + const math::mat4 &transform, + const math::vec4 &tint, const Ref &texture ) { s_context->draw_quad_impl(transform, tint, texture); } - static void draw_quad(const glm::mat4 &transform, const glm::vec4 &tint) + static void draw_quad(const math::mat4 &transform, const math::vec4 &tint) { s_context->draw_quad_impl(transform, tint); } - static void draw_quad(const glm::mat4 &transform, const Ref &texture) + static void draw_quad(const math::mat4 &transform, const Ref &texture) { s_context->draw_quad_impl(transform, texture); } static void begin_scene( Camera *camera, - const glm::mat4 &cameraTransform, + const math::mat4 &cameraTransform, const Ref &targetFrameBuffer = nullptr ) { @@ -134,29 +141,29 @@ private: ); void draw_quad_impl( - const glm::vec3 &position, - const glm::vec2 &size, - const glm::vec4 &tint, + const math::vec3 &position, + const math::vec2 &size, + const math::vec4 &tint, Ref texture ); - void draw_quad_impl(const glm::vec3 &position, const glm::vec2 &size, const glm::vec4 &tint); + void draw_quad_impl(const math::vec3 &position, const math::vec2 &size, const math::vec4 &tint); - void draw_quad_impl(const glm::vec3 &position, const glm::vec2 &size, Ref texture); + void draw_quad_impl(const math::vec3 &position, const math::vec2 &size, Ref texture); void draw_quad_impl( - const glm::mat4 &transform, - const glm::vec4 &tint, + const math::mat4 &transform, + const math::vec4 &tint, const Ref &texture ); - void draw_quad_impl(const glm::mat4 &transform, const glm::vec4 &tint); + void draw_quad_impl(const math::mat4 &transform, const math::vec4 &tint); - void draw_quad_impl(const glm::mat4 &transform, const Ref &texture); + void draw_quad_impl(const math::mat4 &transform, const Ref &texture); void begin_scene_impl( Camera *camera, - const glm::mat4 &cameraTransform, + const math::mat4 &cameraTransform, const Ref &targetFrameBuffer = nullptr ); diff --git a/modules/renderer/include/renderer/shader.hpp b/modules/renderer/include/renderer/shader.hpp index 17d0e0a..7a1aa91 100644 --- a/modules/renderer/include/renderer/shader.hpp +++ b/modules/renderer/include/renderer/shader.hpp @@ -1,7 +1,5 @@ #pragma once -#include - namespace Assets { class TextAsset; diff --git a/modules/renderer/src/gl/framebuffers.cpp b/modules/renderer/src/gl/framebuffers.cpp index 39ff6ea..68b0574 100644 --- a/modules/renderer/src/gl/framebuffers.cpp +++ b/modules/renderer/src/gl/framebuffers.cpp @@ -1,5 +1,4 @@ #include -#include #include namespace lt { @@ -20,7 +19,7 @@ glFramebuffer::~glFramebuffer() // glDeleteTextures(1, &m_depth_stencil_attachment_id); } -void glFramebuffer::bind_as_target(const glm::vec4 &clearColor) +void glFramebuffer::bind_as_target(const math::vec4 &clearColor) { // #todo: use viewport instead of default x=0, y=0 glBindFramebuffer(GL_FRAMEBUFFER, m_buffer_id); @@ -35,7 +34,7 @@ void glFramebuffer::bind_as_resource() log_err("NO_IMPLEMENT!"); } -void glFramebuffer::resize(const glm::uvec2 &size) +void glFramebuffer::resize(const math::uvec2 &size) { if (m_buffer_id) { diff --git a/modules/renderer/src/gl/render_command.cpp b/modules/renderer/src/gl/render_command.cpp index 6f762e4..6722902 100644 --- a/modules/renderer/src/gl/render_command.cpp +++ b/modules/renderer/src/gl/render_command.cpp @@ -15,7 +15,7 @@ void glRenderCommand::swap_buffers() glfwSwapBuffers(m_window_handle); } -void glRenderCommand::clear_back_buffer(const glm::vec4 &clearColor) +void glRenderCommand::clear_back_buffer(const math::vec4 &clearColor) { glClearColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a); glClear(GL_COLOR_BUFFER_BIT); diff --git a/modules/renderer/src/gl/shader.cpp b/modules/renderer/src/gl/shader.cpp index b2f12c8..2968892 100644 --- a/modules/renderer/src/gl/shader.cpp +++ b/modules/renderer/src/gl/shader.cpp @@ -1,8 +1,5 @@ #include #include -#include -#include -#include #include namespace lt { diff --git a/modules/renderer/src/renderer.cpp b/modules/renderer/src/renderer.cpp index 4397e4c..77d9c6b 100644 --- a/modules/renderer/src/renderer.cpp +++ b/modules/renderer/src/renderer.cpp @@ -1,8 +1,5 @@ #include #include -#include -#include -#include #include