From a427fb709968f4df9bc70292296ee95d7dd0fda1 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 23 Oct 2025 15:29:04 +0200 Subject: [PATCH] fix: make new entity system wrapper work --- engine/include/engine/IO/file_manager.h | 2 +- engine/include/engine/IO/parser.h | 2 +- engine/include/engine/api.h | 6 ++-- engine/include/engine/app/app.h | 2 +- engine/include/engine/components/batch.h | 2 +- engine/include/engine/components/camera.h | 2 +- engine/include/engine/components/light.h | 2 +- engine/include/engine/components/mesh.h | 2 +- engine/include/engine/components/rotate.h | 2 +- engine/include/engine/components/transform.h | 2 +- engine/include/engine/renderer/basics.h | 2 +- engine/include/engine/renderer/core.h | 2 +- engine/include/engine/renderer/debug.h | 2 +- engine/include/engine/renderer/material.h | 2 +- engine/include/engine/renderer/mesh.h | 2 +- engine/include/engine/renderer/renderer.h | 2 +- engine/include/engine/renderer/shader.h | 2 +- engine/include/engine/renderer/texture.h | 2 +- engine/include/engine/renderer/wavefront.h | 2 +- engine/include/engine/scene/scene.h | 28 ++++++++++++------- engine/include/engine/window/event.hpp | 6 ++-- .../engine/window/events/window_events.h | 2 +- engine/include/engine/window/window.h | 2 +- engine/src/IO/file_manager.cpp | 2 +- engine/src/IO/parser.cpp | 2 +- engine/src/components/batch.cpp | 2 +- engine/src/renderer/core.cpp | 14 ++-------- engine/src/renderer/debug.cpp | 2 +- engine/src/renderer/mesh.cpp | 2 +- engine/src/renderer/renderer.cpp | 8 ++++-- engine/src/renderer/shader.cpp | 2 +- engine/src/renderer/texture.cpp | 2 +- engine/src/renderer/wavefront.cpp | 2 +- engine/src/scene/scene.cpp | 2 +- engine/src/window/window.cpp | 2 +- sandbox/src/main.cpp | 14 ++++++---- 36 files changed, 70 insertions(+), 66 deletions(-) diff --git a/engine/include/engine/IO/file_manager.h b/engine/include/engine/IO/file_manager.h index 2cee5af..fe6a92c 100644 --- a/engine/include/engine/IO/file_manager.h +++ b/engine/include/engine/IO/file_manager.h @@ -3,7 +3,7 @@ #include -namespace Engine { +namespace Core { class FileManager { diff --git a/engine/include/engine/IO/parser.h b/engine/include/engine/IO/parser.h index 88ab511..bce3cc9 100644 --- a/engine/include/engine/IO/parser.h +++ b/engine/include/engine/IO/parser.h @@ -1,7 +1,7 @@ #ifndef PARSER_H_ #define PARSER_H_ -namespace Engine { +namespace Core { // Very fast OBJ/MTL line parser class Parser { diff --git a/engine/include/engine/api.h b/engine/include/engine/api.h index c86fc8a..9500c7f 100644 --- a/engine/include/engine/api.h +++ b/engine/include/engine/api.h @@ -9,10 +9,10 @@ #include "engine/app/app.h" #include "engine/renderer/core.h" -extern Engine::IApplication* CreateApplication(); +extern Core::IApplication* CreateApplication(); int main() { - auto engine = Engine::Engine::GetInstance(); - engine->Run(std::unique_ptr(CreateApplication())); + auto engine = Core::Engine::GetInstance(); + engine->Run(std::unique_ptr(CreateApplication())); return 0; } \ No newline at end of file diff --git a/engine/include/engine/app/app.h b/engine/include/engine/app/app.h index 1489740..9b361a6 100644 --- a/engine/include/engine/app/app.h +++ b/engine/include/engine/app/app.h @@ -5,7 +5,7 @@ #include "engine/window/event.hpp" #include "engine/export.h" -namespace Engine { +namespace Core { class ENGINE_API IApplication { public: virtual ~IApplication() = default; diff --git a/engine/include/engine/components/batch.h b/engine/include/engine/components/batch.h index e41d85f..54800a3 100644 --- a/engine/include/engine/components/batch.h +++ b/engine/include/engine/components/batch.h @@ -4,7 +4,7 @@ #include #include "engine/export.h" -namespace Engine { +namespace Core { // requires mesh component struct ENGINE_API batch { friend class Renderer; diff --git a/engine/include/engine/components/camera.h b/engine/include/engine/components/camera.h index 5ab8029..9a1f41a 100644 --- a/engine/include/engine/components/camera.h +++ b/engine/include/engine/components/camera.h @@ -3,7 +3,7 @@ #include "engine/export.h" -namespace Engine { +namespace Core { struct ENGINE_API camera {}; } diff --git a/engine/include/engine/components/light.h b/engine/include/engine/components/light.h index 4192a7b..10c7aef 100644 --- a/engine/include/engine/components/light.h +++ b/engine/include/engine/components/light.h @@ -6,7 +6,7 @@ #include "engine/renderer/renderer.h" #include "engine/export.h" -namespace Engine { +namespace Core { struct ENGINE_API light { friend class Renderer; public: diff --git a/engine/include/engine/components/mesh.h b/engine/include/engine/components/mesh.h index e47b08a..177dde2 100644 --- a/engine/include/engine/components/mesh.h +++ b/engine/include/engine/components/mesh.h @@ -6,7 +6,7 @@ #include "engine/renderer/wavefront.h" #include "engine/export.h" -namespace Engine { +namespace Core { struct ENGINE_API mesh { std::shared_ptr object; }; diff --git a/engine/include/engine/components/rotate.h b/engine/include/engine/components/rotate.h index d72f46d..d050c63 100644 --- a/engine/include/engine/components/rotate.h +++ b/engine/include/engine/components/rotate.h @@ -3,7 +3,7 @@ #include "engine/export.h" -namespace Engine { +namespace Core { struct ENGINE_API rotate {}; } diff --git a/engine/include/engine/components/transform.h b/engine/include/engine/components/transform.h index 8703af2..5ae554e 100644 --- a/engine/include/engine/components/transform.h +++ b/engine/include/engine/components/transform.h @@ -4,7 +4,7 @@ #include #include "engine/export.h" -namespace Engine { +namespace Core { struct ENGINE_API transform { glm::vec3 position; glm::vec3 rotation; diff --git a/engine/include/engine/renderer/basics.h b/engine/include/engine/renderer/basics.h index 05eb299..01aba7c 100644 --- a/engine/include/engine/renderer/basics.h +++ b/engine/include/engine/renderer/basics.h @@ -3,7 +3,7 @@ #include -namespace Engine { +namespace Core { class Vertex { friend class Mesh; diff --git a/engine/include/engine/renderer/core.h b/engine/include/engine/renderer/core.h index 33b21d6..f8e8513 100644 --- a/engine/include/engine/renderer/core.h +++ b/engine/include/engine/renderer/core.h @@ -13,7 +13,7 @@ #include "engine/app/app.h" #include "engine/export.h" -namespace Engine { +namespace Core { class ENGINE_API Engine : public EventHandler { public: diff --git a/engine/include/engine/renderer/debug.h b/engine/include/engine/renderer/debug.h index 487a2df..7deed43 100644 --- a/engine/include/engine/renderer/debug.h +++ b/engine/include/engine/renderer/debug.h @@ -3,7 +3,7 @@ #include -namespace Engine { +namespace Core { void MessageCallback(GLenum source, GLenum type, diff --git a/engine/include/engine/renderer/material.h b/engine/include/engine/renderer/material.h index 8a82d4d..562e776 100644 --- a/engine/include/engine/renderer/material.h +++ b/engine/include/engine/renderer/material.h @@ -6,7 +6,7 @@ #include "engine/renderer/texture.h" -namespace Engine { +namespace Core { class Material { private: diff --git a/engine/include/engine/renderer/mesh.h b/engine/include/engine/renderer/mesh.h index f2cdd1c..05a8a57 100644 --- a/engine/include/engine/renderer/mesh.h +++ b/engine/include/engine/renderer/mesh.h @@ -7,7 +7,7 @@ #include "engine/renderer/basics.h" -namespace Engine { +namespace Core { class Mesh { public: // TODO: abstract away diff --git a/engine/include/engine/renderer/renderer.h b/engine/include/engine/renderer/renderer.h index 66aec99..ead7856 100644 --- a/engine/include/engine/renderer/renderer.h +++ b/engine/include/engine/renderer/renderer.h @@ -8,7 +8,7 @@ #include "engine/export.h" #include "engine/components/light.h" -namespace Engine { +namespace Core { // TODO: make static or singleton class ENGINE_API Renderer { diff --git a/engine/include/engine/renderer/shader.h b/engine/include/engine/renderer/shader.h index 2ad3ad0..330ea2b 100644 --- a/engine/include/engine/renderer/shader.h +++ b/engine/include/engine/renderer/shader.h @@ -7,7 +7,7 @@ #include "engine/export.h" -namespace Engine { +namespace Core { class ENGINE_API Shader { diff --git a/engine/include/engine/renderer/texture.h b/engine/include/engine/renderer/texture.h index 04a8dfb..dbe1779 100644 --- a/engine/include/engine/renderer/texture.h +++ b/engine/include/engine/renderer/texture.h @@ -3,7 +3,7 @@ #include #include -namespace Engine { +namespace Core { class Texture { public: diff --git a/engine/include/engine/renderer/wavefront.h b/engine/include/engine/renderer/wavefront.h index 55e8a81..b763996 100644 --- a/engine/include/engine/renderer/wavefront.h +++ b/engine/include/engine/renderer/wavefront.h @@ -14,7 +14,7 @@ #include "engine/export.h" -namespace Engine { +namespace Core { enum ObjElement { OHASH, MTLLIB, USEMTL, O, V, VN, VT, F, OUNKNOWN }; enum MtlElement { MHASH, NEWMTL, NS, KA, KS, KD, NI, D, ILLUM, MAP_KD, MAP_KA, MUNKNOWN }; diff --git a/engine/include/engine/scene/scene.h b/engine/include/engine/scene/scene.h index df52440..f1bad76 100644 --- a/engine/include/engine/scene/scene.h +++ b/engine/include/engine/scene/scene.h @@ -3,12 +3,11 @@ #include #include "engine/export.h" -namespace Engine { +namespace Core { class Entity; class ENGINE_API Scene { - friend class Entity; public: Scene() = default; @@ -16,6 +15,7 @@ public: private: entt::registry m_registry; friend class Renderer; + friend class Entity; }; class ENGINE_API Entity { @@ -25,16 +25,24 @@ public: Entity(const Entity& other) = default; template - auto AddComponent(Args &&...args) { - assert(this->m_entity != entt::null && "Entity is empty"); - assert(this->m_scene != nullptr && "Scene has not been assigned to the entity"); - return m_scene->m_registry.emplace(m_entity, std::forward(args)...); + void AddComponent(Args&&... args) { + assert(m_entity != entt::null && "Entity is empty"); + assert(m_scene && "Scene has not been assigned to the entity"); + + m_scene->m_registry.emplace(m_entity, std::forward(args)...); } template - [[nodiscard]] auto GetComponent() const { - assert(this->m_entity != entt::null && "Entity is empty"); - assert(this->m_scene != nullptr && "Scene has not been assigned to the entity"); + [[nodiscard]] Type& GetComponent() { + assert(m_entity != entt::null && "Entity is empty"); + assert(m_scene && "Scene has not been assigned to the entity"); + return m_scene->m_registry.get(m_entity); + } + + template + [[nodiscard]] const Type& GetComponent() const { + assert(m_entity != entt::null && "Entity is empty"); + assert(m_scene && "Scene has not been assigned to the entity"); return m_scene->m_registry.get(m_entity); } @@ -47,4 +55,4 @@ private: Scene *m_scene = nullptr; }; -} // namespace Engine +} // namespace Core diff --git a/engine/include/engine/window/event.hpp b/engine/include/engine/window/event.hpp index f04561c..c7b2281 100644 --- a/engine/include/engine/window/event.hpp +++ b/engine/include/engine/window/event.hpp @@ -7,7 +7,7 @@ #include #include -namespace Engine { +namespace Core { enum class EventType { WINDOW_RESIZE, @@ -49,13 +49,13 @@ public: EventEmitter() = default; - Handle Subscribe2(EventHandler* handler) { + Handle Subscribe(EventHandler* handler) { auto slot = Slot{ m_next_id++, handler }; m_subs.push_back(slot); return Handle{ slot.id }; } - void Unsubscribe2(const Handle& h) { + void UnSubscribe(const Handle& h) { m_subs.erase(std::remove_if(m_subs.begin(), m_subs.end(), [&](const Slot& s){ return s.id == h.id; }), m_subs.end()); diff --git a/engine/include/engine/window/events/window_events.h b/engine/include/engine/window/events/window_events.h index 6e8ca33..cfbc258 100644 --- a/engine/include/engine/window/events/window_events.h +++ b/engine/include/engine/window/events/window_events.h @@ -3,7 +3,7 @@ #include "engine/window/event.hpp" -namespace Engine { +namespace Core { class WindowEvent : public Event { public: diff --git a/engine/include/engine/window/window.h b/engine/include/engine/window/window.h index 494aca3..2810c6d 100644 --- a/engine/include/engine/window/window.h +++ b/engine/include/engine/window/window.h @@ -13,7 +13,7 @@ #define DEFAULT_WIDTH 1024 #define DEFAULT_HEIGHT 768 -namespace Engine { +namespace Core { class Window : public EventEmitter { friend class Engine; diff --git a/engine/src/IO/file_manager.cpp b/engine/src/IO/file_manager.cpp index 468cf86..8ee856c 100644 --- a/engine/src/IO/file_manager.cpp +++ b/engine/src/IO/file_manager.cpp @@ -4,7 +4,7 @@ #include #include -namespace Engine { +namespace Core { FileManager::FileManager() { diff --git a/engine/src/IO/parser.cpp b/engine/src/IO/parser.cpp index 174defd..357ceb9 100644 --- a/engine/src/IO/parser.cpp +++ b/engine/src/IO/parser.cpp @@ -4,7 +4,7 @@ #include "engine/IO/parser.h" -namespace Engine { +namespace Core { // Skip whitespace void Parser::SkipSpaces() { diff --git a/engine/src/components/batch.cpp b/engine/src/components/batch.cpp index c651246..d83d0fe 100644 --- a/engine/src/components/batch.cpp +++ b/engine/src/components/batch.cpp @@ -2,7 +2,7 @@ #include "engine/components/batch.h" -namespace Engine { +namespace Core { unsigned int batch::LastID = 0; diff --git a/engine/src/renderer/core.cpp b/engine/src/renderer/core.cpp index 960a581..c944158 100644 --- a/engine/src/renderer/core.cpp +++ b/engine/src/renderer/core.cpp @@ -5,7 +5,7 @@ #include "engine/window/event.hpp" #include "engine/renderer/wavefront.h" -namespace Engine { +namespace Core { Engine* Engine::s_instance = nullptr; @@ -19,17 +19,7 @@ void Engine::Run(std::unique_ptr app) { m_app->OnInit(m_scene); m_renderer->Init(); - // m_window->Subscribe([&](const WindowCloseEvent& e) { - - // m_app->OnEvent(e); - // }); - - // m_window->Subscribe([&](const WindowResizeEvent& e) { - // m_renderer->OnWindowResized(e.GetWidth(), e.GetHeight()); - // m_app->OnEvent(e); - // }); - - m_window->Subscribe2(this); + m_window->Subscribe(this); while (m_running) { m_window->ProcessEvents(); diff --git a/engine/src/renderer/debug.cpp b/engine/src/renderer/debug.cpp index 8f26e49..f1aff21 100644 --- a/engine/src/renderer/debug.cpp +++ b/engine/src/renderer/debug.cpp @@ -2,7 +2,7 @@ #include -namespace Engine { +namespace Core { void MessageCallback(GLenum source, GLenum type, diff --git a/engine/src/renderer/mesh.cpp b/engine/src/renderer/mesh.cpp index 47aa0cd..94c45f6 100644 --- a/engine/src/renderer/mesh.cpp +++ b/engine/src/renderer/mesh.cpp @@ -2,7 +2,7 @@ #include "engine/renderer/mesh.h" -namespace Engine { +namespace Core { Mesh::Mesh() { m_vao = 0; diff --git a/engine/src/renderer/renderer.cpp b/engine/src/renderer/renderer.cpp index 48062d3..0376d53 100644 --- a/engine/src/renderer/renderer.cpp +++ b/engine/src/renderer/renderer.cpp @@ -8,6 +8,8 @@ #define GLM_ENABLE_EXPERIMENTAL #include +#include + #include "engine/renderer/renderer.h" #include "engine/window/window.h" #include "engine/IO/file_manager.h" @@ -18,7 +20,7 @@ #include "engine/components/mesh.h" #include "engine/components/batch.h" -namespace Engine { +namespace Core { Renderer::Renderer(std::shared_ptr scene) : m_scene(scene) { @@ -117,7 +119,7 @@ void Renderer::UpdateView() { camTransform.position + camTransform.rotation, glm::vec3(0.f, 1.f, 0.f) ); - + m_shader.setVec3("viewPos", camTransform.position); m_shader.setMat4("u_view", m_view); @@ -156,7 +158,7 @@ void Renderer::RenderScene(Shader &shader) { auto prevInstanceVBO = b.m_instance_vbo; b.prepare(models.data(), models.size()); if (prevInstanceVBO <= 0) { - std::cout << "[DEBUG] enabling batch"<EnableBatch(b.m_instance_vbo); } m.object->Render(shader, batchItems.size()); diff --git a/engine/src/renderer/shader.cpp b/engine/src/renderer/shader.cpp index 82913a8..af4975e 100644 --- a/engine/src/renderer/shader.cpp +++ b/engine/src/renderer/shader.cpp @@ -2,7 +2,7 @@ #include #include "engine/renderer/shader.h" -namespace Engine { +namespace Core { Shader::Shader() { diff --git a/engine/src/renderer/texture.cpp b/engine/src/renderer/texture.cpp index e276830..a89464a 100644 --- a/engine/src/renderer/texture.cpp +++ b/engine/src/renderer/texture.cpp @@ -7,7 +7,7 @@ #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" -namespace Engine { +namespace Core { std::unique_ptr Texture::LoadFile(const std::string& filename) { auto texture = std::make_unique(); diff --git a/engine/src/renderer/wavefront.cpp b/engine/src/renderer/wavefront.cpp index 38602b2..d36d875 100644 --- a/engine/src/renderer/wavefront.cpp +++ b/engine/src/renderer/wavefront.cpp @@ -12,7 +12,7 @@ #define DEFAULT_MATERIAL_NAME "default" -namespace Engine { +namespace Core { // ObjElement toElement(const std::string &s) { // if (s == "#") return ObjElement::OHASH; diff --git a/engine/src/scene/scene.cpp b/engine/src/scene/scene.cpp index c3bb868..9d23f09 100644 --- a/engine/src/scene/scene.cpp +++ b/engine/src/scene/scene.cpp @@ -2,7 +2,7 @@ #include -namespace Engine { +namespace Core { Entity Scene::CreateEntity() { Entity entity = { m_registry.create(), this }; diff --git a/engine/src/window/window.cpp b/engine/src/window/window.cpp index 71eeb3a..b8e664f 100644 --- a/engine/src/window/window.cpp +++ b/engine/src/window/window.cpp @@ -8,7 +8,7 @@ #include "engine/renderer/debug.h" -namespace Engine { +namespace Core { std::shared_ptr Window::s_instance = nullptr; diff --git a/sandbox/src/main.cpp b/sandbox/src/main.cpp index 1f292d5..be4c0a9 100644 --- a/sandbox/src/main.cpp +++ b/sandbox/src/main.cpp @@ -23,10 +23,11 @@ #include "engine/api.h" -using namespace Engine; +using namespace Core; class Game : public IApplication { public: + Game() = default; ~Game() override {} void OnInit(std::shared_ptr scene) override { @@ -42,6 +43,8 @@ public: cameraEntity = scene->CreateEntity(); cameraEntity.AddComponent(); cameraEntity.AddComponent(glm::vec3(0.f, 2.f, 2.f)); + assert(cameraEntity.HasComponent() && "Camera doesn't have required 'camera' component"); + assert(cameraEntity.HasComponent() && "Camera doesn't have 'transform' component"); Object* targetObj = Object::LoadFile("./assets/wizard/wizard.obj"); modelEntity = scene->CreateEntity(); @@ -58,7 +61,8 @@ public: // Cube template (use shared object to avoid reloading 1000 times) std::shared_ptr cubeObj = std::shared_ptr(Object::LoadFile("./assets/grass_block/grass_block.obj")); auto batchEntt = scene->CreateEntity(); - auto cubeBatch = batchEntt.AddComponent(); + batchEntt.AddComponent(); + auto& cubeBatch = batchEntt.GetComponent(); batchEntt.AddComponent(cubeObj); assert(batchEntt.HasComponent() && "batch doesn't have any batch component!"); assert(batchEntt.HasComponent() && "batch doesn't have any mesh component!"); @@ -138,7 +142,7 @@ public: if (state[SDL_SCANCODE_SPACE]) velocity.y += 1.f; if (state[SDL_SCANCODE_LSHIFT]) velocity.y -= 1.f; - auto camTransform = cameraEntity.GetComponent(); + auto& camTransform = cameraEntity.GetComponent(); camTransform.position += velocity * deltaTime * 2.5f; // speed is e.g. 2.5f camTransform.rotation = cameraViewDirection; @@ -173,8 +177,8 @@ public: glm::vec3 sunColor = glm::mix(dayColor, sunsetColor, sunsetFactor); // Update the directional light in the registry - auto l = lightEntity.GetComponent(); - auto t = lightEntity.GetComponent(); + auto& l = lightEntity.GetComponent(); + auto& t = lightEntity.GetComponent(); if (l.type == light::LightType::DIRECTIONAL) { // "position" for directional light often stores direction vector // If your system instead uses transform.rotation, adjust accordingly