From 05b78265befea045240e179c6dee501036adf22a Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 14 Dec 2015 19:10:00 +0100 Subject: [PATCH 01/14] Fixed some transparency bugs and started on component based camera --- assets | 2 +- include/Engine/Rendering/DrawScenePass.h | 6 +++ include/Engine/Rendering/ESetCamera.h | 23 ++++++++ include/Engine/Rendering/RawModel.h | 1 + include/Engine/Rendering/RenderQueue.h | 31 +++++++++++ include/Engine/Rendering/RenderQueueFactory.h | 8 ++- include/Engine/Rendering/Renderer.h | 4 +- resources/Schema/Components.xsd | 1 + resources/Schema/Components/Camera.xml | 6 +++ resources/Schema/Components/Camera.xsd | 19 +++++++ resources/Schema/Entities/Test.xml | 16 +----- src/Engine/Rendering/DrawScenePass.cpp | 1 + src/Engine/Rendering/DrawScenePassState.cpp | 2 + src/Engine/Rendering/RawModel.cpp | 8 ++- src/Engine/Rendering/RenderQueueFactory.cpp | 52 ++++++++++++++----- src/Engine/Rendering/Renderer.cpp | 32 +----------- src/Game/Game.cpp | 20 +++---- 17 files changed, 160 insertions(+), 72 deletions(-) create mode 100644 include/Engine/Rendering/ESetCamera.h create mode 100644 resources/Schema/Components/Camera.xml create mode 100644 resources/Schema/Components/Camera.xsd diff --git a/assets b/assets index b3746822..c5f67434 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit b37468222e45ec0b2116f1543c578cb9784d43f2 +Subproject commit c5f674349a915ab1a2b4da632d87a9832d1f6fab diff --git a/include/Engine/Rendering/DrawScenePass.h b/include/Engine/Rendering/DrawScenePass.h index 782c5a49..db52f746 100644 --- a/include/Engine/Rendering/DrawScenePass.h +++ b/include/Engine/Rendering/DrawScenePass.h @@ -25,12 +25,18 @@ public: private: void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; + static bool DepthSort(const std::shared_ptr &i, const std::shared_ptr &j) + { + return (i->Depth < j->Depth); + }; + Texture* m_WhiteTexture; const IRenderer* m_Renderer; ShaderProgram* m_BasicForwardProgram; + }; #endif \ No newline at end of file diff --git a/include/Engine/Rendering/ESetCamera.h b/include/Engine/Rendering/ESetCamera.h new file mode 100644 index 00000000..cf5b0a87 --- /dev/null +++ b/include/Engine/Rendering/ESetCamera.h @@ -0,0 +1,23 @@ +#ifndef Events_SetCamera_h__ +#define Events_SetCamera_h__ + +#include "../Core/EventBroker.h" +#include "../Core/Entity.h" + +namespace Events +{ + +/** Thrown Every frame, use functions to pick*/ +struct SetCamera : Event +{ +public: + SetCamera() { }; + EntityID Entity; + +private: + +}; + +} + +#endif diff --git a/include/Engine/Rendering/RawModel.h b/include/Engine/Rendering/RawModel.h index c8226168..d63e46bb 100644 --- a/include/Engine/Rendering/RawModel.h +++ b/include/Engine/Rendering/RawModel.h @@ -46,6 +46,7 @@ public: struct MaterialGroup { float Shininess; + float Transparency; std::shared_ptr<::Texture> Texture; std::shared_ptr<::Texture> NormalMap; std::shared_ptr<::Texture> SpecularMap; diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 2942c743..1586aef6 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -63,6 +63,37 @@ struct ModelJob : RenderJob } }; +struct TransparentModelJob : RenderJob +{ + unsigned int ShaderID = 0; + unsigned int TextureID = 0; + + //TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this + EntityID Entity; + + glm::mat4 ModelMatrix; + const Texture* DiffuseTexture; + const Texture* NormalTexture; + const Texture* SpecularTexture; + float Shininess = 0.f; + glm::vec4 Color; + const Model* Model = nullptr; + unsigned int StartIndex = 0; + unsigned int EndIndex = 0; + + // Animation + Skeleton* Skeleton = nullptr; + bool NoRootMotion = true; + std::string AnimationName; + double AnimationTime = 0; + + void CalculateHash() override + { + Hash = TextureID; + } +}; + + struct SpriteJob : RenderJob { unsigned int ShaderID = 0; diff --git a/include/Engine/Rendering/RenderQueueFactory.h b/include/Engine/Rendering/RenderQueueFactory.h index b273b672..ff51a515 100644 --- a/include/Engine/Rendering/RenderQueueFactory.h +++ b/include/Engine/Rendering/RenderQueueFactory.h @@ -6,16 +6,19 @@ #include "../Core/ResourceManager.h" #include "Model.h" #include "../GLM.h" +#include "../Core/EventBroker.h" +#include "ESetCamera.h" class RenderQueueFactory { public: - RenderQueueFactory(); + RenderQueueFactory(EventBroker* eventBroker); void Update(World* world); RenderQueueCollection RenderQueues() const { return m_RenderQueues; } private: + EventBroker* m_EventBroker; RenderQueueCollection m_RenderQueues; void FillModels(World* world, RenderQueue* renderQueue); @@ -26,6 +29,9 @@ private: glm::vec3 AbsolutePosition(World* world, EntityID entity); glm::quat AbsoluteOrientation(World* world, EntityID entity); glm::vec3 AbsoluteScale(World* world, EntityID entity); + + EntityID m_CurrentCamera; + }; #endif \ No newline at end of file diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 886c98ca..c304e879 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -32,8 +32,9 @@ enum lightType class Renderer : public IRenderer { public: - Renderer(EventBroker* eventBroker) + Renderer(EventBroker* eventBroker, World* world) : m_EventBroker(eventBroker) + , m_World(world) { } virtual void Initialize() override; @@ -43,6 +44,7 @@ public: private: //----------------------Variables----------------------// EventBroker* m_EventBroker; + World* m_World; Texture* m_ErrorTexture; Texture* m_WhiteTexture; diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index 12fb870e..448d416d 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -6,4 +6,5 @@ + \ No newline at end of file diff --git a/resources/Schema/Components/Camera.xml b/resources/Schema/Components/Camera.xml new file mode 100644 index 00000000..6b9e70d4 --- /dev/null +++ b/resources/Schema/Components/Camera.xml @@ -0,0 +1,6 @@ + + 1.77 + 90 + 0.01 + 5000 + \ No newline at end of file diff --git a/resources/Schema/Components/Camera.xsd b/resources/Schema/Components/Camera.xsd new file mode 100644 index 00000000..1ac8c394 --- /dev/null +++ b/resources/Schema/Components/Camera.xsd @@ -0,0 +1,19 @@ + + + + + + + + It's a camera thingy! + + + + + + + + + + + \ No newline at end of file diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 78494ce1..e59d8029 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -13,22 +13,10 @@ - - - Models/ScaleWidget.obj - - - - - - - - - - Models/RotationWidget.obj - + + diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index 559a0f58..36bf7e81 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -32,6 +32,7 @@ void DrawScenePass::Draw(RenderQueueCollection& rq) DrawScenePassState state; + rq.Forward.Jobs.sort(DrawScenePass::DepthSort); //TODO: Render: Add code for more jobs than modeljobs. for (auto &job : rq.Forward) { diff --git a/src/Engine/Rendering/DrawScenePassState.cpp b/src/Engine/Rendering/DrawScenePassState.cpp index 59654775..fdfe1802 100644 --- a/src/Engine/Rendering/DrawScenePassState.cpp +++ b/src/Engine/Rendering/DrawScenePassState.cpp @@ -8,6 +8,8 @@ DrawScenePassState::DrawScenePassState() GLERROR("---"); Enable(GL_DEPTH_TEST); Enable(GL_CULL_FACE); + Enable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); ClearColor(glm::vec4(255.f / 255, 163.f / 255, 176.f / 255, 0.f)); Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } diff --git a/src/Engine/Rendering/RawModel.cpp b/src/Engine/Rendering/RawModel.cpp index 962c278f..3e7c472c 100644 --- a/src/Engine/Rendering/RawModel.cpp +++ b/src/Engine/Rendering/RawModel.cpp @@ -78,7 +78,12 @@ RawModel::RawModel(std::string fileName) // Material diffuse color aiColor4D diffuse; material->Get(AI_MATKEY_COLOR_DIFFUSE, diffuse); - desc.DiffuseVertexColor = glm::vec4(diffuse.r, diffuse.g, diffuse.b, diffuse.a); + + float opacity; + material->Get(AI_MATKEY_OPACITY, opacity); + + desc.DiffuseVertexColor = glm::vec4(diffuse.r, diffuse.g, diffuse.b, opacity); + // Material specular color aiColor4D specular; material->Get(AI_MATKEY_COLOR_SPECULAR, specular); @@ -132,6 +137,7 @@ RawModel::RawModel(std::string fileName) matGroup.EndIndex = m_Indices.size() - 1; // Material shininess material->Get(AI_MATKEY_SHININESS, matGroup.Shininess); + material->Get(AI_MATKEY_OPACITY, matGroup.Transparency); //LOG_DEBUG("Shininess: %f", matGroup.Shininess); // Diffuse texture //LOG_DEBUG("%i diffuse textures found", material->GetTextureCount(aiTextureType_DIFFUSE)); diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 4b82647c..77088fc0 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -1,9 +1,10 @@ #include "Rendering/RenderQueueFactory.h" -RenderQueueFactory::RenderQueueFactory() +RenderQueueFactory::RenderQueueFactory(EventBroker* eventBroker) { m_RenderQueues = RenderQueueCollection(); + m_EventBroker = eventBroker; } void RenderQueueFactory::Update(World* world) @@ -79,21 +80,44 @@ void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue) Model* model = ResourceManager::Load(resource); for (auto texGroup : model->TextureGroups) { - ModelJob job; - job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; - job.DiffuseTexture = texGroup.Texture.get(); - job.NormalTexture = texGroup.NormalMap.get(); - job.SpecularTexture = texGroup.SpecularMap.get(); - job.Model = model; - job.StartIndex = texGroup.StartIndex; - job.EndIndex = texGroup.EndIndex; - job.ModelMatrix = model->m_Matrix * ModelMatrix(world, modelC.EntityID); - job.Color = color; - //TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this - job.Entity = modelC.EntityID; + if (color.a < 1.0f || texGroup.Transparency < 1.0f) { + //transparent stuffs + TransparentModelJob job; + job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; + job.DiffuseTexture = texGroup.Texture.get(); + job.NormalTexture = texGroup.NormalMap.get(); + job.SpecularTexture = texGroup.SpecularMap.get(); + job.Model = model; + job.StartIndex = texGroup.StartIndex; + job.EndIndex = texGroup.EndIndex; + job.ModelMatrix = model->m_Matrix * ModelMatrix(world, modelC.EntityID); + job.Color = color; - renderQueue->Add(job); + job.Entity = modelC.EntityID; + job.Depth = 10.f; //insert real viewspace depth here + + renderQueue->Add(job); + } else { + ModelJob job; + job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; + job.DiffuseTexture = texGroup.Texture.get(); + job.NormalTexture = texGroup.NormalMap.get(); + job.SpecularTexture = texGroup.SpecularMap.get(); + job.Model = model; + job.StartIndex = texGroup.StartIndex; + job.EndIndex = texGroup.EndIndex; + job.ModelMatrix = model->m_Matrix * ModelMatrix(world, modelC.EntityID); + job.Color = color; + + //TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this + job.Entity = modelC.EntityID; + + renderQueue->Add(job); + } + + + } } } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index c4fa33c4..13538dfb 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -10,6 +10,7 @@ void Renderer::Initialize() if (m_Camera == nullptr) { m_Camera = m_DefaultCamera; } + TEMPCreateLights(); InitializeRenderPasses(); @@ -88,36 +89,6 @@ void Renderer::InitializeShaders() void Renderer::InputUpdate(double dt) { static DebugCameraInputController firstPersonInputController(m_EventBroker, -1); - - glm::vec3 m_Position = m_Camera->Position(); - if (glfwGetKey(m_Window, GLFW_KEY_O) == GLFW_PRESS) - { - m_Position = glm::vec3(0.f, 0.f, 5.f); - } - if (glfwGetKey(m_Window, GLFW_KEY_W) == GLFW_PRESS) - { - m_Position += m_Camera->Forward() * m_CameraMoveSpeed * (float)dt; - } - if (glfwGetKey(m_Window, GLFW_KEY_S) == GLFW_PRESS) - { - m_Position -= m_Camera->Forward() * m_CameraMoveSpeed * (float)dt; - } - if (glfwGetKey(m_Window, GLFW_KEY_D) == GLFW_PRESS) - { - m_Position += m_Camera->Right() * m_CameraMoveSpeed * (float)dt; - } - if (glfwGetKey(m_Window, GLFW_KEY_A) == GLFW_PRESS) - { - m_Position -= m_Camera->Right() * m_CameraMoveSpeed * (float)dt; - } - if (glfwGetKey(m_Window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) - { - m_CameraMoveSpeed = 5.f; - } - else { - m_CameraMoveSpeed = 0.5f; - } - firstPersonInputController.Update(dt); m_Camera->SetOrientation(firstPersonInputController.Orientation()); m_Camera->SetPosition(firstPersonInputController.Position()); @@ -237,7 +208,6 @@ void Renderer::CalculateFrustum() { GLERROR("CalculateFrustum Error-1"); m_CalculateFrustumProgram->Bind(); - GLERROR("CalculateFrustum Error1"); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); GLERROR("CalculateFrustum Error2"); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index af96eb29..02ef90c8 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -14,10 +14,17 @@ Game::Game(int argc, char* argv[]) // Create the core event broker m_EventBroker = new EventBroker(); - m_RenderQueueFactory = new RenderQueueFactory(); + m_RenderQueueFactory = new RenderQueueFactory(m_EventBroker); + + // Create a world + m_World = new World(); + std::string mapToLoad = m_Config->Get("Debug.LoadMap", ""); + if (!mapToLoad.empty()) { + ResourceManager::Load(mapToLoad)->PopulateWorld(m_World); + } // Create the renderer - m_Renderer = new Renderer(m_EventBroker); + m_Renderer = new Renderer(m_EventBroker, m_World); m_Renderer->SetFullscreen(m_Config->Get("Video.Fullscreen", false)); m_Renderer->SetVSYNC(m_Config->Get("Video.VSYNC", false)); m_Renderer->SetResolution(Rectangle( @@ -27,7 +34,7 @@ Game::Game(int argc, char* argv[]) m_Config->Get("Video.Height", 720) )); m_Renderer->Initialize(); - m_Renderer->Camera()->SetFOV(glm::radians(m_Config->Get("Video.FOV", 90.f))); + //m_Renderer->Camera()->SetFOV(glm::radians(m_Config->Get("Video.FOV", 90.f))); // Create input manager m_InputManager = new InputManager(m_Renderer->Window(), m_EventBroker); @@ -41,12 +48,7 @@ Game::Game(int argc, char* argv[]) m_FrameStack->Width = m_Renderer->Resolution().Width; m_FrameStack->Height = m_Renderer->Resolution().Height; - // Create a world - m_World = new World(); - std::string mapToLoad = m_Config->Get("Debug.LoadMap", ""); - if (!mapToLoad.empty()) { - ResourceManager::Load(mapToLoad)->PopulateWorld(m_World); - } + // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); From d9ea0192d1ddaca496e8ef1015606dc05cbf30a0 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 14 Dec 2015 20:07:02 +0100 Subject: [PATCH 02/14] Added RenderSystem and removed RenderQueueFactory --- include/Engine/Editor/EditorSystem.h | 2 +- .../Engine/Rendering/RenderSystem.cpp | 60 +++++++++---------- .../{RenderQueueFactory.h => RenderSystem.h} | 32 +++++----- include/Game/Game.h | 4 +- src/Engine/Editor/EditorSystem.cpp | 2 +- src/Game/Game.cpp | 8 +-- 6 files changed, 51 insertions(+), 57 deletions(-) rename src/Engine/Rendering/RenderQueueFactory.cpp => include/Engine/Rendering/RenderSystem.cpp (81%) rename include/Engine/Rendering/{RenderQueueFactory.h => RenderSystem.h} (50%) 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(); From fa66e9ff477ef9b406c8d07c3e0aebe4163c2ba9 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Tue, 15 Dec 2015 15:29:19 +0100 Subject: [PATCH 03/14] Camera Switch event now working, Camera models Rotation still bugged --- assets | 2 +- .../Rendering/DebugCameraInputController.h | 3 + include/Engine/Rendering/IRenderer.h | 12 -- include/Engine/Rendering/RenderQueue.h | 4 +- include/Engine/Rendering/RenderSystem.cpp | 110 ++++++++++++++++-- include/Engine/Rendering/RenderSystem.h | 19 ++- include/Engine/Rendering/Renderer.h | 1 - resources/Schema/Components/Camera.xml | 2 +- resources/Schema/Entities/Test.xml | 16 ++- resources/Shaders/BasicForward.frag.glsl | 4 +- resources/Shaders/BasicForward.vert.glsl | 6 +- resources/Shaders/Picking.vert.glsl | 6 +- src/Engine/Rendering/DrawScenePass.cpp | 4 +- src/Engine/Rendering/DummyRenderer.cpp | 7 -- src/Engine/Rendering/PickingPass.cpp | 14 +-- src/Engine/Rendering/Renderer.cpp | 33 ++---- 16 files changed, 164 insertions(+), 79 deletions(-) diff --git a/assets b/assets index c5f67434..008f7278 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit c5f674349a915ab1a2b4da632d87a9832d1f6fab +Subproject commit 008f7278216a1750e9f270c70a75c1cd1859bf1f diff --git a/include/Engine/Rendering/DebugCameraInputController.h b/include/Engine/Rendering/DebugCameraInputController.h index 614b071c..4d74e288 100644 --- a/include/Engine/Rendering/DebugCameraInputController.h +++ b/include/Engine/Rendering/DebugCameraInputController.h @@ -9,6 +9,9 @@ public: : FirstPersonInputController(eventBroker, playerID) { } + void SetPosition(const glm::vec3 position) { m_Position = position; } + void SetOrientation(const glm::quat orientation) { m_Orientation = orientation; } + const glm::vec3 Position() const { return m_Position; } void SetBaseSpeed(float speed) { m_BaseSpeed = speed; } diff --git a/include/Engine/Rendering/IRenderer.h b/include/Engine/Rendering/IRenderer.h index 1acb2454..d11eb481 100644 --- a/include/Engine/Rendering/IRenderer.h +++ b/include/Engine/Rendering/IRenderer.h @@ -20,16 +20,6 @@ public: void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; } bool VSYNC() const { return m_VSYNC; } void SetVSYNC(bool vsync) { m_VSYNC = vsync; } - ::Camera* Camera() const { return m_Camera; } - void SetCamera(::Camera* camera) - { - if (camera == nullptr) { - m_Camera = m_DefaultCamera; - } else { - m_Camera = camera; - } - } - virtual void Initialize() = 0; virtual void Update(double dt) = 0; virtual void Draw(RenderQueueCollection& rq) = 0; @@ -40,8 +30,6 @@ protected: bool m_VSYNC = false; int m_GLVersion[2]; std::string m_GLVendor; - ::Camera* m_DefaultCamera; - ::Camera* m_Camera = nullptr; GLFWwindow* m_Window = nullptr; }; diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 1586aef6..5e504913 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -41,7 +41,7 @@ struct ModelJob : RenderJob //TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this EntityID Entity; - glm::mat4 ModelMatrix; + glm::mat4 Matrix; const Texture* DiffuseTexture; const Texture* NormalTexture; const Texture* SpecularTexture; @@ -71,7 +71,7 @@ struct TransparentModelJob : RenderJob //TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this EntityID Entity; - glm::mat4 ModelMatrix; + glm::mat4 Matrix; const Texture* DiffuseTexture; const Texture* NormalTexture; const Texture* SpecularTexture; diff --git a/include/Engine/Rendering/RenderSystem.cpp b/include/Engine/Rendering/RenderSystem.cpp index c9b3a175..e9183f7a 100644 --- a/include/Engine/Rendering/RenderSystem.cpp +++ b/include/Engine/Rendering/RenderSystem.cpp @@ -1,16 +1,52 @@ -#include "RenderSystem.h" +#include "Rendering/RenderSystem.h" +#include "Rendering/DebugCameraInputController.h" RenderSystem::RenderSystem(EventBroker* eventBrokerer, RenderQueueCollection* renderQueues) :ImpureSystem(eventBrokerer) { m_RenderQueues = renderQueues; Initialize(); + EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera); + EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand); } +bool RenderSystem::OnSetCamera(const Events::SetCamera &event) +{ + m_CurrentCamera = event.Entity; + return true; +} + +void RenderSystem::SwitchCamera(EntityID entity) +{ + m_CurrentCamera = entity; + m_SwitchCamera = false; + LOG_INFO("Switched to camera %i", m_CurrentCamera); +} + void RenderSystem::Initialize() { + +} +void RenderSystem::UpdateViewMatrix(ComponentWrapper& cameraTransform) +{ + glm::quat orientation = cameraTransform["Orientation"]; + glm::vec3 position = cameraTransform["Position"]; + + m_ViewMatrix = glm::toMat4(glm::inverse(orientation)) * glm::translate(-position); +} + +void RenderSystem::UpdateProjectionMatrix(ComponentWrapper& cameraComponent) +{ + double fov = (double&)cameraComponent["FOV"]; + double aspectRatio = (double&)cameraComponent["AspectRatio"]; + double nearClip = (double&)cameraComponent["NearClip"]; + double farClip = (double&)cameraComponent["FarClip"]; + + double fovY = atan(tan(glm::radians(fov)/2.0) * aspectRatio) * 2.0; + m_ProjectionMatrix = glm::perspective(fovY, aspectRatio, nearClip, farClip); + } glm::vec3 RenderSystem::AbsolutePosition(World* world, EntityID entity) @@ -57,6 +93,7 @@ glm::vec3 RenderSystem::AbsoluteScale(World* world, EntityID entity) return scale; } + glm::mat4 RenderSystem::ModelMatrix(World* world, EntityID entity) { glm::vec3 position = AbsolutePosition(world, entity); @@ -101,10 +138,10 @@ void RenderSystem::FillModels(World* world, RenderQueue* renderQueue) job.Model = model; job.StartIndex = texGroup.StartIndex; job.EndIndex = texGroup.EndIndex; - job.ModelMatrix = model->m_Matrix * ModelMatrix(world, modelC.EntityID); + job.Matrix = m_ProjectionMatrix * m_ViewMatrix * (model->m_Matrix * ModelMatrix(world, modelC.EntityID)); job.Color = color; - job.Entity = modelC.EntityID; + job.Depth = 10.f; //insert real viewspace depth here renderQueue->Add(job); @@ -117,24 +154,79 @@ void RenderSystem::FillModels(World* world, RenderQueue* renderQueue) job.Model = model; job.StartIndex = texGroup.StartIndex; job.EndIndex = texGroup.EndIndex; - job.ModelMatrix = model->m_Matrix * ModelMatrix(world, modelC.EntityID); + job.Matrix = m_ProjectionMatrix * m_ViewMatrix * (model->m_Matrix * ModelMatrix(world, modelC.EntityID)); job.Color = color; - - //TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this job.Entity = modelC.EntityID; renderQueue->Add(job); } - - - } } } +bool RenderSystem::OnInputCommand(const Events::InputCommand& e) +{ + if (e.Command == "SwitchCamera" && e.Value > 0) { + m_SwitchCamera = true; + return true; + } else { + return false; + } +} + void RenderSystem::Update(World* world, double dt) { + m_EventBroker->Process(); + static DebugCameraInputController firstPersonInputController(m_EventBroker, -1); + + if (m_SwitchCamera) { + auto cameras = world->GetComponents("Camera"); + + if (cameras != nullptr) { + for (auto it = cameras->begin(); it != cameras->end(); it++) { + if ((*it).EntityID == m_CurrentCamera) { + it++; + if (it != cameras->end()) { + SwitchCamera((*it).EntityID); + } else { + SwitchCamera((*cameras->begin()).EntityID); + } + break; + } + } + ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera"); + ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform"); + + firstPersonInputController.SetOrientation((glm::quat)cameraTransform["Orientation"]); + firstPersonInputController.SetPosition((glm::vec3)cameraTransform["Position"]); + } + } + + if(world->HasComponent(m_CurrentCamera, "Camera") && world->HasComponent(m_CurrentCamera, "Transform")) { + + ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera"); + ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform"); + + firstPersonInputController.Update(dt); + (glm::quat&)cameraTransform["Orientation"] = firstPersonInputController.Orientation(); + (glm::vec3&)cameraTransform["Position"] = firstPersonInputController.Position(); + + + UpdateProjectionMatrix(cameraComponent); + UpdateViewMatrix(cameraTransform); + } else { + m_ProjectionMatrix = glm::perspective(glm::radians(40.f), 1.77f, 0.05f, 5000.f); + m_ViewMatrix = glm::mat4(); + + auto cameras = world->GetComponents("Camera"); + + if (cameras != nullptr) { + ComponentWrapper& cameraC = *cameras->begin(); + m_CurrentCamera = cameraC.EntityID; + } + } + m_RenderQueues->Clear(); FillModels(world, &m_RenderQueues->Forward); } diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index 5e8dce8d..35e9d62e 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -8,6 +8,8 @@ #include "../Core/ResourceManager.h" #include "ESetCamera.h" #include "Model.h" +#include "../Core/EKeyDown.h" +#include "../Input/EInputCommand.h" class RenderSystem : public ImpureSystem { @@ -20,14 +22,29 @@ public: static glm::quat AbsoluteOrientation(World* world, EntityID entity); static glm::vec3 AbsoluteScale(World* world, EntityID entity); + + private: RenderQueueCollection* m_RenderQueues; + bool m_SwitchCamera = false; + + EventRelay m_ESetCamera; + bool OnSetCamera(const Events::SetCamera &event); + EntityID m_CurrentCamera = -1; + + void SwitchCamera(EntityID entity); void Initialize(); + void UpdateViewMatrix(ComponentWrapper& cameraTransform); + void UpdateProjectionMatrix(ComponentWrapper& cameraComponent); + glm::mat4 m_ViewMatrix; + glm::mat4 m_ProjectionMatrix; glm::mat4 ModelMatrix(World* world, EntityID entity); - void FillModels(World* world, RenderQueue* renderQueue); + + EventRelay m_EInputCommand; + bool OnInputCommand(const Events::InputCommand& e); }; #endif \ No newline at end of file diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b12fcb03..b6fc716c 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -49,7 +49,6 @@ private: Texture* m_ErrorTexture; Texture* m_WhiteTexture; - float m_CameraMoveSpeed; Model* m_ScreenQuad; Model* m_UnitQuad; diff --git a/resources/Schema/Components/Camera.xml b/resources/Schema/Components/Camera.xml index 6b9e70d4..7edb3489 100644 --- a/resources/Schema/Components/Camera.xml +++ b/resources/Schema/Components/Camera.xml @@ -1,6 +1,6 @@ 1.77 - 90 + 60.0 0.01 5000 \ No newline at end of file diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index e59d8029..7b5cb820 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -13,8 +13,22 @@ - + + Models/Camera.obj + + + + + + + + + + + + Models/Camera.obj + diff --git a/resources/Shaders/BasicForward.frag.glsl b/resources/Shaders/BasicForward.frag.glsl index 274ec8d7..9ca4db99 100644 --- a/resources/Shaders/BasicForward.frag.glsl +++ b/resources/Shaders/BasicForward.frag.glsl @@ -1,8 +1,6 @@ #version 430 -uniform mat4 M; -uniform mat4 V; -uniform mat4 P; +uniform mat4 Matrix; uniform vec4 Color; uniform sampler2D texture0; diff --git a/resources/Shaders/BasicForward.vert.glsl b/resources/Shaders/BasicForward.vert.glsl index 20ab9051..a7fe2d9f 100644 --- a/resources/Shaders/BasicForward.vert.glsl +++ b/resources/Shaders/BasicForward.vert.glsl @@ -1,8 +1,6 @@ #version 430 -uniform mat4 M; -uniform mat4 V; -uniform mat4 P; +uniform mat4 Matrix; layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; @@ -25,7 +23,7 @@ out VertexData{ void main() { - gl_Position = P*V*M * vec4(Position, 1.0); + gl_Position = Matrix * vec4(Position, 1.0); Output.Position = Position; Output.TextureCoordinate = TextureCoords; diff --git a/resources/Shaders/Picking.vert.glsl b/resources/Shaders/Picking.vert.glsl index 47c0ecd7..e9680bd1 100644 --- a/resources/Shaders/Picking.vert.glsl +++ b/resources/Shaders/Picking.vert.glsl @@ -1,8 +1,6 @@ #version 430 -uniform mat4 M; -uniform mat4 V; -uniform mat4 P; +uniform mat4 Matrix; layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; @@ -22,7 +20,7 @@ out VertexData{ void main() { - gl_Position = P*V*M * vec4(Position, 1.0); + gl_Position = Matrix * vec4(Position, 1.0); Output.Position = Position; } \ No newline at end of file diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index 36bf7e81..f0dd1405 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -42,9 +42,7 @@ void DrawScenePass::Draw(RenderQueueCollection& rq) m_BasicForwardProgram->Bind(); //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix())); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "Matrix"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); //TODO: Renderer: bättre textur felhantering samt fler texturer stöd diff --git a/src/Engine/Rendering/DummyRenderer.cpp b/src/Engine/Rendering/DummyRenderer.cpp index 4956a87a..451dfa09 100644 --- a/src/Engine/Rendering/DummyRenderer.cpp +++ b/src/Engine/Rendering/DummyRenderer.cpp @@ -39,13 +39,6 @@ void DummyRenderer::Initialize() exit(EXIT_FAILURE); } - // Create default camera - m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f); - m_DefaultCamera->SetPosition(glm::vec3(0, 0, 0)); - if (m_Camera == nullptr) { - m_Camera = m_DefaultCamera; - } - glfwSwapInterval(m_VSYNC); } diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index d45c0322..98d82f2e 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -71,12 +71,8 @@ void PickingPass::Draw(RenderQueueCollection& rq) } } m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; - - //Render picking stuff - //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix())); + + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "Matrix"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); glBindVertexArray(modelJob->Model->VAO); @@ -96,15 +92,15 @@ void PickingPass::Draw(RenderQueueCollection& rq) int fbWidth; int fbHeight; glfwGetFramebufferSize(m_Renderer->Window(), &fbWidth, &fbHeight); - Events::Picking pickEvent = Events::Picking( + /* Events::Picking pickEvent = Events::Picking( &m_PickingBuffer, &m_DepthBuffer, m_Renderer->Camera()->ProjectionMatrix(), m_Renderer->Camera()->ViewMatrix(), Rectangle(fbWidth, fbHeight), - &m_PickingColorsToEntity); + &m_PickingColorsToEntity);*/ - m_EventBroker->Publish(pickEvent); + //m_EventBroker->Publish(pickEvent); } void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 4324c204..5a587792 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -4,12 +4,6 @@ void Renderer::Initialize() { InitializeWindow(); - // Create default camera - m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f); - m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10)); - if (m_Camera == nullptr) { - m_Camera = m_DefaultCamera; - } TEMPCreateLights(); InitializeRenderPasses(); @@ -90,10 +84,7 @@ void Renderer::InitializeShaders() void Renderer::InputUpdate(double dt) { - static DebugCameraInputController firstPersonInputController(m_EventBroker, -1); - firstPersonInputController.Update(dt); - m_Camera->SetOrientation(firstPersonInputController.Orientation()); - m_Camera->SetPosition(firstPersonInputController.Position()); + } void Renderer::Update(double dt) @@ -214,17 +205,17 @@ void Renderer::InitializeRenderPasses() void Renderer::CalculateFrustum() { - GLERROR("CalculateFrustum Error-1"); - m_CalculateFrustumProgram->Bind(); - GLERROR("CalculateFrustum Error1"); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); - GLERROR("CalculateFrustum Error2"); - glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix())); - GLERROR("CalculateFrustum Error3"); - glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height); - GLERROR("CalculateFrustum Error4"); - glDispatchCompute(5, 3, 1); - GLERROR("CalculateFrustum Error5"); +// GLERROR("CalculateFrustum Error-1"); +// m_CalculateFrustumProgram->Bind(); +// GLERROR("CalculateFrustum Error1"); +// glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); +// GLERROR("CalculateFrustum Error2"); +// // glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix())); +// GLERROR("CalculateFrustum Error3"); +// // glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height); +// GLERROR("CalculateFrustum Error4"); +// //glDispatchCompute(5, 3, 1); +// GLERROR("CalculateFrustum Error5"); } From 0f1b06f74e49976d98cb9b325723c952fd4af664 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 17 Dec 2015 11:13:34 +0100 Subject: [PATCH 04/14] Fixed camera rotation bug --- assets | 2 +- deps | 2 +- {include => src}/Engine/Rendering/RenderSystem.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename {include => src}/Engine/Rendering/RenderSystem.cpp (96%) diff --git a/assets b/assets index 008f7278..6b574962 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 008f7278216a1750e9f270c70a75c1cd1859bf1f +Subproject commit 6b5749627cc78cddfd4beae6b5a3728cc432a4a5 diff --git a/deps b/deps index f20b9cc1..1ae6ba5b 160000 --- a/deps +++ b/deps @@ -1 +1 @@ -Subproject commit f20b9cc13bffa39c3b5144bacc5eacd34d43052c +Subproject commit 1ae6ba5b1297ed71b560aee211b9f0007ba52547 diff --git a/include/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp similarity index 96% rename from include/Engine/Rendering/RenderSystem.cpp rename to src/Engine/Rendering/RenderSystem.cpp index e9183f7a..b35f69ab 100644 --- a/include/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -31,7 +31,7 @@ void RenderSystem::Initialize() void RenderSystem::UpdateViewMatrix(ComponentWrapper& cameraTransform) { - glm::quat orientation = cameraTransform["Orientation"]; + glm::quat orientation = glm::quat((glm::vec3)cameraTransform["Orientation"]); glm::vec3 position = cameraTransform["Position"]; m_ViewMatrix = glm::toMat4(glm::inverse(orientation)) * glm::translate(-position); @@ -198,7 +198,7 @@ void RenderSystem::Update(World* world, double dt) ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera"); ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform"); - firstPersonInputController.SetOrientation((glm::quat)cameraTransform["Orientation"]); + firstPersonInputController.SetOrientation(glm::quat((glm::vec3)cameraTransform["Orientation"])); firstPersonInputController.SetPosition((glm::vec3)cameraTransform["Position"]); } } @@ -209,7 +209,7 @@ void RenderSystem::Update(World* world, double dt) ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform"); firstPersonInputController.Update(dt); - (glm::quat&)cameraTransform["Orientation"] = firstPersonInputController.Orientation(); + (glm::vec3&)cameraTransform["Orientation"] = glm::eulerAngles(firstPersonInputController.Orientation()); (glm::vec3&)cameraTransform["Position"] = firstPersonInputController.Position(); From bd82f75dd0df3cfd54bfb0f0037de4a7fb5c2e90 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 18 Dec 2015 15:28:44 +0100 Subject: [PATCH 05/14] Some merge fixes, needs more work --- assets | 2 +- include/Engine/Rendering/IRenderer.h | 11 +++ include/Engine/Rendering/RenderQueue.h | 2 + include/Engine/Rendering/RenderSystem.h | 2 + include/Engine/Rendering/Renderer.h | 61 +------------ src/Engine/Editor/EditorSystem.cpp | 12 +-- src/Engine/Rendering/RenderSystem.cpp | 2 + src/Engine/Rendering/Renderer.cpp | 109 ++---------------------- src/Game/Game.cpp | 3 +- 9 files changed, 36 insertions(+), 168 deletions(-) diff --git a/assets b/assets index 6b574962..c8e631f4 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 6b5749627cc78cddfd4beae6b5a3728cc432a4a5 +Subproject commit c8e631f449515cdbe3647b96ce472839748e28f9 diff --git a/include/Engine/Rendering/IRenderer.h b/include/Engine/Rendering/IRenderer.h index d11eb481..405de00e 100644 --- a/include/Engine/Rendering/IRenderer.h +++ b/include/Engine/Rendering/IRenderer.h @@ -20,6 +20,15 @@ public: void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; } bool VSYNC() const { return m_VSYNC; } void SetVSYNC(bool vsync) { m_VSYNC = vsync; } + ::Camera* Camera() const { return m_Camera; } + void SetCamera(::Camera* camera) + { + if (camera == nullptr) { + m_Camera = m_DefaultCamera; + } else { + m_Camera = camera; + } + } virtual void Initialize() = 0; virtual void Update(double dt) = 0; virtual void Draw(RenderQueueCollection& rq) = 0; @@ -31,6 +40,8 @@ protected: int m_GLVersion[2]; std::string m_GLVendor; GLFWwindow* m_Window = nullptr; + ::Camera* m_DefaultCamera; + ::Camera* m_Camera = nullptr; }; #endif // Renderer_h__ diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 5e504913..5fb09678 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -8,6 +8,7 @@ #include "../GLM.h" #include "../Core/Util/Rectangle.h" #include "../Core/Entity.h" +#include "Camera.h" class Model; class Skeleton; @@ -168,6 +169,7 @@ struct RenderQueueCollection { RenderQueue Forward; RenderQueue Lights; + Camera* Camera; void Clear() { diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index 35e9d62e..e61ade55 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -10,6 +10,7 @@ #include "Model.h" #include "../Core/EKeyDown.h" #include "../Input/EInputCommand.h" +#include "Camera.h" class RenderSystem : public ImpureSystem { @@ -27,6 +28,7 @@ public: private: RenderQueueCollection* m_RenderQueues; bool m_SwitchCamera = false; + Camera* m_Camera = nullptr; EventRelay m_ESetCamera; bool OnSetCamera(const Events::SetCamera &event); diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b6fc716c..e22b9fec 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -12,23 +12,10 @@ #include "../Core/World.h" #include "PickingPass.h" #include "DrawScenePass.h" - - -#define TILE_SIZE 16 -#define NUM_LIGHTS 3 - - -enum lightType -{ - Point, - Spot, - Directional, - Area -}; - #include "../Core/EventBroker.h" #include "EPicking.h" #include "ImGuiRenderPass.h" +#include "Camera.h" class Renderer : public IRenderer { @@ -69,56 +56,10 @@ private: //void PickingPass(RenderQueueCollection& rq); void DrawScreenQuad(GLuint textureToDraw); - //----------------------Forward+-----------------------// - void CalculateFrustum(); - void CullLights(); - //Frustum - struct Plane { - glm::vec3 Normal; - float d; - }; - struct Frustum { - Plane Planes[4]; - }; - Frustum m_Frustums[80*45]; //TODO: Renderer: Make this change with resolution - - //Lights - void TEMPCreateLights(); - //TODO: Renderer: Add Directionllights, spotlights and area lights to this as type. - struct PointLight { - glm::vec4 Position = glm::vec4(0.f); - glm::vec4 Color = glm::vec4(1.f); - float Radius = 5.f; - float Intensity = 0.8f; - float Falloff = 0.3f; - float Padding = 1337; - }; - PointLight m_PointLights[NUM_LIGHTS]; - - struct LightGrid { - int Amount; - int Start; - glm::vec2 Padding; - }; - LightGrid m_LightGrid[80*45]; - - int m_LightOffset = 0; - - int m_LightIndex[80*45*200]; - - //-------------------------SSBO------------------------// - GLuint m_FrustumSSBO = 0; - GLuint m_LightSSBO = 1; - GLuint m_LightGridSSBO = 2; - GLuint m_LightOffsetSSBO = 3; - GLuint m_LightIndexSSBO = 4; - void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// ShaderProgram* m_BasicForwardProgram; ShaderProgram* m_DrawScreenQuadProgram; - ShaderProgram* m_CalculateFrustumProgram; - ShaderProgram* m_LightCullProgram; }; diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index 2463aec6..87b8642b 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -114,7 +114,7 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e) EntityID parent = m_World->GetParent(m_Selection); glm::quat inverseParentOrientation; if (parent != 0) { - inverseParentOrientation = glm::inverse(RenderQueueFactory::AbsoluteOrientation(m_World, parent)); + inverseParentOrientation = glm::inverse(RenderSystem::AbsoluteOrientation(m_World, parent)); } (glm::vec3&)m_World->GetComponent(m_Selection, "Transform")["Position"] += inverseParentOrientation * movement; } else if (m_WidgetSpace == WidgetSpace::Local) { @@ -130,7 +130,7 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e) EntityID parent = m_World->GetParent(m_Selection); glm::quat parentOrientation; if (parent != 0) { - parentOrientation = RenderQueueFactory::AbsoluteOrientation(m_World, parent); + parentOrientation = RenderSystem::AbsoluteOrientation(m_World, parent); } glm::vec3& selectionOrientation = m_World->GetComponent(m_Selection, "Transform")["Orientation"]; //glm::quat currentOrientation = RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection); @@ -235,10 +235,10 @@ void EditorSystem::updateWidget() if (m_Selection != 0) { auto widgetTransform = m_World->GetComponent(m_Widget, "Transform"); - glm::vec3 selectionPosition = RenderQueueFactory::AbsolutePosition(m_World, m_Selection); + glm::vec3 selectionPosition = RenderSystem::AbsolutePosition(m_World, m_Selection); widgetTransform["Position"] = selectionPosition; if (m_WidgetSpace == WidgetSpace::Local) { - widgetTransform["Orientation"] = glm::eulerAngles(RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection)); + widgetTransform["Orientation"] = glm::eulerAngles(RenderSystem::AbsoluteOrientation(m_World, m_Selection)); } } } @@ -264,7 +264,7 @@ void EditorSystem::setWidgetMode(WidgetMode newMode) if (m_Selection != 0) { if (m_WidgetSpace == WidgetSpace::Local) { auto selectionTransform = m_World->GetComponent(m_Selection, "Transform"); - widgetTransform["Orientation"] = glm::eulerAngles(RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection)); + widgetTransform["Orientation"] = glm::eulerAngles(RenderSystem::AbsoluteOrientation(m_World, m_Selection)); } } } else if (newMode == WidgetMode::Scale) { @@ -285,7 +285,7 @@ void EditorSystem::setWidgetMode(WidgetMode newMode) if (m_Selection != 0) { auto selectionTransform = m_World->GetComponent(m_Selection, "Transform"); if (m_WidgetSpace == WidgetSpace::Local) { - widgetTransform["Orientation"] = glm::eulerAngles(RenderQueueFactory::AbsoluteOrientation(m_World, m_Selection)); + widgetTransform["Orientation"] = glm::eulerAngles(RenderSystem::AbsoluteOrientation(m_World, m_Selection)); } } } diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index b35f69ab..c08d4971 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -8,6 +8,8 @@ RenderSystem::RenderSystem(EventBroker* eventBrokerer, RenderQueueCollection* re Initialize(); EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand); + + } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index c67a4757..0ef1e4bf 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -5,20 +5,26 @@ void Renderer::Initialize() { InitializeWindow(); - TEMPCreateLights(); InitializeRenderPasses(); glfwSwapInterval(m_VSYNC); InitializeShaders(); InitializeTextures(); - InitializeSSBOs(); - //CalculateFrustum(); m_ScreenQuad = ResourceManager::Load("Models/Core/ScreenQuad.obj"); m_UnitQuad = ResourceManager::Load("Models/Core/UnitQuad.obj"); m_UnitSphere = ResourceManager::Load("Models/Core/UnitSphere.obj"); m_ImGuiRenderPass = new ImGuiRenderPass(this, m_EventBroker); + + + // Create default camera + m_DefaultCamera = new ::Camera((float)m_Resolution.Width / m_Resolution.Height, glm::radians(45.f), 0.01f, 5000.f); + m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10)); + if (m_Camera == nullptr) { + m_Camera = m_DefaultCamera; + } + } void Renderer::InitializeWindow() @@ -70,16 +76,6 @@ void Renderer::InitializeShaders() m_DrawScreenQuadProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl"))); m_DrawScreenQuadProgram->Compile(); m_DrawScreenQuadProgram->Link(); - - //m_CalculateFrustumProgram = ResourceManager::Load("#CalculateFrustumProgram"); - //m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); - //m_CalculateFrustumProgram.Compile(); - //m_CalculateFrustumProgram.Link(); - - //m_LightCullProgram = ResourceManager::Load("#LightCullProgram"); - //m_LightCullProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); - //m_LightCullProgram.Compile(); - //m_LightCullProgram.Link(); } void Renderer::InputUpdate(double dt) @@ -98,7 +94,6 @@ void Renderer::Draw(RenderQueueCollection& rq) { m_PickingPass->Draw(rq); //DrawScreenQuad(m_PickingPass->PickingTexture()); - //CullLights(); glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f); @@ -147,94 +142,8 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin GLERROR("Texture initialization failed"); } -void Renderer::InitializeSSBOs() -{ - printf("Size: %i\n", sizeof(m_Frustums)); - glGenBuffers(1, &m_FrustumSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_FrustumSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_Frustums), &m_Frustums, GL_DYNAMIC_COPY); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - - GLERROR("m_FrustumSSBO"); - - glGenBuffers(1, &m_LightSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_PointLights), &m_PointLights, GL_DYNAMIC_COPY); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - - GLERROR("m_LightSSBO"); - - - glGenBuffers(1, &m_LightGridSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightGridSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightGrid), &m_LightGrid, GL_DYNAMIC_COPY); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - - GLERROR("m_LightGridSSBO"); - - - glGenBuffers(1, &m_LightOffsetSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightOffsetSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightOffset), &m_LightOffset, GL_DYNAMIC_COPY); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_LightOffsetSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - - GLERROR("m_LightOffsetSSBO"); - - - glGenBuffers(1, &m_LightIndexSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_LightIndexSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(m_LightIndex), &m_LightIndex, GL_DYNAMIC_COPY); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); - - GLERROR("m_LightIndexSSBO"); - -} - void Renderer::InitializeRenderPasses() { m_DrawScenePass = new DrawScenePass(this); m_PickingPass = new PickingPass(this, m_EventBroker); } - -void Renderer::CalculateFrustum() -{ -// GLERROR("CalculateFrustum Error-1"); -// m_CalculateFrustumProgram->Bind(); -// GLERROR("CalculateFrustum Error1"); -// glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); -// GLERROR("CalculateFrustum Error2"); -// // glUniformMatrix4fv(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "P"), 1, false, glm::value_ptr(m_Camera->ProjectionMatrix())); -// GLERROR("CalculateFrustum Error3"); -// // glUniform2f(glGetUniformLocation(m_CalculateFrustumProgram->GetHandle(), "ScreenDimensions"), m_Resolution.Width, m_Resolution.Height); -// GLERROR("CalculateFrustum Error4"); -// //glDispatchCompute(5, 3, 1); -// GLERROR("CalculateFrustum Error5"); - -} - -void Renderer::TEMPCreateLights() -{ - for (int i = 0; i < NUM_LIGHTS; i++) { - m_PointLights[i].Position = glm::vec4(i, 0.f, 0.f, 0.f); - m_PointLights[i].Color = glm::vec4(1.f, 0.5f, 0.f + i*0.1f, 1.f); - } -} - -void Renderer::CullLights() -{ - m_LightCullProgram->Bind(); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_FrustumSSBO); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_LightSSBO); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_LightGridSSBO); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_LightOffsetSSBO); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, m_LightIndexSSBO); - glDispatchCompute(m_Resolution.Width / TILE_SIZE, m_Resolution.Height / TILE_SIZE, 1); - GLERROR("CullLights Error"); - -} - diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 861c84b0..4ab6f410 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -14,7 +14,6 @@ Game::Game(int argc, char* argv[]) // Create the core event broker m_EventBroker = new EventBroker(); - m_RenderQueueFactory = new RenderQueueFactory(); // Create the renderer m_Renderer = new Renderer(m_EventBroker, m_World); @@ -48,6 +47,8 @@ Game::Game(int argc, char* argv[]) ResourceManager::Load(mapToLoad)->PopulateWorld(m_World); } + m_RenderQueues = new RenderQueueCollection(); + // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); m_SystemPipeline->AddSystem(); From a7b43b06a2672faf86e3579cbd45e9fb73991042 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 8 Jan 2016 16:21:59 +0100 Subject: [PATCH 06/14] Camera component and RenderQueue changes --- include/Engine/GUI/Button.h | 2 +- include/Engine/GUI/Frame.h | 4 +- include/Engine/GUI/TextureFrame.h | 2 +- include/Engine/Rendering/Camera.h | 10 +- include/Engine/Rendering/DrawScenePass.h | 2 +- include/Engine/Rendering/DummyRenderer.h | 2 +- include/Engine/Rendering/ESetCamera.h | 4 +- include/Engine/Rendering/IRenderer.h | 2 +- include/Engine/Rendering/PickingPass.h | 2 +- include/Engine/Rendering/RenderQueue.h | 38 +++++++- include/Engine/Rendering/RenderSystem.h | 15 ++- include/Engine/Rendering/Renderer.h | 2 +- include/Game/Game.h | 2 +- resources/Schema/Components/Camera.xml | 1 + resources/Schema/Components/Camera.xsd | 1 + resources/Schema/Entities/Test.xml | 2 + src/Engine/Rendering/Camera.cpp | 9 -- src/Engine/Rendering/DrawScenePass.cpp | 48 +++++----- src/Engine/Rendering/DummyRenderer.cpp | 2 +- src/Engine/Rendering/PickingPass.cpp | 56 ++++++----- src/Engine/Rendering/RenderSystem.cpp | 116 +++++++++++++++-------- src/Engine/Rendering/Renderer.cpp | 8 +- src/Game/Game.cpp | 6 +- 23 files changed, 199 insertions(+), 137 deletions(-) diff --git a/include/Engine/GUI/Button.h b/include/Engine/GUI/Button.h index 91bd9782..80845cb7 100644 --- a/include/Engine/GUI/Button.h +++ b/include/Engine/GUI/Button.h @@ -40,7 +40,7 @@ public: m_TexturePressed = resourceName; } - void Draw(RenderQueueCollection& rq) override + void Draw(RenderScene& rq) override { if (m_Texture == nullptr && !m_TextureReleased.empty()) { SetTexture(m_TextureReleased); diff --git a/include/Engine/GUI/Frame.h b/include/Engine/GUI/Frame.h index 416b8117..4c5f2eb9 100644 --- a/include/Engine/GUI/Frame.h +++ b/include/Engine/GUI/Frame.h @@ -212,7 +212,7 @@ public: virtual void Update(double dt) { } - void DrawLayered(RenderQueueCollection& rq) + void DrawLayered(RenderScene& rq) { if (this->Hidden()) return; @@ -232,7 +232,7 @@ public: } } - virtual void Draw(RenderQueueCollection& rq) { } + virtual void Draw(RenderScene& rq) { } protected: ::EventBroker* m_EventBroker; diff --git a/include/Engine/GUI/TextureFrame.h b/include/Engine/GUI/TextureFrame.h index f02285ca..2c6d34dd 100644 --- a/include/Engine/GUI/TextureFrame.h +++ b/include/Engine/GUI/TextureFrame.h @@ -16,7 +16,7 @@ public: void EnableScissor() { m_ScissorEnabled = true; } void DisableScissor() { m_ScissorEnabled = false; } - void Draw(RenderQueueCollection& rq) override + void Draw(RenderScene& rq) override { if (m_Texture == nullptr) return; diff --git a/include/Engine/Rendering/Camera.h b/include/Engine/Rendering/Camera.h index 660dfd49..a1aae1bd 100644 --- a/include/Engine/Rendering/Camera.h +++ b/include/Engine/Rendering/Camera.h @@ -26,11 +26,6 @@ public: glm::quat Orientation() const { return m_Orientation; } void SetOrientation(glm::quat val); - /*float Pitch() const { return m_Pitch; } - void Pitch(float val); - float Yaw() const { return m_Yaw; } - void Yaw(float val);*/ - glm::mat4 ProjectionMatrix() const { return m_ProjectionMatrix; } glm::mat4 ViewMatrix() const { return m_ViewMatrix; } @@ -46,11 +41,10 @@ public: float FarClip() const { return m_FarClip; } void SetFarClip(float val); - + void UpdateViewMatrix(); + void UpdateProjectionMatrix(); private: - void UpdateViewMatrix(); - void UpdateProjectionMatrix(); glm::vec3 m_Position; glm::quat m_Orientation; diff --git a/include/Engine/Rendering/DrawScenePass.h b/include/Engine/Rendering/DrawScenePass.h index db52f746..4200383f 100644 --- a/include/Engine/Rendering/DrawScenePass.h +++ b/include/Engine/Rendering/DrawScenePass.h @@ -17,7 +17,7 @@ public: void InitializeFrameBuffers(); void InitializeShaderPrograms(); - void Draw(RenderQueueCollection& rq); + void Draw(RenderFrame& rf); //Getters diff --git a/include/Engine/Rendering/DummyRenderer.h b/include/Engine/Rendering/DummyRenderer.h index 56790fa1..176c5834 100644 --- a/include/Engine/Rendering/DummyRenderer.h +++ b/include/Engine/Rendering/DummyRenderer.h @@ -9,7 +9,7 @@ class DummyRenderer : public IRenderer { public: virtual void Initialize() override; - virtual void Draw(RenderQueueCollection& rq) override; + virtual void Draw(RenderFrame& rq) override; }; #endif \ No newline at end of file diff --git a/include/Engine/Rendering/ESetCamera.h b/include/Engine/Rendering/ESetCamera.h index cf5b0a87..650f3b12 100644 --- a/include/Engine/Rendering/ESetCamera.h +++ b/include/Engine/Rendering/ESetCamera.h @@ -3,16 +3,16 @@ #include "../Core/EventBroker.h" #include "../Core/Entity.h" +#include namespace Events { -/** Thrown Every frame, use functions to pick*/ struct SetCamera : Event { public: SetCamera() { }; - EntityID Entity; + std::string Name; private: diff --git a/include/Engine/Rendering/IRenderer.h b/include/Engine/Rendering/IRenderer.h index 405de00e..42729479 100644 --- a/include/Engine/Rendering/IRenderer.h +++ b/include/Engine/Rendering/IRenderer.h @@ -31,7 +31,7 @@ public: } virtual void Initialize() = 0; virtual void Update(double dt) = 0; - virtual void Draw(RenderQueueCollection& rq) = 0; + virtual void Draw(RenderFrame& rq) = 0; protected: Rectangle m_Resolution = Rectangle(1280, 720); diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h index e1bc42db..e4ff9e27 100644 --- a/include/Engine/Rendering/PickingPass.h +++ b/include/Engine/Rendering/PickingPass.h @@ -18,7 +18,7 @@ public: void InitializeFrameBuffers(); void InitializeShaderPrograms(); - void Draw(RenderQueueCollection& rq); + void Draw(RenderFrame& rf); //Getters diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 5fb09678..719e5cc7 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -39,9 +39,7 @@ struct ModelJob : RenderJob unsigned int ShaderID = 0; unsigned int TextureID = 0; - //TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this EntityID Entity; - glm::mat4 Matrix; const Texture* DiffuseTexture; const Texture* NormalTexture; @@ -165,7 +163,7 @@ private: int m_Size = 0; }; -struct RenderQueueCollection +struct RenderScene { RenderQueue Forward; RenderQueue Lights; @@ -184,4 +182,38 @@ struct RenderQueueCollection } }; +class RenderFrame +{ +public: + + void Add(RenderScene &scene) + { + RenderScenes.push_back(std::shared_ptr(new RenderScene(scene))); + m_Size++; + } + + void Clear() + { + RenderScenes.clear(); + m_Size = 0; + } + + int Size() const { return m_Size; } + std::list>::const_iterator begin() + { + return RenderScenes.begin(); + } + + std::list>::const_iterator end() + { + return RenderScenes.end(); + } + + std::list> RenderScenes; + + +private: + int m_Size = 0; +}; + #endif \ No newline at end of file diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index e61ade55..34a9c5f9 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -12,10 +12,11 @@ #include "../Input/EInputCommand.h" #include "Camera.h" + class RenderSystem : public ImpureSystem { public: - RenderSystem(EventBroker* eventBrokerer, RenderQueueCollection* renderQueues); + RenderSystem(EventBroker* eventBrokerer, RenderFrame* renderFrame); virtual void Update(World* world, double dt) override; @@ -26,9 +27,14 @@ public: private: - RenderQueueCollection* m_RenderQueues; + World* m_World = nullptr; + + RenderFrame* m_RenderFrame; bool m_SwitchCamera = false; Camera* m_Camera = nullptr; + Camera* m_DefaultCamera = nullptr; + + std::list m_CameraComponents; EventRelay m_ESetCamera; bool OnSetCamera(const Events::SetCamera &event); @@ -37,13 +43,12 @@ private: void SwitchCamera(EntityID entity); void Initialize(); - void UpdateViewMatrix(ComponentWrapper& cameraTransform); void UpdateProjectionMatrix(ComponentWrapper& cameraComponent); glm::mat4 m_ViewMatrix; glm::mat4 m_ProjectionMatrix; - glm::mat4 ModelMatrix(World* world, EntityID entity); - void FillModels(World* world, RenderQueue* renderQueue); + glm::mat4 ModelMatrix(EntityID entity); + void FillModels(RenderQueue* renderQueue); EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand& e); diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index e22b9fec..d89fc4d2 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -27,7 +27,7 @@ public: virtual void Initialize() override; virtual void Update(double dt) override; - virtual void Draw(RenderQueueCollection& rq) override; + virtual void Draw(RenderFrame& rf) override; private: //----------------------Variables----------------------// diff --git a/include/Game/Game.h b/include/Game/Game.h index 85337707..d9e8821f 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -38,7 +38,7 @@ private: GUI::Frame* m_FrameStack; World* m_World; SystemPipeline* m_SystemPipeline; - RenderQueueCollection* m_RenderQueues; + RenderFrame* m_RenderFrame; EventRelay m_EInputCommand; bool debugOnInputCommand(const Events::InputCommand& e); diff --git a/resources/Schema/Components/Camera.xml b/resources/Schema/Components/Camera.xml index 7edb3489..8a93dec5 100644 --- a/resources/Schema/Components/Camera.xml +++ b/resources/Schema/Components/Camera.xml @@ -1,4 +1,5 @@ + cam 1.77 60.0 0.01 diff --git a/resources/Schema/Components/Camera.xsd b/resources/Schema/Components/Camera.xsd index 1ac8c394..3c462a3b 100644 --- a/resources/Schema/Components/Camera.xsd +++ b/resources/Schema/Components/Camera.xsd @@ -9,6 +9,7 @@ + diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 7b5cb820..df739177 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -18,6 +18,7 @@ Models/Camera.obj + MainCamera @@ -30,6 +31,7 @@ Models/Camera.obj + ActionCamera diff --git a/src/Engine/Rendering/Camera.cpp b/src/Engine/Rendering/Camera.cpp index 6ddf1c6c..ecc5d5cc 100644 --- a/src/Engine/Rendering/Camera.cpp +++ b/src/Engine/Rendering/Camera.cpp @@ -64,15 +64,6 @@ void Camera::SetOrientation(glm::quat val) void Camera::UpdateProjectionMatrix() { -// m_ProjectionMatrix = glm::ortho( -// -16.f, -// 16.f, -// -9.f, -// 9.f, -// m_NearClip, -// m_FarClip -// ); - m_ProjectionMatrix = glm::perspective(m_FOV, m_AspectRatio, m_NearClip, m_FarClip); } diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index f0dd1405..dd34072f 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -25,40 +25,40 @@ void DrawScenePass::InitializeShaderPrograms() } -void DrawScenePass::Draw(RenderQueueCollection& rq) +void DrawScenePass::Draw(RenderFrame& rf) { //glBindFramebuffer(GL_FRAMEBUFFER, 0); GLERROR("Renderer::Draw PickingPass"); DrawScenePassState state; + for (auto scene : rf.RenderScenes) { + scene->Forward.Jobs.sort(DrawScenePass::DepthSort); - rq.Forward.Jobs.sort(DrawScenePass::DepthSort); + for (auto &job : scene->Forward) { + auto modelJob = std::dynamic_pointer_cast(job); + if (modelJob) { + GLuint ShaderHandle = m_BasicForwardProgram->GetHandle(); - //TODO: Render: Add code for more jobs than modeljobs. - for (auto &job : rq.Forward) { - auto modelJob = std::dynamic_pointer_cast(job); - if (modelJob) { - GLuint ShaderHandle = m_BasicForwardProgram->GetHandle(); + m_BasicForwardProgram->Bind(); + //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "Matrix"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); - m_BasicForwardProgram->Bind(); - //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "Matrix"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); + //TODO: Renderer: bättre textur felhantering samt fler texturer stöd + if (modelJob->DiffuseTexture != nullptr) { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); + } else { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + } - //TODO: Renderer: bättre textur felhantering samt fler texturer stöd - if (modelJob->DiffuseTexture != nullptr) { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); - } else { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); + + continue; } - - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); - glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); - - continue; } } GLERROR("DrawScene Error"); diff --git a/src/Engine/Rendering/DummyRenderer.cpp b/src/Engine/Rendering/DummyRenderer.cpp index 451dfa09..ab529315 100644 --- a/src/Engine/Rendering/DummyRenderer.cpp +++ b/src/Engine/Rendering/DummyRenderer.cpp @@ -42,7 +42,7 @@ void DummyRenderer::Initialize() glfwSwapInterval(m_VSYNC); } -void DummyRenderer::Draw(RenderQueueCollection& rq) +void DummyRenderer::Draw(RenderFrame& rq) { glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 0.f); glClear(GL_COLOR_BUFFER_BIT); diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index 0f821617..f7f0558c 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -43,7 +43,7 @@ void PickingPass::InitializeShaderPrograms() m_PickingProgram->Link(); } -void PickingPass::Draw(RenderQueueCollection& rq) +void PickingPass::Draw(RenderFrame& rf) { m_PickingColorsToEntity.clear(); PickingPassState* state = new PickingPassState(m_PickingBuffer.GetHandle()); @@ -57,34 +57,38 @@ void PickingPass::Draw(RenderQueueCollection& rq) std::map entityColors; - for (auto &job : rq.Forward) { - auto modelJob = std::dynamic_pointer_cast(job); + for(auto scene : rf.RenderScenes) + { + for (auto &job : scene->Forward) { + auto modelJob = std::dynamic_pointer_cast(job); - if (modelJob) { - int pickColor[2] = { r, g }; - auto color = entityColors.find(modelJob->Entity); - if (color != entityColors.end()) { - pickColor[0] = color->second[0]; - pickColor[1] = color->second[1]; - } else { - entityColors[modelJob->Entity] = glm::vec2(pickColor[0], pickColor[1]); - if (r + 10 > 255) { - r = 0; - g += 1; + if (modelJob) { + int pickColor[2] = { r, g }; + auto color = entityColors.find(modelJob->Entity); + if (color != entityColors.end()) { + pickColor[0] = color->second[0]; + pickColor[1] = color->second[1]; } else { - r += 1; + entityColors[modelJob->Entity] = glm::vec2(pickColor[0], pickColor[1]); + if (r + 10 > 255) { + r = 0; + g += 1; + } else { + r += 1; + } } + m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; + + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "Matrix"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); + + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, nullptr, modelJob->StartIndex); } - m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; - - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "Matrix"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); - - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); - glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, nullptr, modelJob->StartIndex); } } + m_PickingBuffer.Unbind(); GLERROR("PickingPass Error"); @@ -92,15 +96,15 @@ void PickingPass::Draw(RenderQueueCollection& rq) int fbWidth; int fbHeight; glfwGetFramebufferSize(m_Renderer->Window(), &fbWidth, &fbHeight); - /* Events::Picking pickEvent = Events::Picking( + Events::Picking pickEvent = Events::Picking( &m_PickingBuffer, &m_DepthBuffer, m_Renderer->Camera()->ProjectionMatrix(), m_Renderer->Camera()->ViewMatrix(), Rectangle(fbWidth, fbHeight), - &m_PickingColorsToEntity);*/ + &m_PickingColorsToEntity); - //m_EventBroker->Publish(pickEvent); + m_EventBroker->Publish(pickEvent); delete state; } diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index c08d4971..33c03e8f 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -1,29 +1,56 @@ #include "Rendering/RenderSystem.h" #include "Rendering/DebugCameraInputController.h" -RenderSystem::RenderSystem(EventBroker* eventBrokerer, RenderQueueCollection* renderQueues) +RenderSystem::RenderSystem(EventBroker* eventBrokerer, RenderFrame* renderFrame) :ImpureSystem(eventBrokerer) { - m_RenderQueues = renderQueues; + m_RenderFrame = renderFrame; Initialize(); EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand); - + m_DefaultCamera = new Camera(1.77f /* should be based on width and height */, glm::radians(45.f), 0.01f, 5000.f); + m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10)); + if (m_Camera == nullptr) { + m_Camera = m_DefaultCamera; + } } bool RenderSystem::OnSetCamera(const Events::SetCamera &event) { - m_CurrentCamera = event.Entity; + auto cameras = m_World->GetComponents("Camera"); + + if (cameras != nullptr) { + for (auto it = cameras->begin(); it != cameras->end(); it++) { + if ((std::string)(*it)["Name"] == event.Name) { + SwitchCamera((*it).EntityID); + } + } + } + return true; } void RenderSystem::SwitchCamera(EntityID entity) { - m_CurrentCamera = entity; - m_SwitchCamera = false; - LOG_INFO("Switched to camera %i", m_CurrentCamera); + if(m_World->HasComponent(entity, "Camera")) { + if (m_World->HasComponent(m_CurrentCamera, "Model")) { + m_World->GetComponent(m_CurrentCamera, "Model")["Visible"] = true; + } + + if (m_World->HasComponent(entity, "Model")) { + m_World->GetComponent(entity, "Model")["Visible"] = false; + } + + m_CurrentCamera = entity; + m_SwitchCamera = false; + + LOG_INFO("Switched to %s", m_World->GetComponent(m_CurrentCamera, "Camera")["Name"]); + } else { + LOG_ERROR("Entity %i does not have a CameraComponent", entity); + m_SwitchCamera = false; + } } void RenderSystem::Initialize() @@ -31,24 +58,21 @@ void RenderSystem::Initialize() } -void RenderSystem::UpdateViewMatrix(ComponentWrapper& cameraTransform) -{ - glm::quat orientation = glm::quat((glm::vec3)cameraTransform["Orientation"]); - glm::vec3 position = cameraTransform["Position"]; - - m_ViewMatrix = glm::toMat4(glm::inverse(orientation)) * glm::translate(-position); -} - void RenderSystem::UpdateProjectionMatrix(ComponentWrapper& cameraComponent) { - double fov = (double&)cameraComponent["FOV"]; - double aspectRatio = (double&)cameraComponent["AspectRatio"]; - double nearClip = (double&)cameraComponent["NearClip"]; - double farClip = (double&)cameraComponent["FarClip"]; + double fov = cameraComponent["FOV"]; + double aspectRatio = cameraComponent["AspectRatio"]; + double nearClip = cameraComponent["NearClip"]; + double farClip = cameraComponent["FarClip"]; double fovY = atan(tan(glm::radians(fov)/2.0) * aspectRatio) * 2.0; m_ProjectionMatrix = glm::perspective(fovY, aspectRatio, nearClip, farClip); - + + m_Camera->SetFOV(fovY); + m_Camera->SetAspectRatio(aspectRatio); + m_Camera->SetNearClip(nearClip); + m_Camera->SetFarClip(farClip); + m_Camera->UpdateProjectionMatrix(); } glm::vec3 RenderSystem::AbsolutePosition(World* world, EntityID entity) @@ -95,20 +119,19 @@ glm::vec3 RenderSystem::AbsoluteScale(World* world, EntityID entity) return scale; } - -glm::mat4 RenderSystem::ModelMatrix(World* world, EntityID entity) +glm::mat4 RenderSystem::ModelMatrix(EntityID entity) { - glm::vec3 position = AbsolutePosition(world, entity); - glm::quat orientation = AbsoluteOrientation(world, entity); - glm::vec3 scale = AbsoluteScale(world, entity); + glm::vec3 position = AbsolutePosition(m_World, entity); + glm::quat orientation = AbsoluteOrientation(m_World, entity); + glm::vec3 scale = AbsoluteScale(m_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) +void RenderSystem::FillModels(RenderQueue* renderQueue) { - auto models = world->GetComponents("Model"); + auto models = m_World->GetComponents("Model"); if (models == nullptr) { return; } @@ -140,7 +163,7 @@ void RenderSystem::FillModels(World* world, RenderQueue* renderQueue) job.Model = model; job.StartIndex = texGroup.StartIndex; job.EndIndex = texGroup.EndIndex; - job.Matrix = m_ProjectionMatrix * m_ViewMatrix * (model->m_Matrix * ModelMatrix(world, modelC.EntityID)); + job.Matrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix() * (model->m_Matrix * ModelMatrix(modelC.EntityID)); job.Color = color; job.Entity = modelC.EntityID; @@ -156,7 +179,7 @@ void RenderSystem::FillModels(World* world, RenderQueue* renderQueue) job.Model = model; job.StartIndex = texGroup.StartIndex; job.EndIndex = texGroup.EndIndex; - job.Matrix = m_ProjectionMatrix * m_ViewMatrix * (model->m_Matrix * ModelMatrix(world, modelC.EntityID)); + job.Matrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix() * (model->m_Matrix * ModelMatrix(modelC.EntityID)); job.Color = color; job.Entity = modelC.EntityID; @@ -176,9 +199,10 @@ bool RenderSystem::OnInputCommand(const Events::InputCommand& e) } } - void RenderSystem::Update(World* world, double dt) { + m_World = world; + m_EventBroker->Process(); static DebugCameraInputController firstPersonInputController(m_EventBroker, -1); @@ -201,34 +225,42 @@ void RenderSystem::Update(World* world, double dt) ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform"); firstPersonInputController.SetOrientation(glm::quat((glm::vec3)cameraTransform["Orientation"])); - firstPersonInputController.SetPosition((glm::vec3)cameraTransform["Position"]); + firstPersonInputController.SetPosition(cameraTransform["Position"]); } } if(world->HasComponent(m_CurrentCamera, "Camera") && world->HasComponent(m_CurrentCamera, "Transform")) { - ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera"); ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform"); - firstPersonInputController.Update(dt); - (glm::vec3&)cameraTransform["Orientation"] = glm::eulerAngles(firstPersonInputController.Orientation()); - (glm::vec3&)cameraTransform["Position"] = firstPersonInputController.Position(); + if(world->GetParent(m_CurrentCamera) == 1) { // world is entity 1, is this ok? + firstPersonInputController.Update(dt); + (glm::vec3&)cameraTransform["Orientation"] = glm::eulerAngles(firstPersonInputController.Orientation()); + (glm::vec3&)cameraTransform["Position"] = firstPersonInputController.Position(); + } + glm::vec3 position = AbsolutePosition(world, m_CurrentCamera); + glm::quat orientation = AbsoluteOrientation(world, m_CurrentCamera); + m_Camera->SetPosition(position); + m_Camera->SetOrientation(orientation); + UpdateProjectionMatrix(cameraComponent); - UpdateViewMatrix(cameraTransform); + m_Camera->UpdateViewMatrix(); } else { - m_ProjectionMatrix = glm::perspective(glm::radians(40.f), 1.77f, 0.05f, 5000.f); - m_ViewMatrix = glm::mat4(); + m_Camera = m_DefaultCamera; auto cameras = world->GetComponents("Camera"); - if (cameras != nullptr) { ComponentWrapper& cameraC = *cameras->begin(); - m_CurrentCamera = cameraC.EntityID; + SwitchCamera(cameraC.EntityID); + world->GetComponent(m_CurrentCamera, "Model")["Visible"] = false; } } - m_RenderQueues->Clear(); - FillModels(world, &m_RenderQueues->Forward); + m_RenderFrame->Clear(); + RenderScene* rs = new RenderScene(); + rs->Camera = m_Camera; + FillModels(&rs->Forward); + m_RenderFrame->Add(*rs); } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 0ef1e4bf..972a6df8 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -90,14 +90,14 @@ void Renderer::Update(double dt) m_ImGuiRenderPass->Update(dt); } -void Renderer::Draw(RenderQueueCollection& rq) +void Renderer::Draw(RenderFrame& rf) { - m_PickingPass->Draw(rq); - //DrawScreenQuad(m_PickingPass->PickingTexture()); + m_Camera = (*rf.begin())->Camera; + m_PickingPass->Draw(rf); glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f); - m_DrawScenePass->Draw(rq); + m_DrawScenePass->Draw(rf); GLERROR("Renderer::Draw m_DrawScenePass->Draw"); m_ImGuiRenderPass->Draw(); glfwSwapBuffers(m_Window); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 4ab6f410..c104a3ad 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -47,14 +47,14 @@ Game::Game(int argc, char* argv[]) ResourceManager::Load(mapToLoad)->PopulateWorld(m_World); } - m_RenderQueues = new RenderQueueCollection(); + m_RenderFrame = new RenderFrame(); // Create system pipeline m_SystemPipeline = new SystemPipeline(m_EventBroker); m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(m_Renderer); - m_SystemPipeline->AddSystem(m_RenderQueues); + m_SystemPipeline->AddSystem(m_RenderFrame); m_LastTime = glfwGetTime(); @@ -91,7 +91,7 @@ void Game::Tick() m_Renderer->Update(dt); GLERROR("Game::Tick m_RenderQueueFactory->Update"); - m_Renderer->Draw(*m_RenderQueues); + m_Renderer->Draw(*m_RenderFrame); GLERROR("Game::Tick m_Renderer->Draw"); m_EventBroker->Swap(); m_EventBroker->Clear(); From b8db80bc409be60564d28133858a43a31662bd0f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 11 Jan 2016 10:47:39 +0100 Subject: [PATCH 07/14] Added camera to PickingPass and fixed memory leak --- include/Engine/Rendering/PickingPass.h | 1 + src/Engine/Rendering/PickingPass.cpp | 8 ++++++-- src/Engine/Rendering/RenderSystem.cpp | 1 + src/Engine/Rendering/Renderer.cpp | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h index e4ff9e27..eaca4b04 100644 --- a/include/Engine/Rendering/PickingPass.h +++ b/include/Engine/Rendering/PickingPass.h @@ -37,6 +37,7 @@ private: const IRenderer* m_Renderer; ShaderProgram* m_PickingProgram; + Camera* m_Camera; std::unordered_map m_PickingColorsToEntity; diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index f7f0558c..fbbbd7c0 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -59,6 +59,8 @@ void PickingPass::Draw(RenderFrame& rf) for(auto scene : rf.RenderScenes) { + m_Camera = scene->Camera; + for (auto &job : scene->Forward) { auto modelJob = std::dynamic_pointer_cast(job); @@ -99,8 +101,8 @@ void PickingPass::Draw(RenderFrame& rf) Events::Picking pickEvent = Events::Picking( &m_PickingBuffer, &m_DepthBuffer, - m_Renderer->Camera()->ProjectionMatrix(), - m_Renderer->Camera()->ViewMatrix(), + m_Camera->ProjectionMatrix(), + m_Camera->ViewMatrix(), Rectangle(fbWidth, fbHeight), &m_PickingColorsToEntity); @@ -109,6 +111,8 @@ void PickingPass::Draw(RenderFrame& rf) delete state; } + + void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const { //TODO: Renderer: Make this in a sparate class diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 33c03e8f..f385037b 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -263,4 +263,5 @@ void RenderSystem::Update(World* world, double dt) rs->Camera = m_Camera; FillModels(&rs->Forward); m_RenderFrame->Add(*rs); + delete rs; } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 972a6df8..9a7bfd07 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -92,7 +92,7 @@ void Renderer::Update(double dt) void Renderer::Draw(RenderFrame& rf) { - m_Camera = (*rf.begin())->Camera; + m_Camera = (*rf.begin())->Camera; // Fix this with some better solution m_PickingPass->Draw(rf); glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f); From 3feee7fd35ce5363595cbd6f713d39b0739fafad Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 11 Jan 2016 17:01:17 +0100 Subject: [PATCH 08/14] Changed the structure of how RenderJobs are handled --- include/Engine/Rendering/ModelJob.h | 57 +++++++++++++ include/Engine/Rendering/RenderJob.h | 32 +++++++ include/Engine/Rendering/RenderQueue.h | 107 +++--------------------- include/Engine/Rendering/RenderSystem.h | 3 +- src/Engine/Rendering/DrawScenePass.cpp | 3 +- src/Engine/Rendering/PickingPass.cpp | 2 +- src/Engine/Rendering/RenderSystem.cpp | 58 ++++--------- 7 files changed, 121 insertions(+), 141 deletions(-) create mode 100644 include/Engine/Rendering/ModelJob.h create mode 100644 include/Engine/Rendering/RenderJob.h diff --git a/include/Engine/Rendering/ModelJob.h b/include/Engine/Rendering/ModelJob.h new file mode 100644 index 00000000..fcb68244 --- /dev/null +++ b/include/Engine/Rendering/ModelJob.h @@ -0,0 +1,57 @@ +#ifndef ModelJob_h__ +#define ModelJob_h__ + +#include + +#include "../Common.h" +#include "../GLM.h" +#include "../Core/ComponentWrapper.h" +#include "Texture.h" +#include "Model.h" + +#include "RenderJob.h" +#include "../Core/ResourceManager.h" +#include "Camera.h" + +struct ModelJob : RenderJob +{ + ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::Model::MaterialGroup texGroup, ComponentWrapper modelComponent) + : RenderJob() + { + Model = model; + TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; + DiffuseTexture = texGroup.Texture.get(); + NormalTexture = texGroup.NormalMap.get(); + SpecularTexture = texGroup.SpecularMap.get(); + StartIndex = texGroup.StartIndex; + EndIndex = texGroup.EndIndex; + Matrix = matrix; + Color = modelComponent["Color"]; + Entity = modelComponent.EntityID; + }; + + + unsigned int TextureID; + unsigned int ShaderID; + + EntityID Entity; + glm::mat4 Matrix; + const Texture* DiffuseTexture; + const Texture* NormalTexture; + const Texture* SpecularTexture; + float Shininess = 0.f; + glm::vec4 Color; + const ::Model* Model = nullptr; + unsigned int StartIndex = 0; + unsigned int EndIndex = 0; + + + void CalculateHash() override + { + Hash = TextureID; + } + + +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/RenderJob.h b/include/Engine/Rendering/RenderJob.h new file mode 100644 index 00000000..4afe0386 --- /dev/null +++ b/include/Engine/Rendering/RenderJob.h @@ -0,0 +1,32 @@ +#ifndef RenderJob_h__ +#define RenderJob_h__ + +#include + +#include "../Common.h" +#include "../GLM.h" +#include "../Core/ComponentWrapper.h" +#include "RenderQueue.h" + + +struct RenderJob +{ + friend class RenderQueue; + +public: + + float Depth; + +protected: + uint64_t Hash; + + virtual void CalculateHash() = 0; + + bool operator<(const RenderJob& rhs) + { + return this->Hash < rhs.Hash; + } + +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 719e5cc7..01e9024a 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -9,58 +9,16 @@ #include "../Core/Util/Rectangle.h" #include "../Core/Entity.h" #include "Camera.h" +#include "RenderJob.h" +#include "ModelJob.h" class Model; class Skeleton; class Texture; -class RenderQueue; //TODO: Render: Remove obsolete RenderJobs and fix standard values on variables. +/* -struct RenderJob -{ - friend class RenderQueue; - - float Depth; - -protected: - uint64_t Hash; - - virtual void CalculateHash() = 0; - - bool operator<(const RenderJob& rhs) - { - return this->Hash < rhs.Hash; - } -}; - -struct ModelJob : RenderJob -{ - unsigned int ShaderID = 0; - unsigned int TextureID = 0; - - EntityID Entity; - glm::mat4 Matrix; - const Texture* DiffuseTexture; - const Texture* NormalTexture; - const Texture* SpecularTexture; - float Shininess = 0.f; - glm::vec4 Color; - const Model* Model = nullptr; - unsigned int StartIndex = 0; - unsigned int EndIndex = 0; - - // Animation - Skeleton* Skeleton = nullptr; - bool NoRootMotion = true; - std::string AnimationName; - double AnimationTime = 0; - - void CalculateHash() override - { - Hash = TextureID; - } -}; struct TransparentModelJob : RenderJob { @@ -123,66 +81,23 @@ struct PointLightJob : RenderJob Hash = 0; } }; - -class RenderQueue -{ -public: - template - void Add(T &job) - { - job.CalculateHash(); - Jobs.push_back(std::shared_ptr(new T(job))); - m_Size++; - } - - void Sort() - { - Jobs.sort(); - } - - void Clear() - { - Jobs.clear(); - m_Size = 0; - } - - int Size() const { return m_Size; } - std::list>::const_iterator begin() - { - return Jobs.begin(); - } - - std::list>::const_iterator end() - { - return Jobs.end(); - } - - std::list> Jobs; - -private: - int m_Size = 0; -}; +*/ struct RenderScene { - RenderQueue Forward; - RenderQueue Lights; - Camera* Camera; + ::Camera* Camera; + std::list> ForwardJobs; + std::list> LightJobs; + void Clear() { - Forward.Clear(); - Lights.Clear(); - } - - void Sort() - { - Forward.Sort(); - Lights.Sort(); + ForwardJobs.clear(); + LightJobs.clear(); } }; -class RenderFrame +struct RenderFrame { public: diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index 34a9c5f9..e322d51e 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -11,6 +11,7 @@ #include "../Core/EKeyDown.h" #include "../Input/EInputCommand.h" #include "Camera.h" +#include "ModelJob.h" class RenderSystem : public ImpureSystem @@ -48,7 +49,7 @@ private: glm::mat4 m_ProjectionMatrix; glm::mat4 ModelMatrix(EntityID entity); - void FillModels(RenderQueue* renderQueue); + void FillModels(std::list>& jobs); EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand& e); diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index dd34072f..5da2c0c6 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -32,9 +32,8 @@ void DrawScenePass::Draw(RenderFrame& rf) DrawScenePassState state; for (auto scene : rf.RenderScenes) { - scene->Forward.Jobs.sort(DrawScenePass::DepthSort); - for (auto &job : scene->Forward) { + for (auto &job : scene->ForwardJobs) { auto modelJob = std::dynamic_pointer_cast(job); if (modelJob) { GLuint ShaderHandle = m_BasicForwardProgram->GetHandle(); diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index fbbbd7c0..a09f328e 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -61,7 +61,7 @@ void PickingPass::Draw(RenderFrame& rf) { m_Camera = scene->Camera; - for (auto &job : scene->Forward) { + for (auto &job : scene->ForwardJobs) { auto modelJob = std::dynamic_pointer_cast(job); if (modelJob) { diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index f385037b..8e5f2a34 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -129,63 +129,39 @@ glm::mat4 RenderSystem::ModelMatrix(EntityID entity) return modelMatrix; } -void RenderSystem::FillModels(RenderQueue* renderQueue) +void RenderSystem::FillModels(std::list>& jobs) { auto models = m_World->GetComponents("Model"); if (models == nullptr) { return; } - for (auto& modelC : *models) { - bool visible = modelC["Visible"]; + for (auto& modelComponent : *models) { + bool visible = modelComponent["Visible"]; if (!visible) { continue; } - std::string resource = modelC["Resource"]; + std::string resource = modelComponent["Resource"]; if (resource.empty()) { continue; } - glm::vec4 color = modelC["Color"]; - Model* model = ResourceManager::Load(resource); + + + Model* model = ResourceManager::Load<::Model>(resource); if (model == nullptr) { - model = ResourceManager::Load("Models/Core/Error.obj"); + model = ResourceManager::Load<::Model>("Models/Core/Error.obj"); } + + glm::mat4 modelMatrix = ModelMatrix(modelComponent.EntityID); + glm::mat4 matrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix() * (model->m_Matrix * modelMatrix); for (auto texGroup : model->TextureGroups) { - - if (color.a < 1.0f || texGroup.Transparency < 1.0f) { - //transparent stuffs - TransparentModelJob job; - job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; - job.DiffuseTexture = texGroup.Texture.get(); - job.NormalTexture = texGroup.NormalMap.get(); - job.SpecularTexture = texGroup.SpecularMap.get(); - job.Model = model; - job.StartIndex = texGroup.StartIndex; - job.EndIndex = texGroup.EndIndex; - job.Matrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix() * (model->m_Matrix * ModelMatrix(modelC.EntityID)); - job.Color = color; - job.Entity = modelC.EntityID; - - job.Depth = 10.f; //insert real viewspace depth here - - renderQueue->Add(job); - } else { - ModelJob job; - job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; - job.DiffuseTexture = texGroup.Texture.get(); - job.NormalTexture = texGroup.NormalMap.get(); - job.SpecularTexture = texGroup.SpecularMap.get(); - job.Model = model; - job.StartIndex = texGroup.StartIndex; - job.EndIndex = texGroup.EndIndex; - job.Matrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix() * (model->m_Matrix * ModelMatrix(modelC.EntityID)); - job.Color = color; - job.Entity = modelC.EntityID; - - renderQueue->Add(job); - } + std::shared_ptr modelJob = std::shared_ptr(new ModelJob(model, m_Camera, matrix, texGroup, modelComponent)); + jobs.push_back(modelJob); } + + + } } @@ -261,7 +237,7 @@ void RenderSystem::Update(World* world, double dt) m_RenderFrame->Clear(); RenderScene* rs = new RenderScene(); rs->Camera = m_Camera; - FillModels(&rs->Forward); + FillModels(rs->ForwardJobs); m_RenderFrame->Add(*rs); delete rs; } From d469fe6e9a176477ee94b3417a2750e89a87bcad Mon Sep 17 00:00:00 2001 From: viktorljung Date: Tue, 12 Jan 2016 11:45:50 +0100 Subject: [PATCH 09/14] Removed picking event and added a pick function to renderer --- include/Engine/Editor/EditorSystem.h | 5 +- include/Engine/Rendering/EPicking.h | 74 ------------------------- include/Engine/Rendering/IRenderer.h | 8 +++ include/Engine/Rendering/PickingPass.h | 5 +- include/Engine/Rendering/RenderQueue.h | 10 +--- include/Engine/Rendering/RenderSystem.h | 6 +- include/Engine/Rendering/Renderer.h | 3 +- resources/Schema/Components/Camera.xml | 1 - resources/Schema/Components/Camera.xsd | 1 - src/Engine/Editor/EditorSystem.cpp | 8 +-- src/Engine/Rendering/DrawScenePass.cpp | 2 - src/Engine/Rendering/PickingPass.cpp | 39 ++++++++----- src/Engine/Rendering/RenderSystem.cpp | 50 ++++++++--------- src/Engine/Rendering/Renderer.cpp | 5 ++ src/Game/Game.cpp | 2 +- 15 files changed, 82 insertions(+), 137 deletions(-) delete mode 100644 include/Engine/Rendering/EPicking.h diff --git a/include/Engine/Editor/EditorSystem.h b/include/Engine/Editor/EditorSystem.h index 9b7fd487..73aaff5f 100644 --- a/include/Engine/Editor/EditorSystem.h +++ b/include/Engine/Editor/EditorSystem.h @@ -7,7 +7,6 @@ #include "../Core/ConfigFile.h" #include "../Input/EInputCommand.h" #include "../Rendering/IRenderer.h" -#include "../Rendering/EPicking.h" #include "../Rendering/RenderSystem.h" class EditorSystem : public ImpureSystem @@ -59,8 +58,8 @@ private: bool OnMousePress(const Events::MousePress& e); EventRelay m_EMouseMove; bool OnMouseMove(const Events::MouseMove& e); - EventRelay m_EPicking; - bool OnPicking(const Events::Picking& e); + + void Picking(); void updateWidget(); void setWidgetMode(WidgetMode newMode); diff --git a/include/Engine/Rendering/EPicking.h b/include/Engine/Rendering/EPicking.h deleted file mode 100644 index 85c4b629..00000000 --- a/include/Engine/Rendering/EPicking.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef Events_Picking_h__ -#define Events_Picking_h__ - -#include "../OpenGL.h" -#include "../GLM.h" - -#include "../Core/EventBroker.h" -#include "Util/ScreenCoords.h" -#include "FrameBuffer.h" -#include "../Core/Entity.h" -#include "Util/UnorderedMapVec2.h" - -namespace Events -{ - -/** Thrown Every frame, use functions to pick*/ -struct Picking : Event -{ -public: - Picking(FrameBuffer* pickingBuffer, GLuint* depthBuffer, glm::mat4 projectionMatrix, glm::mat4 viewMatrix, Rectangle resolution, const std::unordered_map* pickingColorsToEntity) - : PickingBuffer(pickingBuffer) - , DepthBuffer(depthBuffer) - , ProjectionMatrix(projectionMatrix) - , ViewMatrix(viewMatrix) - , Resolution(resolution) - , PickingColorsToEntity(pickingColorsToEntity) - { } - - - - struct PickData - { - //Picked Entity - EntityID Entity; - //World position of the "pick" - glm::vec3 Position; - // Depth - float Depth; - }; - - PickData Pick(glm::vec2 screenCoord) const - { - PickData pickData; - - // Invert screen y coordinate - screenCoord.y = Resolution.Height - screenCoord.y; - ScreenCoords::PixelData data = ScreenCoords::ToPixelData(screenCoord, PickingBuffer, *DepthBuffer); - pickData.Depth = data.Depth; - - auto it = PickingColorsToEntity->find(glm::vec2(data.Color[0], data.Color[1])); - if (it != PickingColorsToEntity->end()) { - pickData.Entity = it->second; - } else { - pickData.Entity = 0; - } - pickData.Position = ScreenCoords::ToWorldPos(screenCoord.x, screenCoord.y, data.Depth, Resolution, ProjectionMatrix, ViewMatrix); - - return pickData; - } - - -private: - FrameBuffer* PickingBuffer; - GLuint* DepthBuffer; - const glm::mat4 ProjectionMatrix; - const glm::mat4 ViewMatrix; - const Rectangle Resolution; - const std::unordered_map* PickingColorsToEntity; - -}; - -} - -#endif diff --git a/include/Engine/Rendering/IRenderer.h b/include/Engine/Rendering/IRenderer.h index 42729479..e4e5c775 100644 --- a/include/Engine/Rendering/IRenderer.h +++ b/include/Engine/Rendering/IRenderer.h @@ -10,6 +10,13 @@ #include "RenderQueue.h" #include "Model.h" +struct PickData +{ + EntityID Entity; + glm::vec3 Position; //World position + float Depth; +}; + class IRenderer { public: @@ -32,6 +39,7 @@ public: virtual void Initialize() = 0; virtual void Update(double dt) = 0; virtual void Draw(RenderFrame& rq) = 0; + virtual PickData Pick(glm::vec2 screenCord) = 0; protected: Rectangle m_Resolution = Rectangle(1280, 720); diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h index eaca4b04..08a06b0e 100644 --- a/include/Engine/Rendering/PickingPass.h +++ b/include/Engine/Rendering/PickingPass.h @@ -7,7 +7,8 @@ #include "ShaderProgram.h" #include "Util/UnorderedMapVec2.h" #include "../Core/EventBroker.h" -#include "EPicking.h" + + class PickingPass { @@ -28,6 +29,8 @@ public: GLuint DepthBuffer() const { return m_DepthBuffer; } const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; } + + PickData Pick(glm::vec2 screenCoord); private: void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 01e9024a..4ffb55f2 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -12,11 +12,8 @@ #include "RenderJob.h" #include "ModelJob.h" -class Model; -class Skeleton; -class Texture; -//TODO: Render: Remove obsolete RenderJobs and fix standard values on variables. + /* @@ -88,7 +85,7 @@ struct RenderScene ::Camera* Camera; std::list> ForwardJobs; std::list> LightJobs; - + Rectangle ViewPort; void Clear() { @@ -125,8 +122,7 @@ public: } std::list> RenderScenes; - - + private: int m_Size = 0; }; diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index e322d51e..2fa7b6f5 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -12,12 +12,12 @@ #include "../Input/EInputCommand.h" #include "Camera.h" #include "ModelJob.h" - +#include "Renderer.h" class RenderSystem : public ImpureSystem { public: - RenderSystem(EventBroker* eventBrokerer, RenderFrame* renderFrame); + RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame); virtual void Update(World* world, double dt) override; @@ -29,6 +29,7 @@ public: private: World* m_World = nullptr; + const IRenderer* m_Renderer = nullptr; RenderFrame* m_RenderFrame; bool m_SwitchCamera = false; @@ -44,6 +45,7 @@ private: void SwitchCamera(EntityID entity); void Initialize(); + void UpdateCamera(World* world, double dt); void UpdateProjectionMatrix(ComponentWrapper& cameraComponent); glm::mat4 m_ViewMatrix; glm::mat4 m_ProjectionMatrix; diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index d89fc4d2..b5a5c1b5 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -13,7 +13,6 @@ #include "PickingPass.h" #include "DrawScenePass.h" #include "../Core/EventBroker.h" -#include "EPicking.h" #include "ImGuiRenderPass.h" #include "Camera.h" @@ -29,6 +28,8 @@ public: virtual void Update(double dt) override; virtual void Draw(RenderFrame& rf) override; + virtual PickData Pick(glm::vec2 screenCoord) override; + private: //----------------------Variables----------------------// EventBroker* m_EventBroker; diff --git a/resources/Schema/Components/Camera.xml b/resources/Schema/Components/Camera.xml index 8a93dec5..92225dde 100644 --- a/resources/Schema/Components/Camera.xml +++ b/resources/Schema/Components/Camera.xml @@ -1,6 +1,5 @@ cam - 1.77 60.0 0.01 5000 diff --git a/resources/Schema/Components/Camera.xsd b/resources/Schema/Components/Camera.xsd index 3c462a3b..4f02deb0 100644 --- a/resources/Schema/Components/Camera.xsd +++ b/resources/Schema/Components/Camera.xsd @@ -10,7 +10,6 @@ - diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index 87b8642b..405b70aa 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -18,7 +18,6 @@ EditorSystem::EditorSystem(EventBroker* eventBroker, IRenderer* renderer) EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorSystem::OnMousePress); EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorSystem::OnMouseRelease); EVENT_SUBSCRIBE_MEMBER(m_EMouseMove, &EditorSystem::OnMouseMove); - EVENT_SUBSCRIBE_MEMBER(m_EPicking, &EditorSystem::OnPicking); } void EditorSystem::Update(World* world, double dt) @@ -32,7 +31,7 @@ void EditorSystem::Update(World* world, double dt) if (!m_Visible) { return; } - + Picking(); updateWidget(); drawUI(world, dt); @@ -177,10 +176,10 @@ bool EditorSystem::OnMouseRelease(const Events::MouseRelease& e) return true; } -bool EditorSystem::OnPicking(const Events::Picking& e) +void EditorSystem::Picking() { for (auto& pos : m_PickingQueue) { - auto result = e.Pick(pos); + auto result = m_Renderer->Pick(pos); EntityID entity = result.Entity; if (glm::length2(m_WidgetCurrentAxis) > 0.f) { } else { @@ -209,7 +208,6 @@ bool EditorSystem::OnPicking(const Events::Picking& e) } } m_PickingQueue.clear(); - return true; }; diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index 5da2c0c6..eb585aff 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -21,8 +21,6 @@ void DrawScenePass::InitializeShaderPrograms() m_BasicForwardProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/BasicForward.frag.glsl"))); m_BasicForwardProgram->Compile(); m_BasicForwardProgram->Link(); - - } void DrawScenePass::Draw(RenderFrame& rf) diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index a09f328e..9fbdaf8a 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -59,7 +59,7 @@ void PickingPass::Draw(RenderFrame& rf) for(auto scene : rf.RenderScenes) { - m_Camera = scene->Camera; + m_Camera = scene->Camera; for (auto &job : scene->ForwardJobs) { auto modelJob = std::dynamic_pointer_cast(job); @@ -94,25 +94,36 @@ void PickingPass::Draw(RenderFrame& rf) m_PickingBuffer.Unbind(); GLERROR("PickingPass Error"); - //Publish pick event every frame with the pick data that can be picked by the event - int fbWidth; - int fbHeight; - glfwGetFramebufferSize(m_Renderer->Window(), &fbWidth, &fbHeight); - Events::Picking pickEvent = Events::Picking( - &m_PickingBuffer, - &m_DepthBuffer, - m_Camera->ProjectionMatrix(), - m_Camera->ViewMatrix(), - Rectangle(fbWidth, fbHeight), - &m_PickingColorsToEntity); - - m_EventBroker->Publish(pickEvent); delete state; } +PickData PickingPass::Pick(glm::vec2 screenCoord) +{ + int fbWidth; + int fbHeight; + glfwGetFramebufferSize(m_Renderer->Window(), &fbWidth, &fbHeight); + + Rectangle resolution = Rectangle(fbWidth, fbHeight); + PickData pickData; + // Invert screen y coordinate + screenCoord.y = resolution.Height - screenCoord.y; + ScreenCoords::PixelData data = ScreenCoords::ToPixelData(screenCoord, &m_PickingBuffer, m_DepthBuffer); + pickData.Depth = data.Depth; + + auto it = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); + if (it != m_PickingColorsToEntity.end()) { + pickData.Entity = it->second; + } else { + pickData.Entity = 0; + } + pickData.Position = ScreenCoords::ToWorldPos(screenCoord.x, screenCoord.y, data.Depth, resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); + + return pickData; +} + void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const { //TODO: Renderer: Make this in a sparate class diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 8e5f2a34..b9d63552 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -1,15 +1,15 @@ #include "Rendering/RenderSystem.h" #include "Rendering/DebugCameraInputController.h" -RenderSystem::RenderSystem(EventBroker* eventBrokerer, RenderFrame* renderFrame) - :ImpureSystem(eventBrokerer) +RenderSystem::RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame) :ImpureSystem(eventBrokerer) { + m_Renderer = renderer; m_RenderFrame = renderFrame; Initialize(); EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand); - m_DefaultCamera = new Camera(1.77f /* should be based on width and height */, glm::radians(45.f), 0.01f, 5000.f); + m_DefaultCamera = new Camera((float)m_Renderer->Resolution().Width / m_Renderer->Resolution().Height, glm::radians(45.f), 0.01f, 5000.f); m_DefaultCamera->SetPosition(glm::vec3(0, 0, 10)); if (m_Camera == nullptr) { m_Camera = m_DefaultCamera; @@ -28,7 +28,6 @@ bool RenderSystem::OnSetCamera(const Events::SetCamera &event) } } } - return true; } @@ -42,11 +41,9 @@ void RenderSystem::SwitchCamera(EntityID entity) if (m_World->HasComponent(entity, "Model")) { m_World->GetComponent(entity, "Model")["Visible"] = false; } - m_CurrentCamera = entity; m_SwitchCamera = false; - LOG_INFO("Switched to %s", m_World->GetComponent(m_CurrentCamera, "Camera")["Name"]); } else { LOG_ERROR("Entity %i does not have a CameraComponent", entity); m_SwitchCamera = false; @@ -61,7 +58,7 @@ void RenderSystem::Initialize() void RenderSystem::UpdateProjectionMatrix(ComponentWrapper& cameraComponent) { double fov = cameraComponent["FOV"]; - double aspectRatio = cameraComponent["AspectRatio"]; + double aspectRatio = m_Renderer->Resolution().Width / m_Renderer->Resolution().Height; double nearClip = cameraComponent["NearClip"]; double farClip = cameraComponent["FarClip"]; @@ -146,22 +143,18 @@ void RenderSystem::FillModels(std::list>& jobs) continue; } - Model* model = ResourceManager::Load<::Model>(resource); if (model == nullptr) { model = ResourceManager::Load<::Model>("Models/Core/Error.obj"); } - glm::mat4 modelMatrix = ModelMatrix(modelComponent.EntityID); glm::mat4 matrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix() * (model->m_Matrix * modelMatrix); + for (auto texGroup : model->TextureGroups) { std::shared_ptr modelJob = std::shared_ptr(new ModelJob(model, m_Camera, matrix, texGroup, modelComponent)); jobs.push_back(modelJob); } - - - } } @@ -178,8 +171,21 @@ bool RenderSystem::OnInputCommand(const Events::InputCommand& e) void RenderSystem::Update(World* world, double dt) { m_World = world; - m_EventBroker->Process(); + + UpdateCamera(world, dt); + + m_RenderFrame->Clear(); + RenderScene* rs = new RenderScene(); + rs->Camera = m_Camera; + rs->ViewPort = Rectangle(1280, 720); + FillModels(rs->ForwardJobs); + m_RenderFrame->Add(*rs); + delete rs; +} + +void RenderSystem::UpdateCamera(World* world, double dt) +{ static DebugCameraInputController firstPersonInputController(m_EventBroker, -1); if (m_SwitchCamera) { @@ -199,17 +205,17 @@ void RenderSystem::Update(World* world, double dt) } ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera"); ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform"); - + firstPersonInputController.SetOrientation(glm::quat((glm::vec3)cameraTransform["Orientation"])); firstPersonInputController.SetPosition(cameraTransform["Position"]); } } - - if(world->HasComponent(m_CurrentCamera, "Camera") && world->HasComponent(m_CurrentCamera, "Transform")) { + + if (world->HasComponent(m_CurrentCamera, "Camera") && world->HasComponent(m_CurrentCamera, "Transform")) { ComponentWrapper& cameraComponent = world->GetComponent(m_CurrentCamera, "Camera"); ComponentWrapper& cameraTransform = world->GetComponent(m_CurrentCamera, "Transform"); - if(world->GetParent(m_CurrentCamera) == 1) { // world is entity 1, is this ok? + if (world->GetParent(m_CurrentCamera) == 1) { // world is entity 1, is this ok? firstPersonInputController.Update(dt); (glm::vec3&)cameraTransform["Orientation"] = glm::eulerAngles(firstPersonInputController.Orientation()); (glm::vec3&)cameraTransform["Position"] = firstPersonInputController.Position(); @@ -217,7 +223,7 @@ void RenderSystem::Update(World* world, double dt) glm::vec3 position = AbsolutePosition(world, m_CurrentCamera); glm::quat orientation = AbsoluteOrientation(world, m_CurrentCamera); - + m_Camera->SetPosition(position); m_Camera->SetOrientation(orientation); @@ -233,11 +239,5 @@ void RenderSystem::Update(World* world, double dt) world->GetComponent(m_CurrentCamera, "Model")["Visible"] = false; } } - - m_RenderFrame->Clear(); - RenderScene* rs = new RenderScene(); - rs->Camera = m_Camera; - FillModels(rs->ForwardJobs); - m_RenderFrame->Add(*rs); - delete rs; } + diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 9a7bfd07..c7aadd83 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -103,6 +103,11 @@ void Renderer::Draw(RenderFrame& rf) glfwSwapBuffers(m_Window); } +PickData Renderer::Pick(glm::vec2 screenCoord) +{ + return m_PickingPass->Pick(screenCoord); +} + void Renderer::DrawScreenQuad(GLuint textureToDraw) { glBindFramebuffer(GL_FRAMEBUFFER, 0); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index c104a3ad..ab50c7b0 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -54,7 +54,7 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(m_Renderer); - m_SystemPipeline->AddSystem(m_RenderFrame); + m_SystemPipeline->AddSystem(m_Renderer, m_RenderFrame); m_LastTime = glfwGetTime(); From 24507691900a280abc432f37d62989b246461090 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Tue, 12 Jan 2016 11:51:47 +0100 Subject: [PATCH 10/14] some cleanup --- include/Engine/Rendering/ModelJob.h | 5 ---- include/Engine/Rendering/RenderQueue.h | 33 ------------------------- include/Engine/Rendering/RenderSystem.h | 10 ++++---- src/Engine/Rendering/RenderSystem.cpp | 28 ++++++++++----------- 4 files changed, 19 insertions(+), 57 deletions(-) diff --git a/include/Engine/Rendering/ModelJob.h b/include/Engine/Rendering/ModelJob.h index fcb68244..845a85bb 100644 --- a/include/Engine/Rendering/ModelJob.h +++ b/include/Engine/Rendering/ModelJob.h @@ -8,7 +8,6 @@ #include "../Core/ComponentWrapper.h" #include "Texture.h" #include "Model.h" - #include "RenderJob.h" #include "../Core/ResourceManager.h" #include "Camera.h" @@ -30,7 +29,6 @@ struct ModelJob : RenderJob Entity = modelComponent.EntityID; }; - unsigned int TextureID; unsigned int ShaderID; @@ -45,13 +43,10 @@ struct ModelJob : RenderJob unsigned int StartIndex = 0; unsigned int EndIndex = 0; - void CalculateHash() override { Hash = TextureID; } - - }; #endif \ No newline at end of file diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 4ffb55f2..cd008340 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -15,39 +15,6 @@ /* - - -struct TransparentModelJob : RenderJob -{ - unsigned int ShaderID = 0; - unsigned int TextureID = 0; - - //TODO: RENDERER: Not sure if the best solution for pickingColor to entity link is this - EntityID Entity; - - glm::mat4 Matrix; - const Texture* DiffuseTexture; - const Texture* NormalTexture; - const Texture* SpecularTexture; - float Shininess = 0.f; - glm::vec4 Color; - const Model* Model = nullptr; - unsigned int StartIndex = 0; - unsigned int EndIndex = 0; - - // Animation - Skeleton* Skeleton = nullptr; - bool NoRootMotion = true; - std::string AnimationName; - double AnimationTime = 0; - - void CalculateHash() override - { - Hash = TextureID; - } -}; - - struct SpriteJob : RenderJob { unsigned int ShaderID = 0; diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index 2fa7b6f5..a6137b67 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -42,16 +42,16 @@ private: bool OnSetCamera(const Events::SetCamera &event); EntityID m_CurrentCamera = -1; - void SwitchCamera(EntityID entity); + void switchCamera(EntityID entity); - void Initialize(); - void UpdateCamera(World* world, double dt); - void UpdateProjectionMatrix(ComponentWrapper& cameraComponent); + void initialize(); + void updateCamera(World* world, double dt); + void updateProjectionMatrix(ComponentWrapper& cameraComponent); glm::mat4 m_ViewMatrix; glm::mat4 m_ProjectionMatrix; glm::mat4 ModelMatrix(EntityID entity); - void FillModels(std::list>& jobs); + void fillModels(std::list>& jobs); EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand& e); diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index b9d63552..3fe71f42 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -5,7 +5,7 @@ RenderSystem::RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer { m_Renderer = renderer; m_RenderFrame = renderFrame; - Initialize(); + initialize(); EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand); @@ -16,7 +16,6 @@ RenderSystem::RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer } } - bool RenderSystem::OnSetCamera(const Events::SetCamera &event) { auto cameras = m_World->GetComponents("Camera"); @@ -24,14 +23,14 @@ bool RenderSystem::OnSetCamera(const Events::SetCamera &event) if (cameras != nullptr) { for (auto it = cameras->begin(); it != cameras->end(); it++) { if ((std::string)(*it)["Name"] == event.Name) { - SwitchCamera((*it).EntityID); + switchCamera((*it).EntityID); } } } return true; } -void RenderSystem::SwitchCamera(EntityID entity) +void RenderSystem::switchCamera(EntityID entity) { if(m_World->HasComponent(entity, "Camera")) { if (m_World->HasComponent(m_CurrentCamera, "Model")) { @@ -50,12 +49,12 @@ void RenderSystem::SwitchCamera(EntityID entity) } } -void RenderSystem::Initialize() +void RenderSystem::initialize() { } -void RenderSystem::UpdateProjectionMatrix(ComponentWrapper& cameraComponent) +void RenderSystem::updateProjectionMatrix(ComponentWrapper& cameraComponent) { double fov = cameraComponent["FOV"]; double aspectRatio = m_Renderer->Resolution().Width / m_Renderer->Resolution().Height; @@ -126,7 +125,7 @@ glm::mat4 RenderSystem::ModelMatrix(EntityID entity) return modelMatrix; } -void RenderSystem::FillModels(std::list>& jobs) +void RenderSystem::fillModels(std::list>& jobs) { auto models = m_World->GetComponents("Model"); if (models == nullptr) { @@ -173,18 +172,19 @@ void RenderSystem::Update(World* world, double dt) m_World = world; m_EventBroker->Process(); - UpdateCamera(world, dt); + updateCamera(world, dt); + //Only supports opaque geometry atm m_RenderFrame->Clear(); RenderScene* rs = new RenderScene(); rs->Camera = m_Camera; rs->ViewPort = Rectangle(1280, 720); - FillModels(rs->ForwardJobs); + fillModels(rs->ForwardJobs); m_RenderFrame->Add(*rs); delete rs; } -void RenderSystem::UpdateCamera(World* world, double dt) +void RenderSystem::updateCamera(World* world, double dt) { static DebugCameraInputController firstPersonInputController(m_EventBroker, -1); @@ -196,9 +196,9 @@ void RenderSystem::UpdateCamera(World* world, double dt) if ((*it).EntityID == m_CurrentCamera) { it++; if (it != cameras->end()) { - SwitchCamera((*it).EntityID); + switchCamera((*it).EntityID); } else { - SwitchCamera((*cameras->begin()).EntityID); + switchCamera((*cameras->begin()).EntityID); } break; } @@ -227,7 +227,7 @@ void RenderSystem::UpdateCamera(World* world, double dt) m_Camera->SetPosition(position); m_Camera->SetOrientation(orientation); - UpdateProjectionMatrix(cameraComponent); + updateProjectionMatrix(cameraComponent); m_Camera->UpdateViewMatrix(); } else { m_Camera = m_DefaultCamera; @@ -235,7 +235,7 @@ void RenderSystem::UpdateCamera(World* world, double dt) auto cameras = world->GetComponents("Camera"); if (cameras != nullptr) { ComponentWrapper& cameraC = *cameras->begin(); - SwitchCamera(cameraC.EntityID); + switchCamera(cameraC.EntityID); world->GetComponent(m_CurrentCamera, "Model")["Visible"] = false; } } From e7f02f14a074d9dc6873779779c18567e00fd13b Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 14 Jan 2016 11:12:02 +0100 Subject: [PATCH 11/14] Added Transform.h that holds all the AbsoluteTransformation functions. Camera now working better with scenes. Changed Modeljob Matrix to only hold the model matrix instad of all matrix info --- include/Engine/Core/Transform.h | 62 +++++++++++++++++++ include/Engine/Editor/EditorSystem.h | 2 +- include/Engine/Rendering/DrawScenePass.h | 2 +- include/Engine/Rendering/PickingPass.h | 2 +- include/Engine/Rendering/RenderQueue.h | 2 +- include/Engine/Rendering/RenderSystem.h | 9 +-- include/Engine/Rendering/Renderer.h | 2 +- resources/Shaders/BasicForward.frag.glsl | 1 - resources/Shaders/BasicForward.vert.glsl | 6 +- resources/Shaders/Picking.frag.glsl | 3 - resources/Shaders/Picking.vert.glsl | 6 +- src/Engine/Editor/EditorSystem.cpp | 14 ++--- src/Engine/Rendering/DrawScenePass.cpp | 49 +++++++-------- src/Engine/Rendering/PickingPass.cpp | 15 ++--- src/Engine/Rendering/RenderSystem.cpp | 76 +++--------------------- src/Engine/Rendering/Renderer.cpp | 17 +++--- 16 files changed, 135 insertions(+), 133 deletions(-) create mode 100644 include/Engine/Core/Transform.h diff --git a/include/Engine/Core/Transform.h b/include/Engine/Core/Transform.h new file mode 100644 index 00000000..c43e4386 --- /dev/null +++ b/include/Engine/Core/Transform.h @@ -0,0 +1,62 @@ +#ifndef Transform_h__ +#define Transform_h__ + +#include "../GLM.h" +#include "World.h" + +static class Transform +{ +public: + static glm::vec3 AbsolutePosition(World* world, EntityID entity) + { + glm::vec3 position; + + while (entity != EntityID_Invalid) { + ComponentWrapper transform = world->GetComponent(entity, "Transform"); + EntityID parent = world->GetParent(entity); + position += AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"]; + entity = parent; + } + + return position; + }; + + static glm::quat AbsoluteOrientation(World* world, EntityID entity) + { + glm::quat orientation; + + while (entity != EntityID_Invalid) { + ComponentWrapper transform = world->GetComponent(entity, "Transform"); + orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation; + entity = world->GetParent(entity); + } + + return orientation; + }; + + static glm::vec3 AbsoluteScale(World* world, EntityID entity) + { + glm::vec3 scale(1.f); + + while (entity != EntityID_Invalid) { + ComponentWrapper transform = world->GetComponent(entity, "Transform"); + scale *= (glm::vec3)transform["Scale"]; + entity = world->GetParent(entity); + } + + return scale; + }; + + static glm::mat4 ModelMatrix(EntityID entity, World* world) + { + glm::vec3 position = Transform::AbsolutePosition(world, entity); + glm::quat orientation = Transform::AbsoluteOrientation(world, entity); + glm::vec3 scale = Transform::AbsoluteScale(world, entity); + + glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale); + return modelMatrix; + } + +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Editor/EditorSystem.h b/include/Engine/Editor/EditorSystem.h index 08b3c6a4..32eea363 100644 --- a/include/Engine/Editor/EditorSystem.h +++ b/include/Engine/Editor/EditorSystem.h @@ -9,7 +9,7 @@ #include "../Core/ConfigFile.h" #include "../Input/EInputCommand.h" #include "../Rendering/IRenderer.h" -#include "../Rendering/RenderSystem.h" +#include "../Core/Transform.h" #include "../Core/EFileDropped.h" #include "../Core/EntityFilePreprocessor.h" #include "../Core/EntityFileParser.h" diff --git a/include/Engine/Rendering/DrawScenePass.h b/include/Engine/Rendering/DrawScenePass.h index 4200383f..ca2463cf 100644 --- a/include/Engine/Rendering/DrawScenePass.h +++ b/include/Engine/Rendering/DrawScenePass.h @@ -17,7 +17,7 @@ public: void InitializeFrameBuffers(); void InitializeShaderPrograms(); - void Draw(RenderFrame& rf); + void Draw(RenderScene& scene); //Getters diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h index 08a06b0e..01613651 100644 --- a/include/Engine/Rendering/PickingPass.h +++ b/include/Engine/Rendering/PickingPass.h @@ -19,7 +19,7 @@ public: void InitializeFrameBuffers(); void InitializeShaderPrograms(); - void Draw(RenderFrame& rf); + void Draw(RenderScene& scene); //Getters diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index cd008340..dba34c3e 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -52,7 +52,7 @@ struct RenderScene ::Camera* Camera; std::list> ForwardJobs; std::list> LightJobs; - Rectangle ViewPort; + Rectangle Viewport; void Clear() { diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index 473fae0b..93e7233f 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -13,6 +13,7 @@ #include "Camera.h" #include "ModelJob.h" #include "Renderer.h" +#include "../Core/Transform.h" class RenderSystem : public ImpureSystem { @@ -21,12 +22,6 @@ public: 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: World* m_World = nullptr; const IRenderer* m_Renderer = nullptr; @@ -44,13 +39,11 @@ private: void switchCamera(EntityID entity); - void initialize(); void updateCamera(World* world, double dt); void updateProjectionMatrix(ComponentWrapper& cameraComponent); glm::mat4 m_ViewMatrix; glm::mat4 m_ProjectionMatrix; - glm::mat4 ModelMatrix(EntityID entity, World* world); void fillModels(std::list>& jobs, World* world); EventRelay m_EInputCommand; diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b5a5c1b5..6dd7e250 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -26,7 +26,7 @@ public: virtual void Initialize() override; virtual void Update(double dt) override; - virtual void Draw(RenderFrame& rf) override; + virtual void Draw(RenderFrame& frame) override; virtual PickData Pick(glm::vec2 screenCoord) override; diff --git a/resources/Shaders/BasicForward.frag.glsl b/resources/Shaders/BasicForward.frag.glsl index 9ca4db99..dc04f59f 100644 --- a/resources/Shaders/BasicForward.frag.glsl +++ b/resources/Shaders/BasicForward.frag.glsl @@ -1,6 +1,5 @@ #version 430 -uniform mat4 Matrix; uniform vec4 Color; uniform sampler2D texture0; diff --git a/resources/Shaders/BasicForward.vert.glsl b/resources/Shaders/BasicForward.vert.glsl index a7fe2d9f..96f081f4 100644 --- a/resources/Shaders/BasicForward.vert.glsl +++ b/resources/Shaders/BasicForward.vert.glsl @@ -1,6 +1,8 @@ #version 430 -uniform mat4 Matrix; +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; @@ -23,7 +25,7 @@ out VertexData{ void main() { - gl_Position = Matrix * vec4(Position, 1.0); + gl_Position = P * V * M * vec4(Position, 1.0); Output.Position = Position; Output.TextureCoordinate = TextureCoords; diff --git a/resources/Shaders/Picking.frag.glsl b/resources/Shaders/Picking.frag.glsl index 8c95ead3..59f761f9 100644 --- a/resources/Shaders/Picking.frag.glsl +++ b/resources/Shaders/Picking.frag.glsl @@ -1,8 +1,5 @@ #version 430 -uniform mat4 M; -uniform mat4 V; -uniform mat4 P; uniform vec2 PickingColor; in VertexData{ diff --git a/resources/Shaders/Picking.vert.glsl b/resources/Shaders/Picking.vert.glsl index e9680bd1..b2857cea 100644 --- a/resources/Shaders/Picking.vert.glsl +++ b/resources/Shaders/Picking.vert.glsl @@ -1,6 +1,8 @@ #version 430 -uniform mat4 Matrix; +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; layout(location = 0) in vec3 Position; layout(location = 1) in vec3 Normal; @@ -20,7 +22,7 @@ out VertexData{ void main() { - gl_Position = Matrix * vec4(Position, 1.0); + gl_Position = P * V* M * vec4(Position, 1.0); Output.Position = Position; } \ No newline at end of file diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index 80c4991a..73050781 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -159,7 +159,7 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e) EntityID parent = m_World->GetParent(m_Selection); glm::quat inverseParentOrientation; //if (parent != 0) { - inverseParentOrientation = glm::inverse(RenderSystem::AbsoluteOrientation(m_World, parent)); + inverseParentOrientation = glm::inverse(Transform::AbsoluteOrientation(m_World, parent)); //} (glm::vec3&)m_World->GetComponent(m_Selection, "Transform")["Position"] += inverseParentOrientation * movement; } else if (m_WidgetSpace == WidgetSpace::Local) { @@ -178,7 +178,7 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e) // parentOrientation = RenderSystem::AbsoluteOrientation(m_World, parent); //} glm::vec3& selectionOrientation = m_World->GetComponent(m_Selection, "Transform")["Orientation"]; - glm::quat currentOrientation = RenderSystem::AbsoluteOrientation(m_World, m_Selection); + glm::quat currentOrientation = Transform::AbsoluteOrientation(m_World, m_Selection); //glm::quat currentOrientation = parentOrientation * glm::quat(selectionOrientation); glm::quat deltaOrientation(finalMovement); selectionOrientation = glm::eulerAngles(glm::inverse(parentOrientation) * (deltaOrientation * currentOrientation)); @@ -321,10 +321,10 @@ void EditorSystem::updateWidget() if (m_Selection != EntityID_Invalid) { auto widgetTransform = m_World->GetComponent(m_Widget, "Transform"); - glm::vec3 selectionPosition = RenderSystem::AbsolutePosition(m_World, m_Selection); + glm::vec3 selectionPosition = Transform::AbsolutePosition(m_World, m_Selection); widgetTransform["Position"] = selectionPosition; if (m_WidgetSpace == WidgetSpace::Local) { - widgetTransform["Orientation"] = glm::eulerAngles(RenderSystem::AbsoluteOrientation(m_World, m_Selection)); + widgetTransform["Orientation"] = glm::eulerAngles(Transform::AbsoluteOrientation(m_World, m_Selection)); } } } @@ -359,7 +359,7 @@ void EditorSystem::setWidgetMode(WidgetMode newMode) if (m_Selection != EntityID_Invalid) { if (m_WidgetSpace == WidgetSpace::Local) { auto selectionTransform = m_World->GetComponent(m_Selection, "Transform"); - widgetTransform["Orientation"] = glm::eulerAngles(RenderSystem::AbsoluteOrientation(m_World, m_Selection)); + widgetTransform["Orientation"] = glm::eulerAngles(Transform::AbsoluteOrientation(m_World, m_Selection)); } } } else if (newMode == WidgetMode::Scale) { @@ -370,7 +370,7 @@ void EditorSystem::setWidgetMode(WidgetMode newMode) m_World->GetComponent(m_WidgetOrigin, "Model")["Resource"] = "Models/ScaleWidgetOrigin.obj"; if (m_Selection != EntityID_Invalid) { auto selectionTransform = m_World->GetComponent(m_Selection, "Transform"); - widgetTransform["Orientation"] = glm::eulerAngles(RenderSystem::AbsoluteOrientation(m_World, m_Selection)); + widgetTransform["Orientation"] = glm::eulerAngles(Transform::AbsoluteOrientation(m_World, m_Selection)); } } else if (newMode == WidgetMode::Rotate) { m_World->GetComponent(m_WidgetX, "Model")["Resource"] = "Models/RotationWidgetX.obj"; @@ -379,7 +379,7 @@ void EditorSystem::setWidgetMode(WidgetMode newMode) if (m_Selection != EntityID_Invalid) { auto selectionTransform = m_World->GetComponent(m_Selection, "Transform"); if (m_WidgetSpace == WidgetSpace::Local) { - widgetTransform["Orientation"] = glm::eulerAngles(RenderSystem::AbsoluteOrientation(m_World, m_Selection)); + widgetTransform["Orientation"] = glm::eulerAngles(Transform::AbsoluteOrientation(m_World, m_Selection)); } } } diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index eb585aff..5e5d32a7 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -23,40 +23,41 @@ void DrawScenePass::InitializeShaderPrograms() m_BasicForwardProgram->Link(); } -void DrawScenePass::Draw(RenderFrame& rf) +void DrawScenePass::Draw(RenderScene& scene) { //glBindFramebuffer(GL_FRAMEBUFFER, 0); GLERROR("Renderer::Draw PickingPass"); DrawScenePassState state; - for (auto scene : rf.RenderScenes) { - for (auto &job : scene->ForwardJobs) { - auto modelJob = std::dynamic_pointer_cast(job); - if (modelJob) { - GLuint ShaderHandle = m_BasicForwardProgram->GetHandle(); + for (auto &job : scene.ForwardJobs) { + auto modelJob = std::dynamic_pointer_cast(job); + if (modelJob) { + GLuint ShaderHandle = m_BasicForwardProgram->GetHandle(); - m_BasicForwardProgram->Bind(); - //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "Matrix"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); + m_BasicForwardProgram->Bind(); + //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glUniform4fv(glGetUniformLocation(ShaderHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); - //TODO: Renderer: bättre textur felhantering samt fler texturer stöd - if (modelJob->DiffuseTexture != nullptr) { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); - } else { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); - } - - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); - glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); - - continue; + //TODO: Renderer: bättre textur felhantering samt fler texturer stöd + if (modelJob->DiffuseTexture != nullptr) { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture->m_Texture); + } else { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); } + + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); + + //continue; } } + GLERROR("DrawScene Error"); } diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index 95110aa4..e6a8842d 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -43,7 +43,7 @@ void PickingPass::InitializeShaderPrograms() m_PickingProgram->Link(); } -void PickingPass::Draw(RenderFrame& rf) +void PickingPass::Draw(RenderScene& scene) { m_PickingColorsToEntity.clear(); PickingPassState* state = new PickingPassState(m_PickingBuffer.GetHandle()); @@ -57,11 +57,9 @@ void PickingPass::Draw(RenderFrame& rf) std::map entityColors; - for(auto scene : rf.RenderScenes) - { - m_Camera = scene->Camera; + m_Camera = scene.Camera; - for (auto &job : scene->ForwardJobs) { + for (auto &job : scene.ForwardJobs) { auto modelJob = std::dynamic_pointer_cast(job); if (modelJob) { @@ -81,7 +79,10 @@ void PickingPass::Draw(RenderFrame& rf) } m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "Matrix"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); glBindVertexArray(modelJob->Model->VAO); @@ -89,7 +90,7 @@ void PickingPass::Draw(RenderFrame& rf) glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, nullptr, modelJob->StartIndex); } } - } + m_PickingBuffer.Unbind(); GLERROR("PickingPass Error"); diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 5bcdb384..7c570953 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -5,7 +5,6 @@ RenderSystem::RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer { m_Renderer = renderer; m_RenderFrame = renderFrame; - initialize(); EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand); @@ -52,11 +51,6 @@ void RenderSystem::switchCamera(EntityID entity) } } -void RenderSystem::initialize() -{ - -} - void RenderSystem::updateProjectionMatrix(ComponentWrapper& cameraComponent) { double fov = cameraComponent["FOV"]; @@ -74,56 +68,6 @@ void RenderSystem::updateProjectionMatrix(ComponentWrapper& cameraComponent) m_Camera->UpdateProjectionMatrix(); } -glm::vec3 RenderSystem::AbsolutePosition(World* world, EntityID entity) -{ - glm::vec3 position; - - while (entity != EntityID_Invalid) { - ComponentWrapper transform = world->GetComponent(entity, "Transform"); - EntityID parent = world->GetParent(entity); - position += AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"]; - entity = parent; - } - - return position; -} - -glm::quat RenderSystem::AbsoluteOrientation(World* world, EntityID entity) -{ - glm::quat orientation; - - while (entity != EntityID_Invalid) { - ComponentWrapper transform = world->GetComponent(entity, "Transform"); - orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation; - entity = world->GetParent(entity); - } - - return orientation; -} - -glm::vec3 RenderSystem::AbsoluteScale(World* world, EntityID entity) -{ - glm::vec3 scale(1.f); - - while (entity != EntityID_Invalid) { - ComponentWrapper transform = world->GetComponent(entity, "Transform"); - scale *= (glm::vec3)transform["Scale"]; - entity = world->GetParent(entity); - } - - return scale; -} - -glm::mat4 RenderSystem::ModelMatrix(EntityID entity, World* world) -{ - 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(std::list>& jobs, World* world) { auto models = world->GetComponents("Model"); @@ -146,11 +90,10 @@ void RenderSystem::fillModels(std::list>& jobs, World model = ResourceManager::Load<::Model>("Models/Core/Error.obj"); } - glm::mat4 modelMatrix = ModelMatrix(modelComponent.EntityID, world); - glm::mat4 matrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix() * (model->m_Matrix * modelMatrix); + glm::mat4 modelMatrix = Transform::ModelMatrix(modelComponent.EntityID, world); for (auto texGroup : model->TextureGroups) { - std::shared_ptr modelJob = std::shared_ptr(new ModelJob(model, m_Camera, matrix, texGroup, modelComponent)); + std::shared_ptr modelJob = std::shared_ptr(new ModelJob(model, m_Camera, modelMatrix, texGroup, modelComponent)); jobs.push_back(modelJob); } } @@ -175,12 +118,11 @@ void RenderSystem::Update(World* world, double dt) //Only supports opaque geometry atm m_RenderFrame->Clear(); - RenderScene* rs = new RenderScene(); - rs->Camera = m_Camera; - rs->ViewPort = Rectangle(1280, 720); - fillModels(rs->ForwardJobs, world); - m_RenderFrame->Add(*rs); - delete rs; + RenderScene rs; + rs.Camera = m_Camera; + rs.Viewport = Rectangle(1280, 720); + fillModels(rs.ForwardJobs, world); + m_RenderFrame->Add(rs); } void RenderSystem::updateCamera(World* world, double dt) @@ -218,8 +160,8 @@ void RenderSystem::updateCamera(World* world, double dt) (glm::vec3&)cameraTransform["Orientation"] = glm::eulerAngles(firstPersonInputController.Orientation()); (glm::vec3&)cameraTransform["Position"] = firstPersonInputController.Position(); - glm::vec3 position = AbsolutePosition(world, m_CurrentCamera); - glm::quat orientation = AbsoluteOrientation(world, m_CurrentCamera); + glm::vec3 position = Transform::AbsolutePosition(world, m_CurrentCamera); + glm::quat orientation = Transform::AbsoluteOrientation(world, m_CurrentCamera); m_Camera->SetPosition(position); m_Camera->SetOrientation(orientation); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index e60d3d11..01e52929 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -89,15 +89,18 @@ void Renderer::Update(double dt) m_ImGuiRenderPass->Update(dt); } -void Renderer::Draw(RenderFrame& rf) +void Renderer::Draw(RenderFrame& frame) { - m_Camera = (*rf.begin())->Camera; // Fix this with some better solution - m_PickingPass->Draw(rf); - - glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f); + for (auto scene : frame.RenderScenes){ + m_Camera = scene->Camera; // remove renderer camera when Editor uses the render scene cameras. + m_PickingPass->Draw(*scene); + + glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f); + + m_DrawScenePass->Draw(*scene); + GLERROR("Renderer::Draw m_DrawScenePass->Draw"); + } - m_DrawScenePass->Draw(rf); - GLERROR("Renderer::Draw m_DrawScenePass->Draw"); m_ImGuiRenderPass->Draw(); glfwSwapBuffers(m_Window); } From 96371a08c8b066d88eb9dc8a2217f05a9067cf46 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 14 Jan 2016 15:26:06 +0100 Subject: [PATCH 12/14] Changed Picking colors from vec2 to ivec2. Picking now working for multiple scenes (Solution not perfect in the editor, yet) --- include/Engine/Editor/EditorSystem.h | 2 + include/Engine/Rendering/Camera.h | 4 ++ include/Engine/Rendering/IRenderer.h | 1 + include/Engine/Rendering/ModelJob.h | 5 +- include/Engine/Rendering/PickingPass.h | 20 +++++-- .../Engine/Rendering/Util/UnorderedMapiVec2.h | 24 +++++++++ src/Engine/Editor/EditorSystem.cpp | 9 ++-- src/Engine/Rendering/Camera.cpp | 12 +++++ src/Engine/Rendering/DrawScenePass.cpp | 2 +- src/Engine/Rendering/DrawScenePassState.cpp | 4 +- src/Engine/Rendering/PickingPass.cpp | 54 +++++++++++++------ src/Engine/Rendering/PickingPassState.cpp | 4 +- src/Engine/Rendering/RenderSystem.cpp | 20 ++++++- src/Engine/Rendering/Renderer.cpp | 6 ++- 14 files changed, 133 insertions(+), 34 deletions(-) create mode 100644 include/Engine/Rendering/Util/UnorderedMapiVec2.h diff --git a/include/Engine/Editor/EditorSystem.h b/include/Engine/Editor/EditorSystem.h index 32eea363..05e106d9 100644 --- a/include/Engine/Editor/EditorSystem.h +++ b/include/Engine/Editor/EditorSystem.h @@ -25,6 +25,7 @@ public: private: IRenderer* m_Renderer; World* m_World = nullptr; + Camera* m_Camera = nullptr; bool m_Enabled; bool m_Visible; @@ -56,6 +57,7 @@ private: EntityID m_WidgetOrigin = EntityID_Invalid; glm::vec3 m_WidgetCurrentAxis; float m_WidgetPickingDepth = 0.f; + glm::vec3 m_WidgetPickingPosition = glm::vec3(0); EntityID m_Selection = EntityID_Invalid; EntityID m_LastSelection = EntityID_Invalid; diff --git a/include/Engine/Rendering/Camera.h b/include/Engine/Rendering/Camera.h index a1aae1bd..2b863448 100644 --- a/include/Engine/Rendering/Camera.h +++ b/include/Engine/Rendering/Camera.h @@ -27,7 +27,11 @@ public: void SetOrientation(glm::quat val); glm::mat4 ProjectionMatrix() const { return m_ProjectionMatrix; } + void SetProjectionMatrix(glm::mat4 val); + glm::mat4 ViewMatrix() const { return m_ViewMatrix; } + void SetViewMatrix(glm::mat4 val); + float AspectRatio() const { return m_AspectRatio; } void SetAspectRatio(float val); diff --git a/include/Engine/Rendering/IRenderer.h b/include/Engine/Rendering/IRenderer.h index e1ec19e5..8aaf3e2d 100644 --- a/include/Engine/Rendering/IRenderer.h +++ b/include/Engine/Rendering/IRenderer.h @@ -15,6 +15,7 @@ struct PickData EntityID Entity; glm::vec3 Position; //World position float Depth; + ::Camera* Camera; }; class IRenderer diff --git a/include/Engine/Rendering/ModelJob.h b/include/Engine/Rendering/ModelJob.h index 845a85bb..d598766f 100644 --- a/include/Engine/Rendering/ModelJob.h +++ b/include/Engine/Rendering/ModelJob.h @@ -11,10 +11,11 @@ #include "RenderJob.h" #include "../Core/ResourceManager.h" #include "Camera.h" +#include "../Core/World.h" struct ModelJob : RenderJob { - ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::Model::MaterialGroup texGroup, ComponentWrapper modelComponent) + ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::Model::MaterialGroup texGroup, ComponentWrapper modelComponent, World* world) : RenderJob() { Model = model; @@ -27,6 +28,7 @@ struct ModelJob : RenderJob Matrix = matrix; Color = modelComponent["Color"]; Entity = modelComponent.EntityID; + World = world; }; unsigned int TextureID; @@ -42,6 +44,7 @@ struct ModelJob : RenderJob const ::Model* Model = nullptr; unsigned int StartIndex = 0; unsigned int EndIndex = 0; + const World* World; void CalculateHash() override { diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h index 01613651..523c7d65 100644 --- a/include/Engine/Rendering/PickingPass.h +++ b/include/Engine/Rendering/PickingPass.h @@ -5,10 +5,9 @@ #include "PickingPassState.h" #include "FrameBuffer.h" #include "ShaderProgram.h" -#include "Util/UnorderedMapVec2.h" +#include "Util/UnorderedMapiVec2.h" #include "../Core/EventBroker.h" - - +#include "../Core/World.h" class PickingPass { @@ -20,11 +19,12 @@ public: void InitializeShaderPrograms(); void Draw(RenderScene& scene); + void ClearPicking(); //Getters const ShaderProgram& PickingProgram() const { return *m_PickingProgram; } - const std::unordered_map& PickingColorsToEntity() const { return m_PickingColorsToEntity; } + //const std::unordered_map& PickingColorsToEntity() const { return m_PickingColorsToEntity; } GLuint PickingTexture() const { return m_PickingTexture; } GLuint DepthBuffer() const { return m_DepthBuffer; } const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; } @@ -42,12 +42,22 @@ private: ShaderProgram* m_PickingProgram; Camera* m_Camera; - std::unordered_map m_PickingColorsToEntity; + struct PickingInfo + { + EntityID Entity; + const ::World* World; + ::Camera* Camera; + }; + + std::unordered_map m_PickingColorsToEntity; GLuint m_PickingTexture; GLuint m_DepthBuffer; FrameBuffer m_PickingBuffer; + + int m_ColorCounter[2]; + std::map, glm::ivec2> m_EntityColors; }; #endif \ No newline at end of file diff --git a/include/Engine/Rendering/Util/UnorderedMapiVec2.h b/include/Engine/Rendering/Util/UnorderedMapiVec2.h new file mode 100644 index 00000000..9797046e --- /dev/null +++ b/include/Engine/Rendering/Util/UnorderedMapiVec2.h @@ -0,0 +1,24 @@ +#pragma once +#ifndef UnorderedMapiVec2_h__ +#define UnorderedMapiVec2_h__ + +#include +#include +#include + +template<> +struct std::hash +{ + inline std::size_t operator()(const glm::ivec2 &v) const + { + return boost::hash()(v.x) ^ boost::hash()(v.y); + } + + inline bool operator()(const glm::ivec2& a, const glm::ivec2& b)const + { + return a.x == b.x && a.y == b.y; + } + +}; + +#endif \ No newline at end of file diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index 73050781..a687d506 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -127,7 +127,7 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e) auto widgetTransform = m_World->GetComponent(m_Widget, "Transform"); glm::vec3 widgetOrientation = widgetTransform["Orientation"]; - glm::quat totalOrientation = m_Renderer->Camera()->Orientation() * glm::inverse(glm::quat(widgetOrientation)); + glm::quat totalOrientation = m_Camera->Orientation() * glm::inverse(glm::quat(widgetOrientation)); int width; int height; @@ -139,14 +139,14 @@ bool EditorSystem::OnMouseMove(const Events::MouseMove& e) delta2, m_WidgetPickingDepth, res, - m_Renderer->Camera()->ProjectionMatrix(), + m_Camera->ProjectionMatrix(), glm::toMat4(glm::inverse(totalOrientation)) ); glm::vec3 origin = ScreenCoords::ToWorldPos( glm::vec2(res.Width / 2.f, res.Height / 2.f), m_WidgetPickingDepth, res, - m_Renderer->Camera()->ProjectionMatrix(), + m_Camera->ProjectionMatrix(), glm::toMat4(glm::inverse(totalOrientation)) ); deltaWorld = deltaWorld - origin; @@ -252,7 +252,7 @@ void EditorSystem::Picking() (entity == m_WidgetZ) || (entity == m_WidgetOrigin) || (entity == m_WidgetPlaneX || entity == m_WidgetPlaneY) ); m_WidgetPickingDepth = result.Depth; - + m_Camera = result.Camera; //auto widgetTransform = m_World->GetComponent(m_Widget, "Transform"); //auto selectionTransform = m_World->GetComponent(m_Selection, "Transform"); //widgetTransform["Position"] = (glm::vec3)selectionTransform["Position"]; @@ -263,6 +263,7 @@ void EditorSystem::Picking() } setWidgetMode(m_WidgetMode); m_Selection = entity; + m_Camera = result.Camera; } } } diff --git a/src/Engine/Rendering/Camera.cpp b/src/Engine/Rendering/Camera.cpp index ecc5d5cc..5a774c34 100644 --- a/src/Engine/Rendering/Camera.cpp +++ b/src/Engine/Rendering/Camera.cpp @@ -50,6 +50,18 @@ void Camera::SetOrientation(glm::quat val) UpdateViewMatrix(); } + +void Camera::SetProjectionMatrix(glm::mat4 val) +{ + m_ProjectionMatrix = val; +} + + +void Camera::SetViewMatrix(glm::mat4 val) +{ + m_ViewMatrix = val; +} + //void Camera::Pitch(float val) //{ // m_Pitch = val; diff --git a/src/Engine/Rendering/DrawScenePass.cpp b/src/Engine/Rendering/DrawScenePass.cpp index 5e5d32a7..8fe6d827 100644 --- a/src/Engine/Rendering/DrawScenePass.cpp +++ b/src/Engine/Rendering/DrawScenePass.cpp @@ -28,7 +28,7 @@ void DrawScenePass::Draw(RenderScene& scene) //glBindFramebuffer(GL_FRAMEBUFFER, 0); GLERROR("Renderer::Draw PickingPass"); - DrawScenePassState state; + DrawScenePassState state = DrawScenePassState(); for (auto &job : scene.ForwardJobs) { auto modelJob = std::dynamic_pointer_cast(job); diff --git a/src/Engine/Rendering/DrawScenePassState.cpp b/src/Engine/Rendering/DrawScenePassState.cpp index 8cbc3e9b..2d643697 100644 --- a/src/Engine/Rendering/DrawScenePassState.cpp +++ b/src/Engine/Rendering/DrawScenePassState.cpp @@ -10,8 +10,8 @@ DrawScenePassState::DrawScenePassState() Enable(GL_CULL_FACE); Enable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - ClearColor(glm::vec4(255.f / 255, 163.f / 255, 176.f / 255, 0.f)); - Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + // ClearColor(glm::vec4(255.f / 255, 163.f / 255, 176.f / 255, 0.f)); + // Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } DrawScenePassState::~DrawScenePassState() diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index e6a8842d..f4f3d490 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -45,17 +45,15 @@ void PickingPass::InitializeShaderPrograms() void PickingPass::Draw(RenderScene& scene) { - m_PickingColorsToEntity.clear(); PickingPassState* state = new PickingPassState(m_PickingBuffer.GetHandle()); - int r = 0; - int g = 0; + //TODO: Render: Add code for more jobs than modeljobs. GLuint ShaderHandle = m_PickingProgram->GetHandle(); m_PickingProgram->Bind(); - std::map entityColors; + m_Camera = scene.Camera; @@ -63,22 +61,28 @@ void PickingPass::Draw(RenderScene& scene) auto modelJob = std::dynamic_pointer_cast(job); if (modelJob) { - int pickColor[2] = { r, g }; - auto color = entityColors.find(modelJob->Entity); - if (color != entityColors.end()) { + int pickColor[2] = { m_ColorCounter[0], m_ColorCounter[1] }; + + PickingInfo pickInfo; + pickInfo.Entity = modelJob->Entity; + pickInfo.World = modelJob->World; + pickInfo.Camera = scene.Camera; + + auto color = m_EntityColors.find(std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera)); + if (color != m_EntityColors.end()) { pickColor[0] = color->second[0]; pickColor[1] = color->second[1]; } else { - entityColors[modelJob->Entity] = glm::vec2(pickColor[0], pickColor[1]); - if (r + 10 > 255) { - r = 0; - g += 1; + m_EntityColors[std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera)] = glm::ivec2(pickColor[0], pickColor[1]); + if (m_ColorCounter[0] > 255) { + m_ColorCounter[0] = 0; + m_ColorCounter[1]++;; } else { - r += 1; + m_ColorCounter[0]++;; } } - m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; + m_PickingColorsToEntity[glm::ivec2(pickColor[0], pickColor[1])] = pickInfo; glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); @@ -101,6 +105,19 @@ void PickingPass::Draw(RenderScene& scene) +void PickingPass::ClearPicking() +{ + m_PickingColorsToEntity.clear(); + m_EntityColors.clear(); + m_ColorCounter[0] = 0; + m_ColorCounter[1] = 0; + + m_PickingBuffer.Bind(); + glClearColor(0.f, 0.f, 0.f, 0.f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + m_PickingBuffer.Unbind(); +} + PickData PickingPass::Pick(glm::vec2 screenCoord) { int fbWidth; @@ -114,14 +131,19 @@ PickData PickingPass::Pick(glm::vec2 screenCoord) ScreenCoords::PixelData data = ScreenCoords::ToPixelData(screenCoord, &m_PickingBuffer, m_DepthBuffer); pickData.Depth = data.Depth; - auto it = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); + PickingInfo pickInfo; + + auto it = m_PickingColorsToEntity.find(glm::ivec2(data.Color[0], data.Color[1])); if (it != m_PickingColorsToEntity.end()) { - pickData.Entity = it->second; + pickInfo = it->second; } else { pickData.Entity = EntityID_Invalid; } - pickData.Position = ScreenCoords::ToWorldPos(screenCoord.x, screenCoord.y, data.Depth, resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); + pickData.Position = ScreenCoords::ToWorldPos(screenCoord.x, screenCoord.y, data.Depth, resolution, pickInfo.Camera->ProjectionMatrix(), pickInfo.Camera->ViewMatrix()); + + pickData.Entity = pickInfo.Entity; + pickData.Camera = pickInfo.Camera; return pickData; } diff --git a/src/Engine/Rendering/PickingPassState.cpp b/src/Engine/Rendering/PickingPassState.cpp index 1e28ea66..2b4f30c4 100644 --- a/src/Engine/Rendering/PickingPassState.cpp +++ b/src/Engine/Rendering/PickingPassState.cpp @@ -10,8 +10,8 @@ PickingPassState::PickingPassState(GLuint frameBuffer) Enable(GL_CULL_FACE); glm::vec4 clearColor = glm::vec4(0.f); - ClearColor(clearColor); - Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + //ClearColor(clearColor); + //Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } PickingPassState::~PickingPassState() diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 7c570953..82d9772b 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -93,7 +93,7 @@ void RenderSystem::fillModels(std::list>& jobs, World glm::mat4 modelMatrix = Transform::ModelMatrix(modelComponent.EntityID, world); for (auto texGroup : model->TextureGroups) { - std::shared_ptr modelJob = std::shared_ptr(new ModelJob(model, m_Camera, modelMatrix, texGroup, modelComponent)); + std::shared_ptr modelJob = std::shared_ptr(new ModelJob(model, m_Camera, modelMatrix, texGroup, modelComponent, world)); jobs.push_back(modelJob); } } @@ -118,11 +118,25 @@ void RenderSystem::Update(World* world, double dt) //Only supports opaque geometry atm m_RenderFrame->Clear(); + + + RenderScene rs; rs.Camera = m_Camera; rs.Viewport = Rectangle(1280, 720); fillModels(rs.ForwardJobs, world); m_RenderFrame->Add(rs); + + RenderScene rs2; + rs2.Camera = new Camera((float)m_Renderer->Resolution().Width / m_Renderer->Resolution().Height, glm::radians(45.f), 0.01f, 5000.f);; + rs2.Camera->SetProjectionMatrix(glm::mat4(1)); + rs2.Camera->SetViewMatrix(glm::mat4(1)); + + rs2.Viewport = Rectangle(1280, 720); + fillModels(rs2.ForwardJobs, world); + m_RenderFrame->Add(rs2); + + } void RenderSystem::updateCamera(World* world, double dt) @@ -167,7 +181,7 @@ void RenderSystem::updateCamera(World* world, double dt) m_Camera->SetOrientation(orientation); updateProjectionMatrix(cameraComponent); - m_Camera->UpdateViewMatrix(); + } } else { m_Camera = m_DefaultCamera; @@ -186,5 +200,7 @@ void RenderSystem::updateCamera(World* world, double dt) } } } + + m_Camera->UpdateViewMatrix(); } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 01e52929..51546f5b 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -91,11 +91,15 @@ void Renderer::Update(double dt) void Renderer::Draw(RenderFrame& frame) { + glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 0.f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + m_PickingPass->ClearPicking(); for (auto scene : frame.RenderScenes){ m_Camera = scene->Camera; // remove renderer camera when Editor uses the render scene cameras. m_PickingPass->Draw(*scene); - glClearColor(255.f / 255, 163.f / 255, 176.f / 255, 1.f); + m_DrawScenePass->Draw(*scene); GLERROR("Renderer::Draw m_DrawScenePass->Draw"); From 143648860b10af1732acdb2006025ccf66de2e4b Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 14 Jan 2016 15:32:41 +0100 Subject: [PATCH 13/14] Added world pointer to PickData --- include/Engine/Rendering/IRenderer.h | 1 + src/Engine/Editor/EditorSystem.cpp | 3 +-- src/Engine/Rendering/PickingPass.cpp | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/Engine/Rendering/IRenderer.h b/include/Engine/Rendering/IRenderer.h index 8aaf3e2d..773da732 100644 --- a/include/Engine/Rendering/IRenderer.h +++ b/include/Engine/Rendering/IRenderer.h @@ -16,6 +16,7 @@ struct PickData glm::vec3 Position; //World position float Depth; ::Camera* Camera; + const ::World* World; }; class IRenderer diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index a687d506..de57c705 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -245,6 +245,7 @@ void EditorSystem::Picking() LOG_INFO("Selected %i", entity); if (entity != EntityID_Invalid) { EntityID parent = m_World->GetParent(entity); + m_Camera = result.Camera; if (parent == m_Widget) { m_WidgetCurrentAxis = glm::vec3( (entity == m_WidgetX) || (entity == m_WidgetOrigin) || (entity == m_WidgetPlaneY || entity == m_WidgetPlaneZ), @@ -252,7 +253,6 @@ void EditorSystem::Picking() (entity == m_WidgetZ) || (entity == m_WidgetOrigin) || (entity == m_WidgetPlaneX || entity == m_WidgetPlaneY) ); m_WidgetPickingDepth = result.Depth; - m_Camera = result.Camera; //auto widgetTransform = m_World->GetComponent(m_Widget, "Transform"); //auto selectionTransform = m_World->GetComponent(m_Selection, "Transform"); //widgetTransform["Position"] = (glm::vec3)selectionTransform["Position"]; @@ -263,7 +263,6 @@ void EditorSystem::Picking() } setWidgetMode(m_WidgetMode); m_Selection = entity; - m_Camera = result.Camera; } } } diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index f4f3d490..aa42a961 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -144,6 +144,7 @@ PickData PickingPass::Pick(glm::vec2 screenCoord) pickData.Entity = pickInfo.Entity; pickData.Camera = pickInfo.Camera; + pickData.World = pickInfo.World; return pickData; } From c99a8685bb12a17c1f08475fb48d5bfe988f1852 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 14 Jan 2016 15:40:13 +0100 Subject: [PATCH 14/14] Removed Debug scene --- src/Engine/Rendering/RenderSystem.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 82d9772b..d6cdb9b3 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -119,23 +119,11 @@ void RenderSystem::Update(World* world, double dt) //Only supports opaque geometry atm m_RenderFrame->Clear(); - - RenderScene rs; rs.Camera = m_Camera; rs.Viewport = Rectangle(1280, 720); fillModels(rs.ForwardJobs, world); m_RenderFrame->Add(rs); - - RenderScene rs2; - rs2.Camera = new Camera((float)m_Renderer->Resolution().Width / m_Renderer->Resolution().Height, glm::radians(45.f), 0.01f, 5000.f);; - rs2.Camera->SetProjectionMatrix(glm::mat4(1)); - rs2.Camera->SetViewMatrix(glm::mat4(1)); - - rs2.Viewport = Rectangle(1280, 720); - fillModels(rs2.ForwardJobs, world); - m_RenderFrame->Add(rs2); - }