diff --git a/CMakeLists.txt b/CMakeLists.txt index 3510575..defdc07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,6 +124,18 @@ add_executable(ColorRace engine/src/ecs/Entity.h engine/src/ecs/ComponentPool.cpp engine/src/ecs/ComponentPool.h + engine/src/ecs/standardComponents/TransformComponent.h + engine/src/ecs/standardComponents/MeshComponent.h + engine/src/ecs/EntitySystem.cpp + engine/src/ecs/EntitySystem.h + engine/src/renderer/RenderSystem.cpp + engine/src/renderer/RenderSystem.h + engine/src/renderer/RenderQueue.cpp + engine/src/renderer/RenderQueue.h + engine/src/renderer/MeshRenderSystem.cpp + engine/src/renderer/MeshRenderSystem.h + engine/src/renderer/MeshRenderer.cpp + engine/src/renderer/MeshRenderer.h ) diff --git a/engine/src/ecs/EntitySystem.cpp b/engine/src/ecs/EntitySystem.cpp new file mode 100644 index 0000000..5e6f63e --- /dev/null +++ b/engine/src/ecs/EntitySystem.cpp @@ -0,0 +1,5 @@ +// +// Created by sebastian on 29.07.26. +// + +#include "EntitySystem.h" diff --git a/engine/src/ecs/EntitySystem.h b/engine/src/ecs/EntitySystem.h new file mode 100644 index 0000000..ef84893 --- /dev/null +++ b/engine/src/ecs/EntitySystem.h @@ -0,0 +1,18 @@ +// +// Created by sebastian on 29.07.26. +// + +#ifndef COLORRACE_ENTITYSYSTEM_H +#define COLORRACE_ENTITYSYSTEM_H +#include "EntityRegistry.h" + + +class EntitySystem { +public: + virtual ~EntitySystem() = default; + + virtual void update(engine::EntityRegistry& registry, float deltaTime) = 0; +}; + + +#endif //COLORRACE_ENTITYSYSTEM_H diff --git a/engine/src/ecs/standardComponents/MeshComponent.h b/engine/src/ecs/standardComponents/MeshComponent.h new file mode 100644 index 0000000..be320e4 --- /dev/null +++ b/engine/src/ecs/standardComponents/MeshComponent.h @@ -0,0 +1,16 @@ +// +// Created by sebastian on 29.07.26. +// + +#ifndef COLORRACE_MESHCOMPONENT_H +#define COLORRACE_MESHCOMPONENT_H +#include + +#include "renderer/model/RawModel.h" + +namespace engine { + struct MeshComponent { + std::shared_ptr raw_model; + }; +} +#endif //COLORRACE_MESHCOMPONENT_H diff --git a/engine/src/ecs/standardComponents/TransformComponent.h b/engine/src/ecs/standardComponents/TransformComponent.h new file mode 100644 index 0000000..98d8275 --- /dev/null +++ b/engine/src/ecs/standardComponents/TransformComponent.h @@ -0,0 +1,28 @@ +// +// Created by sebastian on 29.07.26. +// + +#ifndef COLORRACE_TRANSFORMCOMPONENT_H +#define COLORRACE_TRANSFORMCOMPONENT_H +#include "glm/glm.hpp" +#include + +namespace engine { + struct TransformComponent { + glm::vec3 m_position; + glm::vec3 m_rotation; + glm::vec3 m_scale; + + [[nodiscard]] glm::mat4 computeModelMatrix() const { + auto modelMatrix = glm::mat4(1.0f); + modelMatrix = glm::translate(modelMatrix, m_position); + modelMatrix = glm::rotate(modelMatrix, glm::radians(m_rotation.x), {1.0f, 0.0f, 0.0f}); + modelMatrix = glm::rotate(modelMatrix, glm::radians(m_rotation.y), {0.0f, 1.0f, 0.0f}); + modelMatrix = glm::rotate(modelMatrix, glm::radians(m_rotation.z), {0.0f, 0.0f, 1.0f}); + modelMatrix = glm::scale(modelMatrix, m_scale); + return modelMatrix; + } + }; + +} +#endif //COLORRACE_TRANSFORMCOMPONENT_H diff --git a/engine/src/renderer/MeshRenderSystem.cpp b/engine/src/renderer/MeshRenderSystem.cpp new file mode 100644 index 0000000..b48339a --- /dev/null +++ b/engine/src/renderer/MeshRenderSystem.cpp @@ -0,0 +1,24 @@ +// +// Created by sebastian on 29.07.26. +// + +#include "MeshRenderSystem.h" + +#include "ecs/standardComponents/MeshComponent.h" +#include "ecs/standardComponents/TransformComponent.h" + + +void engine::MeshRenderSystem::update(engine::EntityRegistry ®istry, engine::RenderQueue &renderQueue) { + auto transforms = registry.getPool(); + auto meshes = registry.getPool(); + + for (auto& [entity, mesh] : meshes) + { + if (!transforms.has(entity)) + continue; + + auto& transform = transforms.get(entity); + + renderQueue.submit(engine::RenderCommand(mesh.raw_model, transform.computeModelMatrix())); + } +} diff --git a/engine/src/renderer/MeshRenderSystem.h b/engine/src/renderer/MeshRenderSystem.h new file mode 100644 index 0000000..cac525c --- /dev/null +++ b/engine/src/renderer/MeshRenderSystem.h @@ -0,0 +1,18 @@ +// +// Created by sebastian on 29.07.26. +// + +#ifndef COLORRACE_MESHRENDERSYSTEM_H +#define COLORRACE_MESHRENDERSYSTEM_H +#include "RenderSystem.h" + + +namespace engine { + class MeshRenderSystem : public engine::RenderSystem { + public: + void update(engine::EntityRegistry ®istry, engine::RenderQueue &renderQueue) override; + }; + +} + +#endif //COLORRACE_MESHRENDERSYSTEM_H diff --git a/engine/src/renderer/MeshRenderer.cpp b/engine/src/renderer/MeshRenderer.cpp new file mode 100644 index 0000000..03cb4bd --- /dev/null +++ b/engine/src/renderer/MeshRenderer.cpp @@ -0,0 +1,21 @@ +// +// Created by sebastian on 29.07.26. +// + +#include "MeshRenderer.h" + +void engine::MeshRenderer::render(RenderQueue &queue, const Camera &camera) { + m_shader->start(); + m_shader->loadViewMatrix(camera.getViewMatrix()); + m_shader->loadProjectionMatrix(camera.getProjectionMatrix()); + + for (const auto&[mesh, transformationMatrix] : queue.getRenderCommands()) { + m_shader->loadTransformationMatrix(transformationMatrix); + + mesh->bind(); + mesh->draw(); + mesh->unbind(); + } + + m_shader->stop(); +} diff --git a/engine/src/renderer/MeshRenderer.h b/engine/src/renderer/MeshRenderer.h new file mode 100644 index 0000000..3f0c7bf --- /dev/null +++ b/engine/src/renderer/MeshRenderer.h @@ -0,0 +1,23 @@ +// +// Created by sebastian on 29.07.26. +// + +#ifndef COLORRACE_MESHRENDERER_H +#define COLORRACE_MESHRENDERER_H +#include "RenderQueue.h" +#include "entities/Camera.h" +#include "shader/StaticShader.h" + + +namespace engine { + class MeshRenderer { + public: + MeshRenderer() : m_shader(std::make_unique()) {} + void render(RenderQueue& queue, const Camera& camera); + private: + std::unique_ptr m_shader; + }; + +} + +#endif //COLORRACE_MESHRENDERER_H diff --git a/engine/src/renderer/RenderQueue.cpp b/engine/src/renderer/RenderQueue.cpp new file mode 100644 index 0000000..6476e44 --- /dev/null +++ b/engine/src/renderer/RenderQueue.cpp @@ -0,0 +1,5 @@ +// +// Created by sebastian on 29.07.26. +// + +#include "RenderQueue.h" diff --git a/engine/src/renderer/RenderQueue.h b/engine/src/renderer/RenderQueue.h new file mode 100644 index 0000000..fd5d8d5 --- /dev/null +++ b/engine/src/renderer/RenderQueue.h @@ -0,0 +1,39 @@ +// +// Created by sebastian on 29.07.26. +// + +#ifndef COLORRACE_RENDERQUEUE_H +#define COLORRACE_RENDERQUEUE_H +#include + +#include "glm/glm.hpp" +#include "model/RawModel.h" + +namespace engine { + struct RenderCommand { + std::shared_ptr mesh; + glm::mat4 transformationMatrix; + }; + + class RenderQueue { + public: + void submit(RenderCommand cmd) { + m_renderCommands.push_back(std::move(cmd)); + } + + [[nodiscard]] const auto& getRenderCommands() const { + return m_renderCommands; + } + + void clear() { + m_renderCommands.clear(); + } + + private: + std::vector m_renderCommands; + }; +} + + + +#endif //COLORRACE_RENDERQUEUE_H diff --git a/engine/src/renderer/RenderSystem.cpp b/engine/src/renderer/RenderSystem.cpp new file mode 100644 index 0000000..3aedaad --- /dev/null +++ b/engine/src/renderer/RenderSystem.cpp @@ -0,0 +1,5 @@ +// +// Created by sebastian on 29.07.26. +// + +#include "RenderSystem.h" diff --git a/engine/src/renderer/RenderSystem.h b/engine/src/renderer/RenderSystem.h new file mode 100644 index 0000000..ce5798f --- /dev/null +++ b/engine/src/renderer/RenderSystem.h @@ -0,0 +1,21 @@ +// +// Created by sebastian on 29.07.26. +// + +#ifndef COLORRACE_RENDERSYSTEM_H +#define COLORRACE_RENDERSYSTEM_H +#include "RenderQueue.h" +#include "ecs/EntityRegistry.h" + + +namespace engine { + class RenderSystem { + public: + virtual ~RenderSystem() = default; + virtual void update(EntityRegistry& registry, RenderQueue& renderQueue) = 0; + + }; +} + + +#endif //COLORRACE_RENDERSYSTEM_H diff --git a/game/src/ColorRaceApp.cpp b/game/src/ColorRaceApp.cpp index c3bcdcb..b1c669f 100644 --- a/game/src/ColorRaceApp.cpp +++ b/game/src/ColorRaceApp.cpp @@ -7,21 +7,22 @@ #include #include +#include "renderer/MeshRenderSystem.h" +#include "renderer/RenderSystem.h" void ColorRaceApp::onUpdate(float deltaTime) { - m_cubeEntity->increaseRotation(glm::vec3(0, 1, 0)); + } void ColorRaceApp::onRender() { m_renderState.apply(); - m_shader->start(); - m_shader->loadTransformationMatrix(m_cubeEntity->getModelMatrix()); - m_shader->loadViewMatrix(m_camera->getViewMatrix()); - m_shader->loadProjectionMatrix(m_camera->getProjectionMatrix()); - m_cubeEntity->getModel().bind(); - m_cubeEntity->getModel().draw(); - m_cubeEntity->getModel().unbind(); - m_shader->stop(); + engine::MeshRenderSystem meshRenderSystem; + + engine::RenderQueue queue; + meshRenderSystem.update(*entityRegistry, queue); + + m_renderer->render(queue, *m_camera); + } \ No newline at end of file diff --git a/game/src/ColorRaceApp.h b/game/src/ColorRaceApp.h index 53f7a04..b477003 100644 --- a/game/src/ColorRaceApp.h +++ b/game/src/ColorRaceApp.h @@ -5,7 +5,10 @@ #ifndef COLORRACE_COLORRACEAPP_H #define COLORRACE_COLORRACEAPP_H #include "core/Application.h" -#include "../../engine/src/renderer/entities/Entity.h" +#include "ecs/EntityRegistry.h" +#include "ecs/standardComponents/MeshComponent.h" +#include "ecs/standardComponents/TransformComponent.h" +#include "renderer/MeshRenderer.h" #include "renderer/entities/Camera.h" #include "renderer/primitives/CubeFactory.h" #include "renderer/shader/StaticShader.h" @@ -38,12 +41,23 @@ public: m_camera->setPitch(0.0f); auto cubeModel = engine::CubeFactory::createCube(); - m_cubeEntity = std::make_unique(cubeModel); + + entityRegistry = std::make_unique(); + + const auto transformComponent = engine::TransformComponent({0,0,0}, {0,0,0}, {1,1,1}); + const auto meshComponent = engine::MeshComponent(std::move(cubeModel)); + + const auto entity = entityRegistry->createEntity(); + entityRegistry->addComponent<>(entity, transformComponent); + entityRegistry->addComponent(entity, meshComponent); + + m_renderer = std::make_unique(); } private: engine::GLRenderState m_renderState; + std::unique_ptr entityRegistry; std::unique_ptr m_shader; - std::unique_ptr m_cubeEntity; + std::unique_ptr m_renderer; std::unique_ptr m_camera; protected: void onUpdate(float deltaTime) override;