diff --git a/include/Engine/Editor/EditorSystem.h b/include/Engine/Editor/EditorSystem.h index 92e237d1..c1958818 100644 --- a/include/Engine/Editor/EditorSystem.h +++ b/include/Engine/Editor/EditorSystem.h @@ -5,7 +5,7 @@ #include "../Core/ConfigFile.h" #include "../Input/EInputCommand.h" #include "../Rendering/EPicking.h" -#include "../Rendering/RenderQueueFactory.h" +#include "../Rendering/RenderSystem.h" class EditorSystem : public ImpureSystem { diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/include/Engine/Rendering/RenderSystem.cpp similarity index 81% rename from src/Engine/Rendering/RenderQueueFactory.cpp rename to include/Engine/Rendering/RenderSystem.cpp index 69d11336..c9b3a175 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/include/Engine/Rendering/RenderSystem.cpp @@ -1,30 +1,19 @@ -#include "Rendering/RenderQueueFactory.h" +#include "RenderSystem.h" - -RenderQueueFactory::RenderQueueFactory(EventBroker* eventBroker) +RenderSystem::RenderSystem(EventBroker* eventBrokerer, RenderQueueCollection* renderQueues) + :ImpureSystem(eventBrokerer) { - m_RenderQueues = RenderQueueCollection(); - m_EventBroker = eventBroker; + m_RenderQueues = renderQueues; + Initialize(); } -void RenderQueueFactory::Update(World* world) + +void RenderSystem::Initialize() { - m_RenderQueues.Clear(); - FillModels(world, &m_RenderQueues.Forward); - FillLights(world, &m_RenderQueues.Lights); + } -glm::mat4 RenderQueueFactory::ModelMatrix(World* world, EntityID entity) -{ - glm::vec3 position = AbsolutePosition(world, entity); - glm::quat orientation = AbsoluteOrientation(world, entity); - glm::vec3 scale = AbsoluteScale(world, entity); - - glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale); - return modelMatrix; -} - -glm::vec3 RenderQueueFactory::AbsolutePosition(World* world, EntityID entity) +glm::vec3 RenderSystem::AbsolutePosition(World* world, EntityID entity) { glm::vec3 position; @@ -38,11 +27,11 @@ glm::vec3 RenderQueueFactory::AbsolutePosition(World* world, EntityID entity) } entity = parent; } while (entity != 0); - + return position; } -glm::quat RenderQueueFactory::AbsoluteOrientation(World* world, EntityID entity) +glm::quat RenderSystem::AbsoluteOrientation(World* world, EntityID entity) { glm::quat orientation; @@ -51,11 +40,11 @@ glm::quat RenderQueueFactory::AbsoluteOrientation(World* world, EntityID entity) orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation; entity = world->GetParent(entity); } while (entity != 0); - + return orientation; } -glm::vec3 RenderQueueFactory::AbsoluteScale(World* world, EntityID entity) +glm::vec3 RenderSystem::AbsoluteScale(World* world, EntityID entity) { glm::vec3 scale(1.f); @@ -68,7 +57,17 @@ glm::vec3 RenderQueueFactory::AbsoluteScale(World* world, EntityID entity) return scale; } -void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue) +glm::mat4 RenderSystem::ModelMatrix(World* world, EntityID entity) +{ + glm::vec3 position = AbsolutePosition(world, entity); + glm::quat orientation = AbsoluteOrientation(world, entity); + glm::vec3 scale = AbsoluteScale(world, entity); + + glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale); + return modelMatrix; +} + +void RenderSystem::FillModels(World* world, RenderQueue* renderQueue) { auto models = world->GetComponents("Model"); if (models == nullptr) { @@ -127,14 +126,15 @@ void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue) renderQueue->Add(job); } - - + + } } } -void RenderQueueFactory::FillLights(World* world, RenderQueue* renderQueue) + +void RenderSystem::Update(World* world, double dt) { - + m_RenderQueues->Clear(); + FillModels(world, &m_RenderQueues->Forward); } - diff --git a/include/Engine/Rendering/RenderQueueFactory.h b/include/Engine/Rendering/RenderSystem.h similarity index 50% rename from include/Engine/Rendering/RenderQueueFactory.h rename to include/Engine/Rendering/RenderSystem.h index a53a8666..5e8dce8d 100644 --- a/include/Engine/Rendering/RenderQueueFactory.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -1,37 +1,33 @@ -#ifndef RenderQueueFactory_h__ -#define RenderQueueFactory_h__ +#ifndef RenderSystem_h__ +#define RenderSystem_h__ -#include "../Core/World.h" +#include "../Core/System.h" #include "RenderQueue.h" -#include "../Core/ResourceManager.h" -#include "Model.h" #include "../GLM.h" -#include "../Core/EventBroker.h" +#include "../OpenGL.h" +#include "../Core/ResourceManager.h" #include "ESetCamera.h" +#include "Model.h" -class RenderQueueFactory +class RenderSystem : public ImpureSystem { public: - RenderQueueFactory(EventBroker* eventBroker); - void Update(World* world); - - RenderQueueCollection RenderQueues() const { return m_RenderQueues; } + RenderSystem(EventBroker* eventBrokerer, RenderQueueCollection* renderQueues); + + virtual void Update(World* world, double dt) override; static glm::vec3 AbsolutePosition(World* world, EntityID entity); static glm::quat AbsoluteOrientation(World* world, EntityID entity); static glm::vec3 AbsoluteScale(World* world, EntityID entity); private: - EventBroker* m_EventBroker; - RenderQueueCollection m_RenderQueues; - - void FillModels(World* world, RenderQueue* renderQueue); - void FillLights(World* world, RenderQueue* renderQueue); + RenderQueueCollection* m_RenderQueues; + void Initialize(); + glm::mat4 ModelMatrix(World* world, EntityID entity); - EntityID m_CurrentCamera; - + void FillModels(World* world, RenderQueue* renderQueue); }; #endif \ No newline at end of file diff --git a/include/Game/Game.h b/include/Game/Game.h index 7933c8a1..85337707 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -8,7 +8,6 @@ #include "Core/InputManager.h" #include "GUI/Frame.h" #include "Core/World.h" -#include "Rendering/RenderQueueFactory.h" #include "Input/InputProxy.h" #include "Input/KeyboardInputHandler.h" #include "Input/MouseInputHandler.h" @@ -18,6 +17,7 @@ #include "RaptorCopterSystem.h" #include "PlayerSystem.h" #include "Editor/EditorSystem.h" +#include "Rendering/RenderSystem.h" class Game { @@ -38,7 +38,7 @@ private: GUI::Frame* m_FrameStack; World* m_World; SystemPipeline* m_SystemPipeline; - RenderQueueFactory* m_RenderQueueFactory; + RenderQueueCollection* m_RenderQueues; EventRelay m_EInputCommand; bool debugOnInputCommand(const Events::InputCommand& e); diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index a56ba79c..901afd1f 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -39,7 +39,7 @@ void EditorSystem::Update(World* world, double dt) widgetModel["Visible"] = m_Visible; if (m_Selection != 0) { if (world->HasComponent(m_Selection, "Transform")) { - glm::vec3 pos = RenderQueueFactory::AbsolutePosition(world, m_Selection); + glm::vec3 pos = RenderSystem::AbsolutePosition(world, m_Selection); auto widgetTransform = world->GetComponent(m_Widget, "Transform"); widgetTransform["Position"] = pos; } else { diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 41af1cf4..d1fe7b01 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -14,8 +14,6 @@ Game::Game(int argc, char* argv[]) // Create the core event broker m_EventBroker = new EventBroker(); - m_RenderQueueFactory = new RenderQueueFactory(m_EventBroker); - // Create a world m_World = new World(); std::string mapToLoad = m_Config->Get("Debug.LoadMap", ""); @@ -49,12 +47,13 @@ Game::Game(int argc, char* argv[]) m_FrameStack->Height = m_Renderer->Resolution().Height; - + m_RenderQueues = new RenderQueueCollection(); // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); + m_SystemPipeline->AddSystem(m_RenderQueues); m_LastTime = glfwGetTime(); @@ -90,9 +89,8 @@ void Game::Tick() debugTick(dt); m_Renderer->Update(dt); - m_RenderQueueFactory->Update(m_World); GLERROR("Game::Tick m_RenderQueueFactory->Update"); - m_Renderer->Draw(m_RenderQueueFactory->RenderQueues()); + m_Renderer->Draw(*m_RenderQueues); GLERROR("Game::Tick m_Renderer->Draw"); m_EventBroker->Swap(); m_EventBroker->Clear();