From 05b78265befea045240e179c6dee501036adf22a Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 14 Dec 2015 19:10:00 +0100 Subject: [PATCH 01/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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 f0ad28bac4dbe03a4b13f42f549c77b0e20cc085 Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 6 Jan 2016 11:39:32 +0100 Subject: [PATCH 08/20] Removed some comments. Basically did nothing --- include/Engine/Network/Network.h | 1 + src/Engine/Input/InputProxy.cpp | 4 ++-- src/Engine/Network/Client.cpp | 14 +++++--------- src/Engine/Network/Server.cpp | 8 ++++++-- src/Game/Game.cpp | 7 +------ 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index 0f7baefe..c5107b2b 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -14,6 +14,7 @@ public: virtual ~Network() { }; virtual void Start(World* m_world, EventBroker *eventBroker) = 0; virtual void Update() = 0; + virtual void Close() = 0; }; #endif \ No newline at end of file diff --git a/src/Engine/Input/InputProxy.cpp b/src/Engine/Input/InputProxy.cpp index c3e4d669..ad589df3 100644 --- a/src/Engine/Input/InputProxy.cpp +++ b/src/Engine/Input/InputProxy.cpp @@ -62,7 +62,7 @@ void InputProxy::Process() e.Command = command; e.Value = currentValue; m_EventBroker->Publish(e); - LOG_DEBUG("Input: Published command %s=%f for player %i", e.Command.c_str(), e.Value, e.PlayerID); + //LOG_DEBUG("Input: Published command %s=%f for player %i", e.Command.c_str(), e.Value, e.PlayerID); m_LastCommandValues[command] = currentValue; } } @@ -78,7 +78,7 @@ void InputProxy::Process() } //e.Value = std::max(-1.f, std::min(e.Value, 1.f)); m_EventBroker->Publish(e); - LOG_DEBUG("Input: Published command %s=%f for player %i", e.Command.c_str(), e.Value, e.PlayerID); + //LOG_DEBUG("Input: Published command %s=%f for player %i", e.Command.c_str(), e.Value, e.PlayerID); } m_CommandQueue.clear(); } diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 5c7e9c8f..a417c4e5 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -17,7 +17,7 @@ Client::Client(ConfigFile* config) : m_Socket(m_IOService) Client::~Client() { - + m_EventBroker->Unsubscribe(m_EInputCommand); } void Client::Start(World* world, EventBroker* eventBroker) @@ -27,14 +27,10 @@ void Client::Start(World* world, EventBroker* eventBroker) m_World = world; // Subscribe to events - m_EInputCommand = decltype(m_EInputCommand)(std::bind(&Client::OnInputCommand, this, std::placeholders::_1)); - m_EventBroker->Subscribe(m_EInputCommand); + //m_EInputCommand = decltype(m_EInputCommand)(std::bind(&Client::OnInputCommand, this, std::placeholders::_1)); + //m_EventBroker->Subscribe(m_EInputCommand); + EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Client::OnInputCommand); - - //while (m_PlayerName.size() > 7) { - // LOG_INFO("Please enter your name (No longer than 7 characters):"); - // std::cin >> m_PlayerName; - //} m_Socket.connect(m_ReceiverEndpoint); LOG_INFO("I am client. BIP BOP"); } @@ -73,7 +69,7 @@ void Client::readFromServer() void Client::sendSnapshotToServer() { - // Reset previouse key state in snapshot. + // Reset previous key state in snapshot. m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 261583cc..c53dce8f 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -4,7 +4,9 @@ Server::Server() : m_Socket(m_IOService, boost::asio::ip::udp::endpoint(boost::a { } Server::~Server() -{ } +{ + +} void Server::Start(World* world, EventBroker* eventBroker) @@ -25,6 +27,8 @@ void Server::Update() void Server::Close() { m_ThreadIsRunning = false; + m_Socket.close(); + } void Server::readFromClients() @@ -271,7 +275,7 @@ void Server::parseConnect(Packet& packet) m_StopTimes[i] = std::clock(); - LOG_INFO("Player \"%s\" connected on IP: %s", m_PlayerDefinitions[i].Name, m_PlayerDefinitions[i].Endpoint.address().to_string()); + LOG_INFO("Player \"%s\" connected on IP: %s", m_PlayerDefinitions[i].Name.c_str(), m_PlayerDefinitions[i].Endpoint.address().to_string().c_str()); Packet packet(MessageType::Connect, m_SendPacketID); packet.WritePrimitive(i); // Player ID diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index c66d2641..bf08d340 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -144,10 +144,5 @@ void Game::networkFunction() m_ClientOrServer = new Server(); } m_ClientOrServer->Start(m_World, m_EventBroker); - // I don't think we are reaching this part of the code right now. - // ~Game() is not called if the game is exited by closing console windows - // When server or client is done set it to false. - //m_IsClientOrServer = false; - // Destroy it - //delete m_ClientOrServer; + } \ No newline at end of file From 6c13916eec56406e8267c832bac156022e4a677e Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 6 Jan 2016 13:49:54 +0100 Subject: [PATCH 09/20] Removed unnecessary code. --- src/Engine/Network/Client.cpp | 9 ++++----- src/Engine/Network/Server.cpp | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index a417c4e5..f01509b4 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -42,11 +42,10 @@ void Client::Update() void Client::Close() { - if (m_WasStarted) { - disconnect(); - m_ThreadIsRunning = false; - m_EventBroker->Unsubscribe(m_EInputCommand); - } + disconnect(); + m_ThreadIsRunning = false; + m_Socket.close(); + m_EventBroker->Unsubscribe(m_EInputCommand); } void Client::readFromServer() diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index c53dce8f..bedbf954 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -28,7 +28,6 @@ void Server::Close() { m_ThreadIsRunning = false; m_Socket.close(); - } void Server::readFromClients() From b37ffc74494125b907cd2705da2428c6840aa95c Mon Sep 17 00:00:00 2001 From: Jocke Date: Mon, 11 Jan 2016 14:34:04 +0100 Subject: [PATCH 10/20] WIP Model component not working. --- include/Engine/Core/World.h | 2 + include/Engine/Network/Packet.h | 6 +- include/Engine/Network/Server.h | 1 + src/Engine/Collision/Collision.cpp | 36 ++++---- src/Engine/Core/World.cpp | 8 +- src/Engine/Network/Client.cpp | 68 +++++++++------ src/Engine/Network/Packet.cpp | 23 ++++-- src/Engine/Network/Server.cpp | 127 +++++++++++++++++++++++++---- 8 files changed, 204 insertions(+), 67 deletions(-) diff --git a/include/Engine/Core/World.h b/include/Engine/Core/World.h index 0a121728..c066933a 100644 --- a/include/Engine/Core/World.h +++ b/include/Engine/Core/World.h @@ -22,6 +22,8 @@ public: void RegisterComponent(ComponentInfo& ci); // Attach a component to an entity and fill it with default values ComponentWrapper AttachComponent(EntityID entity, std::string componentType); + // Check if world has an entity + bool HasEntity(EntityID entity); // Check if an entity has a component bool HasComponent(EntityID entity, std::string componentType) const; // Get a component of an entity diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index daf39962..76cf2cba 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -14,8 +14,9 @@ public: Packet(MessageType type, unsigned int& packetID); // Used to create packet from already existing data buffer. Packet(char* data, const int sizeOfPacket); - ~Packet(); + void Init(MessageType type, unsigned int& packetID); + // Add primitive types like int, float, char... template void WritePrimitive(T val) @@ -23,6 +24,7 @@ public: // Check if we are trying to add more than the package can fit. if (m_MaxPacketSize < m_Offset + sizeof(T)) { LOG_WARNING("Packet AddPrimitive(): You are trying to add more than we have allocated for!"); + return; } memcpy(m_Data + m_Offset, &val, sizeof(T)); m_Offset += sizeof(T); @@ -50,6 +52,8 @@ public: int Size() { return m_Offset; }; char* Data() { return m_Data; }; + unsigned int DataReadSize() { return m_ReturnDataOffset; } + unsigned int MaxSize() { return m_MaxPacketSize; } private: char* m_Data; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 5c1ac1fb..af454bc1 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -67,6 +67,7 @@ private: void moveMessageHead(char*& data, size_t& length, size_t stepSize); void broadcast(std::string message); void broadcast(Packet& packet); + //void parseShitTest(Packet& packet); // Remove this when network is working void sendSnapshot(); void sendPing(); void checkForTimeOuts(); diff --git a/src/Engine/Collision/Collision.cpp b/src/Engine/Collision/Collision.cpp index c4af6258..a767ee95 100644 --- a/src/Engine/Collision/Collision.cpp +++ b/src/Engine/Collision/Collision.cpp @@ -245,23 +245,29 @@ bool attachAABBComponentFromModel(World* world, EntityID id) bool GetEntityBox(World* world, ComponentWrapper& AABBComponent, AABB& outBox) { - ComponentWrapper& cTrans = world->GetComponent(AABBComponent.EntityID, "Transform"); - ComponentWrapper model = world->GetComponent(AABBComponent.EntityID, "Model"); - Model* modelRes = ResourceManager::Load(model["Resource"]); - outBox.CreateFromCenter(AABBComponent["BoxCenter"], AABBComponent["BoxSize"]); - glm::vec3 mini = outBox.MinCorner(); - glm::vec3 maxi = outBox.MaxCorner(); + if (world->HasComponent(AABBComponent.EntityID, "Transform") && world->HasComponent(AABBComponent.EntityID, "Model")) + { + ComponentWrapper& cTrans = world->GetComponent(AABBComponent.EntityID, "Transform"); + ComponentWrapper model = world->GetComponent(AABBComponent.EntityID, "Model"); + if(AABBComponent.EntityID == 3); + std::string checkPath = model["Resource"]; + Model* modelRes = ResourceManager::Load(model["Resource"]); + outBox.CreateFromCenter(AABBComponent["BoxCenter"], AABBComponent["BoxSize"]); + glm::vec3 mini = outBox.MinCorner(); + glm::vec3 maxi = outBox.MaxCorner(); - if (modelRes == nullptr) { - return false; + if (modelRes == nullptr) { + return false; + } + glm::mat4 modelMatrix = modelRes->m_Matrix * + glm::translate(glm::mat4(), (glm::vec3)cTrans["Position"]) * + glm::scale((glm::vec3)cTrans["Scale"]); + + outBox = AABB(modelMatrix * glm::vec4(mini.x, mini.y, mini.z, 1), + modelMatrix * glm::vec4(maxi.x, maxi.y, maxi.z, 1)); + return true; } - glm::mat4 modelMatrix = modelRes->m_Matrix * - glm::translate(glm::mat4(), (glm::vec3)cTrans["Position"]) * - glm::scale((glm::vec3)cTrans["Scale"]); - - outBox = AABB(modelMatrix * glm::vec4(mini.x, mini.y, mini.z, 1), - modelMatrix * glm::vec4(maxi.x, maxi.y, maxi.z, 1)); - return true; + return false; } bool GetEntityBox(World* world, EntityID entity, AABB& outBox, bool forceBoxFromModel) diff --git a/src/Engine/Core/World.cpp b/src/Engine/Core/World.cpp index c94cb8b3..faddeb83 100644 --- a/src/Engine/Core/World.cpp +++ b/src/Engine/Core/World.cpp @@ -80,7 +80,13 @@ ComponentWrapper World::AttachComponent(EntityID entity, std::string componentTy return c; } -bool World::HasComponent(EntityID entity, std::string componentType) const +bool World::HasEntity(EntityID entity) +{ + return m_EntityParents.find(entity) != m_EntityParents.end(); +} + + +bool World::HasComponent(EntityID entity, std::string componentType) { ComponentPool* pool = m_ComponentPools.at(componentType); return pool->KnowsEntity(entity); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index f01509b4..08f68f98 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -50,7 +50,7 @@ void Client::Close() void Client::readFromServer() { - if (m_Socket.available()) { + while (m_Socket.available()) { bytesRead = receive(readBuf, INPUTSIZE); if (bytesRead > 0) { Packet packet(readBuf, bytesRead); @@ -60,7 +60,7 @@ void Client::readFromServer() std::clock_t currentTime = std::clock(); if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { if (isConnected()) { - sendSnapshotToServer(); + //sendSnapshotToServer(); } previousSnapshotMessage = currentTime; } @@ -120,6 +120,8 @@ void Client::parseMessageType(Packet& packet) // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id m_PacketID = packet.ReadPrimitive(); //Read new packet id + if (m_PacketID <= m_PreviousPacketID) + return; //IdentifyPacketLoss(); switch (static_cast(messageType)) { @@ -181,33 +183,45 @@ void Client::parseEventMessage(Packet& packet) void Client::parseSnapshot(Packet& packet) { - std::string tempName; - for (size_t i = 0; i < MAXCONNECTIONS; i++) { - // We're checking for empty name for now. This might not be the best way, - // but it is to avoid sending redundant data. - tempName = packet.ReadString(); - - - // Apply the position data read to the player entity - // New player connected on the server side - if (m_PlayerDefinitions[i].Name == "" && tempName != "") { - m_PlayerDefinitions[i].Name = tempName; - m_PlayerDefinitions[i].EntityID = createPlayer(); - } else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { - // Someone disconnected - // TODO: Insert code here - break; - } else if (m_PlayerDefinitions[i].Name == "" && tempName == "") { - // Not a connected player - break; - } - if (m_PlayerDefinitions[i].EntityID != -1) { - - // Move player to server position - int dataSize = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Info.Meta.Stride; - memcpy(m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Data, packet.ReadData(dataSize), dataSize); + std::string componentType = packet.ReadString(); + //LOG_INFO("A snapshot was parsed. first component type is: %s", componentType.c_str()); + int stride = packet.ReadPrimitive(); + int nrOfComponents = (packet.Size() - packet.DataReadSize()) / (stride + sizeof(EntityID)); + if (componentType == "Model") + return; + for (size_t i = 0; i < nrOfComponents; i++) { + EntityID entityID = packet.ReadPrimitive(); + //ComponentWrapper model = m_World->GetComponent(entityID, "Model"); + //std::string checkPath = model["Resource"]; + // Check if entity exists + if (m_World->HasEntity(entityID)) { + // check if component exists + if (m_World->HasComponent(entityID, componentType)) { + //Copy data to component + memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); + } else { + // If component doesen't exist + // Create component + m_World->AttachComponent(entityID, componentType); + // Copy data to newly created component + memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); + } + } else { + // If entity dosen't exist + EntityID newEntityID = m_World->CreateEntity(); + // Check if EntityIDs are out of sync + if (newEntityID != entityID) { + LOG_INFO("Client::parseSnapshot(Packet& packet): Newly created EntityID is not the same as the one sent by server \ + EntityIDs are out of sync"); + } + m_World->AttachComponent(newEntityID, componentType); + // Copy data to newly created component + memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); } + //ComponentWrapper model2 = m_World->GetComponent(entityID, "Model"); + //std::string checkPath2 = model2["Resource"]; } + } int Client::receive(char* data, size_t length) diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 52b15065..86a91f5d 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -3,13 +3,7 @@ Packet::Packet(MessageType type, unsigned int& packetID) { m_Data = new char[m_MaxPacketSize]; - // Create message header - // Add message type - int messageType = static_cast(type); - Packet::WritePrimitive(messageType); - packetID = packetID % 1000; // Packet id modulos - Packet::WritePrimitive(packetID); - packetID++; + Init(type, packetID); } // Create message @@ -28,12 +22,26 @@ Packet::~Packet() delete[] m_Data; } +void Packet::Init(MessageType type, unsigned int & packetID) +{ + m_ReturnDataOffset = 0; + m_Offset = 0; + // Create message header + // Add message type + int messageType = static_cast(type); + Packet::WritePrimitive(messageType); + packetID = packetID % 1000; // Packet id modulos + Packet::WritePrimitive(packetID); + packetID++; +} + void Packet::WriteString(std::string str) { // Message, add one extra byte for null terminator int sizeOfString = str.size() + 1; if (m_Offset + sizeOfString > m_MaxPacketSize) { LOG_WARNING("Package::WriteString(): Data size in packet exceeded maximum package size.\n"); + return; } memcpy(m_Data + m_Offset, str.data(), sizeOfString * sizeof(char)); m_Offset += sizeOfString * sizeof(char); @@ -43,6 +51,7 @@ void Packet::WriteData(char * data, int sizeOfData) { if (m_Offset + sizeOfData > m_MaxPacketSize) { LOG_WARNING("Packet::WriteData(): Data size in packet exceeded maximum packet size.\n"); + return; } memcpy(m_Data + m_Offset, data, sizeOfData); m_Offset += sizeOfData; diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index bedbf954..791f5a42 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -4,7 +4,7 @@ Server::Server() : m_Socket(m_IOService, boost::asio::ip::udp::endpoint(boost::a { } Server::~Server() -{ +{ } @@ -36,7 +36,7 @@ void Server::readFromClients() // program crashed if it executed m_Socket.available() // when closing the program. - if (m_Socket.available()) { + while (m_Socket.available()) { try { bytesRead = receive(readBuffer, INPUTSIZE); Packet packet(readBuffer, bytesRead); @@ -61,7 +61,7 @@ void Server::readFromClients() // Time out logic if (checkTimeOutInterval < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { - checkForTimeOuts(); + //checkForTimeOuts(); timOutTimer = currentTime; } } @@ -152,32 +152,127 @@ void Server::broadcast(Packet& packet) } } } +// +//void Server::parseShitTest(Packet& packet) +//{ +// packet.ReadPrimitive(); // MessageType +// packet.ReadPrimitive(); // Packet ID +// +// std::string componentType = packet.ReadString(); +// //LOG_INFO("A snapshot was parsed. first component type is: %s", componentType.c_str()); +// int stride = packet.ReadPrimitive(); +// int nrOfComponents = (packet.Size() - packet.DataReadSize()) / (stride + sizeof(EntityID)); +// //if (componentType == "Model") +// // return; +// for (size_t i = 0; i < nrOfComponents; i++) { +// EntityID entityID = packet.ReadPrimitive(); +// ComponentWrapper model = m_World->GetComponent(entityID, "Model"); +// std::string checkPath = model["Resource"]; +// // Check if entity exists +// if (m_World->HasEntity(entityID)) { +// // check if component exists +// if (m_World->HasComponent(entityID, componentType)) { +// //Copy data to component +// memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); +// } else { +// // If component doesen't exist +// // Create component +// m_World->AttachComponent(entityID, componentType); +// // Copy data to newly created component +// memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); +// } +// } else { +// // If entity dosen't exist +// EntityID newEntityID = m_World->CreateEntity(); +// // Check if EntityIDs are out of sync +// if (newEntityID != entityID) { +// LOG_INFO("Client::parseSnapshot(Packet& packet): Newly created EntityID is not the same as the one sent by server \ +// EntityIDs are out of sync"); +// } +// m_World->AttachComponent(newEntityID, componentType); +// // Copy data to newly created component +// memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); +// } +// ComponentWrapper model2 = m_World->GetComponent(entityID, "Model"); +// std::string checkPath2 = model2["Resource"]; +// } +//} void Server::sendSnapshot() { - Packet packet(MessageType::Snapshot, m_SendPacketID); - for (size_t i = 0; i < MAXCONNECTIONS; i++) { - - // Send an empty name if there is no player connected on this position. - packet.WriteString(m_PlayerDefinitions[i].Name); - - if (m_PlayerDefinitions[i].EntityID == -1) { - continue; + // Should time this + std::unordered_map worldComponentPools = m_World->GetComponentPools(); + for (auto it : worldComponentPools) { + Packet packet(MessageType::Snapshot, m_SendPacketID); + std::string componentType = it.first; + //if (componentType != "Model") + // continue; + ComponentPool* componentPool = it.second; + ComponentInfo componentInfo = componentPool->ComponentInfo(); + packet.WriteString(componentInfo.Name); + packet.WritePrimitive(componentInfo.Meta.Stride); + for (auto componentWrapper : *componentPool) { + if (packet.Size() + componentInfo.Meta.Stride >= packet.MaxSize()) { + broadcast(packet); + //parseShitTest(packet); + // Packet destructor is called (which is what we want). + packet.Init(MessageType::Snapshot, m_SendPacketID); + // Add Component header + packet.WriteString(componentInfo.Name); + packet.WritePrimitive(componentInfo.Meta.Stride); + } + // Component data + packet.WritePrimitive(componentWrapper.EntityID); + packet.WriteData(componentWrapper.Data, componentWrapper.Info.Meta.Stride); } - // Pack transfrom component into data packet - auto transform = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform"); - packet.WriteData(transform.Data, transform.Info.Meta.Stride); + broadcast(packet); } - broadcast(packet); } +//void Server::sendSnapshot() +//{ +// // Should time this +// std::unordered_map worldComponentPools = m_World->GetComponentPools(); +// for (auto it : worldComponentPools) { +// Packet packet(MessageType::Snapshot, m_SendPacketID); +// std::string componentType = it.first; +// ComponentPool* componentPool = it.second; +// ComponentInfo componentInfo = componentPool->ComponentInfo(); +// if (componentInfo.Name != "Transform") +// continue; +// packet.WriteString(componentInfo.Name); +// packet.WritePrimitive(componentInfo.Meta.Stride); +// auto componentWrapper = *componentPool->begin(); +// packet.WritePrimitive(componentWrapper.EntityID); +// packet.WriteData(componentWrapper.Data, componentWrapper.Info.Meta.Stride); +// +// for (auto componentWrapper : *componentPool) { +// //// When packet is full send it +// //if (packet.Size() + componentInfo.Meta.Stride >= packet.MaxSize()) { +// // broadcast(packet); +// // // Packet destructor is called (which is what we want). +// // packet.Init(MessageType::Snapshot, m_SendPacketID); +// // // Add Component header +// // packet.WriteString(componentInfo.Name); +// // packet.WritePrimitive(componentInfo.Meta.Stride); +// +// //} +// //// Component data +// //packet.WritePrimitive(componentWrapper.EntityID); +// //packet.WriteData(componentWrapper.Data, componentWrapper.Info.Meta.Stride); +// broadcast(packet); +// } +// broadcast(packet); +// } +//} + void Server::sendPing() { // Prints connected players ping for (size_t i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { int ping = 1000 * (m_StopTimes[i] - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); - LOG_INFO("%i: Player %i's ping: %i", m_PacketID, i, ping); + LOG_INFO("Last packetID received %i: Player %i's ping: %i", m_PacketID, i, ping); } } From 3feee7fd35ce5363595cbd6f713d39b0739fafad Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 11 Jan 2016 17:01:17 +0100 Subject: [PATCH 11/20] 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 12/20] 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 13/20] 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 236230d12c77473c22aeef9df7fdc8fc750a33b6 Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 12 Jan 2016 12:00:19 +0100 Subject: [PATCH 14/20] Packets now dynamically allocates more memory when they need it. Increased local receive buffer for Client and Server() and removed the magic number that was used In Server.h and Client.h (char readBuffer[INPUTSIZE] = { 0 }). Packets start size has now been increased to 512 bytes. Changed ComponentInfo::FieldsInOrder to store strings instead of pointers. Removed HasEntity() and are now using ValidEntity() instead. --- include/Engine/Core/ComponentInfo.h | 3 +- include/Engine/Core/World.h | 2 - include/Engine/Network/Client.h | 5 +- include/Engine/Network/Network.h | 2 +- include/Engine/Network/Packet.h | 9 +- include/Engine/Network/Server.h | 3 +- src/Engine/Collision/Collision.cpp | 392 ++++++++++----------- src/Engine/Core/EntityFilePreprocessor.cpp | 3 +- src/Engine/Core/World.cpp | 8 +- src/Engine/Network/Client.cpp | 53 +-- src/Engine/Network/Packet.cpp | 32 +- src/Engine/Network/Server.cpp | 119 +------ src/Game/Game.cpp | 32 +- 13 files changed, 307 insertions(+), 356 deletions(-) diff --git a/include/Engine/Core/ComponentInfo.h b/include/Engine/Core/ComponentInfo.h index abf4ff15..985a057e 100644 --- a/include/Engine/Core/ComponentInfo.h +++ b/include/Engine/Core/ComponentInfo.h @@ -14,6 +14,7 @@ struct ComponentInfo struct Field_t { + std::string Name; std::string Type; unsigned int Offset; unsigned int Stride; @@ -21,7 +22,7 @@ struct ComponentInfo std::string Name; std::unordered_map Fields; - std::vector FieldsInOrder; + std::vector FieldsInOrder; Meta_t Meta; std::shared_ptr Defaults = nullptr; }; diff --git a/include/Engine/Core/World.h b/include/Engine/Core/World.h index c066933a..0a121728 100644 --- a/include/Engine/Core/World.h +++ b/include/Engine/Core/World.h @@ -22,8 +22,6 @@ public: void RegisterComponent(ComponentInfo& ci); // Attach a component to an entity and fill it with default values ComponentWrapper AttachComponent(EntityID entity, std::string componentType); - // Check if world has an entity - bool HasEntity(EntityID entity); // Check if an entity has a component bool HasComponent(EntityID entity, std::string componentType) const; // Get a component of an entity diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 95888b1f..b7bd9b38 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -32,7 +32,7 @@ private: // Sending message to server logic int bytesRead = -1; - char readBuf[1024] = { 0 }; + char readBuf[INPUTSIZE] = { 0 }; int snapshotInterval = 33; std::clock_t previousSnapshotMessage = std::clock(); @@ -59,7 +59,7 @@ private: // Private member functions void readFromServer(); void sendSnapshotToServer(); - int receive(char* data, size_t length); + int receive(char* data, size_t length); void send(Packet& packet); void connect(); void disconnect(); @@ -67,6 +67,7 @@ private: void moveMessageHead(char*& data, size_t& length, size_t stepSize); void parseMessageType(Packet& packet); void parseEventMessage(Packet& packet); + void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType); void parseConnect(Packet& packet); void parsePing(); void parseServerPing(); diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index c5107b2b..8a50f061 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -6,7 +6,7 @@ #include "Network/Packet.h" #define MAXCONNECTIONS 8 -#define INPUTSIZE 128 +#define INPUTSIZE 4097 class Network { diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index 76cf2cba..112ebe34 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -23,8 +23,8 @@ public: { // Check if we are trying to add more than the package can fit. if (m_MaxPacketSize < m_Offset + sizeof(T)) { - LOG_WARNING("Packet AddPrimitive(): You are trying to add more than we have allocated for!"); - return; + LOG_WARNING("Packet AddPrimitive(): You are trying to add more than we have allocated for! New size is %i bytes\n", m_MaxPacketSize*2); + resizeData(); } memcpy(m_Data + m_Offset, &val, sizeof(T)); m_Offset += sizeof(T); @@ -43,7 +43,7 @@ public: return returnValue; } // Add a string to the message - void WriteString(std::string str); + void WriteString(const std::string& str); // Add data to the message void WriteData(char* data, int sizeOfData); // Pops the first element as if it was a string. @@ -59,7 +59,8 @@ private: char* m_Data; unsigned int m_ReturnDataOffset = 0; int m_Offset = 0; - unsigned int m_MaxPacketSize = 128; + unsigned int m_MaxPacketSize = 512; + void resizeData(); }; #endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index af454bc1..58ee2631 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -30,7 +30,7 @@ private: PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; // Sending messages to client logic - char readBuffer[1024] = { 0 }; + char readBuffer[INPUTSIZE] = { 0 }; int bytesRead = 0; // time for previouse message std::clock_t previousePingMessage = std::clock(); @@ -67,7 +67,6 @@ private: void moveMessageHead(char*& data, size_t& length, size_t stepSize); void broadcast(std::string message); void broadcast(Packet& packet); - //void parseShitTest(Packet& packet); // Remove this when network is working void sendSnapshot(); void sendPing(); void checkForTimeOuts(); diff --git a/src/Engine/Collision/Collision.cpp b/src/Engine/Collision/Collision.cpp index a767ee95..620e9639 100644 --- a/src/Engine/Collision/Collision.cpp +++ b/src/Engine/Collision/Collision.cpp @@ -8,196 +8,196 @@ namespace Collision { - //note: this one hasnt been delta adjusted like RayVsAABB has - bool RayAABBIntr(const Ray& ray, const AABB& box) - { - glm::vec3 w = 75.0f * ray.Direction(); - glm::vec3 v = glm::abs(w); - glm::vec3 c = ray.Origin() - box.Center() + w; - glm::vec3 half = box.HalfSize(); +//note: this one hasnt been delta adjusted like RayVsAABB has +bool RayAABBIntr(const Ray& ray, const AABB& box) +{ + glm::vec3 w = 75.0f * ray.Direction(); + glm::vec3 v = glm::abs(w); + glm::vec3 c = ray.Origin() - box.Center() + w; + glm::vec3 half = box.HalfSize(); - if (abs(c.x) > v.x + half.x) { - return false; - } - if (abs(c.y) > v.y + half.y) { - return false; - } - if (abs(c.z) > v.z + half.z) { - return false; - } - - if (abs(c.y*w.z - c.z*w.y) > half.y*v.z + half.z*v.y) { - return false; - } - if (abs(c.x*w.z - c.z*w.x) > half.x*v.z + half.z*v.x) { - return false; - } - return !(abs(c.x*w.y - c.y*w.x) > half.x*v.y + half.y*v.x); + if (abs(c.x) > v.x + half.x) { + return false; } - - bool RayVsAABB(const Ray& ray, const AABB& box) - { - float dummy; - return RayVsAABB(ray, box, dummy); + if (abs(c.y) > v.y + half.y) { + return false; } - - bool RayVsAABB(const Ray& ray, const AABB& box, float& outDistance) - { - glm::vec3 invdir = 1.0f / ray.Direction(); - glm::vec3 origin = ray.Origin(); - - float t1 = (box.MinCorner().x - origin.x)*invdir.x; - float t2 = (box.MaxCorner().x - origin.x)*invdir.x; - float t3 = (box.MinCorner().y - origin.y)*invdir.y; - float t4 = (box.MaxCorner().y - origin.y)*invdir.y; - float t5 = (box.MinCorner().z - origin.z)*invdir.z; - float t6 = (box.MaxCorner().z - origin.z)*invdir.z; - - float tmin = std::max(std::max(std::min(t1, t2), std::min(t3, t4)), std::min(t5, t6)); - float tmax = std::min(std::min(std::max(t1, t2), std::max(t3, t4)), std::max(t5, t6)); - - //if (tmax < 0 || tmin > tmax) - //if tmin,tmax are almost the same (i.e. hitting exactly in the corner) then tmin might be slightly - //greater than tmax becuase of floating-precision problems. fixed by adding a small delta to tmax - if (tmax < 0 || tmin>(tmax + 0.0001f)) - return false; - - outDistance = (tmin > 0) ? tmin : tmax; - return true; - } - - bool AABBVsAABB(const AABB& a, const AABB& b) - { - const glm::vec3& aCenter = a.Center(); - const glm::vec3& bCenter = b.Center(); - const glm::vec3& aHSize = a.HalfSize(); - const glm::vec3& bHSize = b.HalfSize(); - //Test will probably exit because of the X and Z axes more often, so test them first. - if (abs(aCenter[0] - bCenter[0]) > (aHSize[0] + bHSize[0])) { - return false; - } - if (abs(aCenter[2] - bCenter[2]) > (aHSize[2] + bHSize[2])) { - return false; - } - return (abs(aCenter[1] - bCenter[1]) <= (aHSize[1] + bHSize[1])); - } - - bool AABBVsAABB(const AABB& a, const AABB& b, glm::vec3& minimumTranslation) - { - minimumTranslation = glm::vec3(0, 0, 0); - const glm::vec3& aMax = a.MaxCorner(); - const glm::vec3& bMax = b.MaxCorner(); - const glm::vec3& aMin = a.MinCorner(); - const glm::vec3& bMin = b.MinCorner(); - const glm::vec3& bSize = b.Size(); - const glm::vec3& aSize = a.Size(); - float minOffset = INFINITY; - float off; - auto axisesIntersecting = glm::tvec3(false, false, false); - for (int i = 0; i < 3; ++i) { - off = bMax[i] - aMin[i]; - if (off > 0 && off < bSize[i] + aSize[i]) { - if (off < minOffset) { - minimumTranslation = glm::vec3(); - minimumTranslation[i] = minOffset = off; - } - axisesIntersecting[i] = true; - } - off = aMax[i] - bMin[i]; - if (off > 0 && off < bSize[i] + aSize[i]) { - if (off < minOffset) { - minOffset = off; - minimumTranslation = glm::vec3(); - minimumTranslation[i] = -off; - } - axisesIntersecting[i] = true; - } - } - return glm::all(axisesIntersecting); - } - - bool RayVsModel(const Ray& ray, - const std::vector& modelVertices, - const std::vector& modelIndices) - { - for (int i = 0; i < modelIndices.size(); ++i) { - glm::vec3 v0 = modelVertices[modelIndices[i]].Position; - glm::vec3 e1 = modelVertices[modelIndices[++i]].Position - v0; //v1 - v0 - glm::vec3 e2 = modelVertices[modelIndices[++i]].Position - v0; //v2 - v0 - glm::vec3 m = ray.Origin() - v0; - glm::vec3 MxE1 = glm::cross(m, e1); - glm::vec3 DxE2 = glm::cross(ray.Direction(), e2); - float DetInv = glm::dot(e1, DxE2); - if (std::abs(DetInv) < FLT_EPSILON) { - continue; - } - DetInv = 1.0f / DetInv; - float u = glm::dot(m, DxE2) * DetInv; - float v = glm::dot(ray.Direction(), MxE1) * DetInv; - //u,v can be very close to 0 but still negative sometimes. added a deltafactor to compensate for that problem - if ((u + 0.001f) < 0 || (v + 0.001f) < 0 || 1 < u + v) { - continue; - } - //Here, u and v are positive, u+v <= 1, and if distance is positive - triangle is hit. - if (0 <= glm::dot(e2, MxE1) * DetInv) { - return true; - } - } + if (abs(c.z) > v.z + half.z) { return false; } - bool RayVsModel(const Ray& ray, - const std::vector& modelVertices, - const std::vector& modelIndices, - float& outDistance, - float& outUCoord, - float& outVCoord) - { - outDistance = INFINITY; - bool hit = false; - for (int i = 0; i < modelIndices.size(); ++i) { - glm::vec3 v0 = modelVertices[modelIndices[i]].Position; - glm::vec3 e1 = modelVertices[modelIndices[++i]].Position - v0; //v1 - v0 - glm::vec3 e2 = modelVertices[modelIndices[++i]].Position - v0; //v2 - v0 - glm::vec3 m = ray.Origin() - v0; - glm::vec3 MxE1 = glm::cross(m, e1); - glm::vec3 DxE2 = glm::cross(ray.Direction(), e2);//pVec - float DetInv = glm::dot(e1, DxE2); - if (std::abs(DetInv) < FLT_EPSILON) { - continue; - } - DetInv = 1.0f / DetInv; - float dist = glm::dot(e2, MxE1) * DetInv; - if (dist >= outDistance) { - continue; - } - float u = glm::dot(m, DxE2) * DetInv; - float v = glm::dot(ray.Direction(), MxE1) * DetInv; + if (abs(c.y*w.z - c.z*w.y) > half.y*v.z + half.z*v.y) { + return false; + } + if (abs(c.x*w.z - c.z*w.x) > half.x*v.z + half.z*v.x) { + return false; + } + return !(abs(c.x*w.y - c.y*w.x) > half.x*v.y + half.y*v.x); +} - //u,v can be very close to 0 but still negative sometimes. added a deltafactor to compensate for that problem - //If u and v are positive, u+v <= 1, dist is positive, and less than closest. - if (0 <= (u + 0.001f) && 0 <= (v + 0.001f) && u + v <= 1 && 0 <= dist) { - outDistance = dist; - outUCoord = u; - outVCoord = v; - hit = true; +bool RayVsAABB(const Ray& ray, const AABB& box) +{ + float dummy; + return RayVsAABB(ray, box, dummy); +} + +bool RayVsAABB(const Ray& ray, const AABB& box, float& outDistance) +{ + glm::vec3 invdir = 1.0f / ray.Direction(); + glm::vec3 origin = ray.Origin(); + + float t1 = (box.MinCorner().x - origin.x)*invdir.x; + float t2 = (box.MaxCorner().x - origin.x)*invdir.x; + float t3 = (box.MinCorner().y - origin.y)*invdir.y; + float t4 = (box.MaxCorner().y - origin.y)*invdir.y; + float t5 = (box.MinCorner().z - origin.z)*invdir.z; + float t6 = (box.MaxCorner().z - origin.z)*invdir.z; + + float tmin = std::max(std::max(std::min(t1, t2), std::min(t3, t4)), std::min(t5, t6)); + float tmax = std::min(std::min(std::max(t1, t2), std::max(t3, t4)), std::max(t5, t6)); + + //if (tmax < 0 || tmin > tmax) + //if tmin,tmax are almost the same (i.e. hitting exactly in the corner) then tmin might be slightly + //greater than tmax becuase of floating-precision problems. fixed by adding a small delta to tmax + if (tmax < 0 || tmin>(tmax + 0.0001f)) + return false; + + outDistance = (tmin > 0) ? tmin : tmax; + return true; +} + +bool AABBVsAABB(const AABB& a, const AABB& b) +{ + const glm::vec3& aCenter = a.Center(); + const glm::vec3& bCenter = b.Center(); + const glm::vec3& aHSize = a.HalfSize(); + const glm::vec3& bHSize = b.HalfSize(); + //Test will probably exit because of the X and Z axes more often, so test them first. + if (abs(aCenter[0] - bCenter[0]) > (aHSize[0] + bHSize[0])) { + return false; + } + if (abs(aCenter[2] - bCenter[2]) > (aHSize[2] + bHSize[2])) { + return false; + } + return (abs(aCenter[1] - bCenter[1]) <= (aHSize[1] + bHSize[1])); +} + +bool AABBVsAABB(const AABB& a, const AABB& b, glm::vec3& minimumTranslation) +{ + minimumTranslation = glm::vec3(0, 0, 0); + const glm::vec3& aMax = a.MaxCorner(); + const glm::vec3& bMax = b.MaxCorner(); + const glm::vec3& aMin = a.MinCorner(); + const glm::vec3& bMin = b.MinCorner(); + const glm::vec3& bSize = b.Size(); + const glm::vec3& aSize = a.Size(); + float minOffset = INFINITY; + float off; + auto axisesIntersecting = glm::tvec3(false, false, false); + for (int i = 0; i < 3; ++i) { + off = bMax[i] - aMin[i]; + if (off > 0 && off < bSize[i] + aSize[i]) { + if (off < minOffset) { + minimumTranslation = glm::vec3(); + minimumTranslation[i] = minOffset = off; } + axisesIntersecting[i] = true; + } + off = aMax[i] - bMin[i]; + if (off > 0 && off < bSize[i] + aSize[i]) { + if (off < minOffset) { + minOffset = off; + minimumTranslation = glm::vec3(); + minimumTranslation[i] = -off; + } + axisesIntersecting[i] = true; } - return hit; } + return glm::all(axisesIntersecting); +} - bool RayVsModel(const Ray& ray, - const std::vector& modelVertices, - const std::vector& modelIndices, - glm::vec3& outHitPosition) - { - float u; - float v; - float dist; - bool hit = RayVsModel(ray, modelVertices, modelIndices, dist, u, v); - outHitPosition = ray.Origin() + dist * ray.Direction(); - return hit; +bool RayVsModel(const Ray& ray, + const std::vector& modelVertices, + const std::vector& modelIndices) +{ + for (int i = 0; i < modelIndices.size(); ++i) { + glm::vec3 v0 = modelVertices[modelIndices[i]].Position; + glm::vec3 e1 = modelVertices[modelIndices[++i]].Position - v0; //v1 - v0 + glm::vec3 e2 = modelVertices[modelIndices[++i]].Position - v0; //v2 - v0 + glm::vec3 m = ray.Origin() - v0; + glm::vec3 MxE1 = glm::cross(m, e1); + glm::vec3 DxE2 = glm::cross(ray.Direction(), e2); + float DetInv = glm::dot(e1, DxE2); + if (std::abs(DetInv) < FLT_EPSILON) { + continue; + } + DetInv = 1.0f / DetInv; + float u = glm::dot(m, DxE2) * DetInv; + float v = glm::dot(ray.Direction(), MxE1) * DetInv; + //u,v can be very close to 0 but still negative sometimes. added a deltafactor to compensate for that problem + if ((u + 0.001f) < 0 || (v + 0.001f) < 0 || 1 < u + v) { + continue; + } + //Here, u and v are positive, u+v <= 1, and if distance is positive - triangle is hit. + if (0 <= glm::dot(e2, MxE1) * DetInv) { + return true; + } } + return false; +} + +bool RayVsModel(const Ray& ray, + const std::vector& modelVertices, + const std::vector& modelIndices, + float& outDistance, + float& outUCoord, + float& outVCoord) +{ + outDistance = INFINITY; + bool hit = false; + for (int i = 0; i < modelIndices.size(); ++i) { + glm::vec3 v0 = modelVertices[modelIndices[i]].Position; + glm::vec3 e1 = modelVertices[modelIndices[++i]].Position - v0; //v1 - v0 + glm::vec3 e2 = modelVertices[modelIndices[++i]].Position - v0; //v2 - v0 + glm::vec3 m = ray.Origin() - v0; + glm::vec3 MxE1 = glm::cross(m, e1); + glm::vec3 DxE2 = glm::cross(ray.Direction(), e2);//pVec + float DetInv = glm::dot(e1, DxE2); + if (std::abs(DetInv) < FLT_EPSILON) { + continue; + } + DetInv = 1.0f / DetInv; + float dist = glm::dot(e2, MxE1) * DetInv; + if (dist >= outDistance) { + continue; + } + float u = glm::dot(m, DxE2) * DetInv; + float v = glm::dot(ray.Direction(), MxE1) * DetInv; + + //u,v can be very close to 0 but still negative sometimes. added a deltafactor to compensate for that problem + //If u and v are positive, u+v <= 1, dist is positive, and less than closest. + if (0 <= (u + 0.001f) && 0 <= (v + 0.001f) && u + v <= 1 && 0 <= dist) { + outDistance = dist; + outUCoord = u; + outVCoord = v; + hit = true; + } + } + return hit; +} + +bool RayVsModel(const Ray& ray, + const std::vector& modelVertices, + const std::vector& modelIndices, + glm::vec3& outHitPosition) +{ + float u; + float v; + float dist; + bool hit = RayVsModel(ray, modelVertices, modelIndices, dist, u, v); + outHitPosition = ray.Origin() + dist * ray.Direction(); + return hit; +} bool IsSameBoxProbably(const AABB& first, const AABB& second, const float epsilon) { @@ -245,29 +245,23 @@ bool attachAABBComponentFromModel(World* world, EntityID id) bool GetEntityBox(World* world, ComponentWrapper& AABBComponent, AABB& outBox) { - if (world->HasComponent(AABBComponent.EntityID, "Transform") && world->HasComponent(AABBComponent.EntityID, "Model")) - { - ComponentWrapper& cTrans = world->GetComponent(AABBComponent.EntityID, "Transform"); - ComponentWrapper model = world->GetComponent(AABBComponent.EntityID, "Model"); - if(AABBComponent.EntityID == 3); - std::string checkPath = model["Resource"]; - Model* modelRes = ResourceManager::Load(model["Resource"]); - outBox.CreateFromCenter(AABBComponent["BoxCenter"], AABBComponent["BoxSize"]); - glm::vec3 mini = outBox.MinCorner(); - glm::vec3 maxi = outBox.MaxCorner(); + ComponentWrapper& cTrans = world->GetComponent(AABBComponent.EntityID, "Transform"); + ComponentWrapper model = world->GetComponent(AABBComponent.EntityID, "Model"); + Model* modelRes = ResourceManager::Load(model["Resource"]); + outBox.CreateFromCenter(AABBComponent["BoxCenter"], AABBComponent["BoxSize"]); + glm::vec3 mini = outBox.MinCorner(); + glm::vec3 maxi = outBox.MaxCorner(); - if (modelRes == nullptr) { - return false; - } - glm::mat4 modelMatrix = modelRes->m_Matrix * - glm::translate(glm::mat4(), (glm::vec3)cTrans["Position"]) * - glm::scale((glm::vec3)cTrans["Scale"]); - - outBox = AABB(modelMatrix * glm::vec4(mini.x, mini.y, mini.z, 1), - modelMatrix * glm::vec4(maxi.x, maxi.y, maxi.z, 1)); - return true; + if (modelRes == nullptr) { + return false; } - return false; + glm::mat4 modelMatrix = modelRes->m_Matrix * + glm::translate(glm::mat4(), (glm::vec3)cTrans["Position"]) * + glm::scale((glm::vec3)cTrans["Scale"]); + + outBox = AABB(modelMatrix * glm::vec4(mini.x, mini.y, mini.z, 1), + modelMatrix * glm::vec4(maxi.x, maxi.y, maxi.z, 1)); + return true; } bool GetEntityBox(World* world, EntityID entity, AABB& outBox, bool forceBoxFromModel) diff --git a/src/Engine/Core/EntityFilePreprocessor.cpp b/src/Engine/Core/EntityFilePreprocessor.cpp index 83e2fe28..ca445042 100644 --- a/src/Engine/Core/EntityFilePreprocessor.cpp +++ b/src/Engine/Core/EntityFilePreprocessor.cpp @@ -144,10 +144,11 @@ void EntityFilePreprocessor::parseComponentInfo() } auto& field = compInfo.Fields[name]; + field.Name = name; field.Type = type; field.Offset = fieldOffset; field.Stride = stride; - compInfo.FieldsInOrder.push_back(&field); + compInfo.FieldsInOrder.push_back(name); fieldOffset += stride; } diff --git a/src/Engine/Core/World.cpp b/src/Engine/Core/World.cpp index faddeb83..c94cb8b3 100644 --- a/src/Engine/Core/World.cpp +++ b/src/Engine/Core/World.cpp @@ -80,13 +80,7 @@ ComponentWrapper World::AttachComponent(EntityID entity, std::string componentTy return c; } -bool World::HasEntity(EntityID entity) -{ - return m_EntityParents.find(entity) != m_EntityParents.end(); -} - - -bool World::HasComponent(EntityID entity, std::string componentType) +bool World::HasComponent(EntityID entity, std::string componentType) const { ComponentPool* pool = m_ComponentPools.at(componentType); return pool->KnowsEntity(entity); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 08f68f98..e682297e 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -27,8 +27,6 @@ void Client::Start(World* world, EventBroker* eventBroker) m_World = world; // Subscribe to events - //m_EInputCommand = decltype(m_EInputCommand)(std::bind(&Client::OnInputCommand, this, std::placeholders::_1)); - //m_EventBroker->Subscribe(m_EInputCommand); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Client::OnInputCommand); m_Socket.connect(m_ReceiverEndpoint); @@ -74,7 +72,6 @@ void Client::sendSnapshotToServer() auto player = m_World->GetComponent(m_PlayerDefinitions[m_PlayerID].EntityID, "Player"); - // See if any movement keys are down // We dont care if it's overwritten by later // if statement. Watcha gonna do, right! @@ -181,47 +178,53 @@ void Client::parseEventMessage(Packet& packet) } } +void Client::updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType) +{ + for (auto field : componentInfo.FieldsInOrder) { + ComponentInfo::Field_t fieldInfo = componentInfo.Fields.at(field); + if (fieldInfo.Type == "string") { + std::string& value = packet.ReadString(); + m_World->GetComponent(entityID, componentType)[fieldInfo.Name] = value; + } else { + memcpy(m_World->GetComponent(entityID, componentType).Data + fieldInfo.Offset, packet.ReadData(fieldInfo.Stride), fieldInfo.Stride); + } + } +} + +// Field parse void Client::parseSnapshot(Packet& packet) { std::string componentType = packet.ReadString(); - //LOG_INFO("A snapshot was parsed. first component type is: %s", componentType.c_str()); - int stride = packet.ReadPrimitive(); - int nrOfComponents = (packet.Size() - packet.DataReadSize()) / (stride + sizeof(EntityID)); - if (componentType == "Model") - return; - for (size_t i = 0; i < nrOfComponents; i++) { + while (packet.DataReadSize() < packet.Size()) { EntityID entityID = packet.ReadPrimitive(); - //ComponentWrapper model = m_World->GetComponent(entityID, "Model"); - //std::string checkPath = model["Resource"]; - // Check if entity exists - if (m_World->HasEntity(entityID)) { - // check if component exists + ComponentInfo componentInfo = m_World->GetComponents(componentType)->ComponentInfo(); + if (m_World->ValidEntity(entityID)) { if (m_World->HasComponent(entityID, componentType)) { - //Copy data to component - memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); + // If the entity and the component exists update it + updateFields(packet, componentInfo, entityID, componentType); + // if entity exists but not the component } else { - // If component doesen't exist // Create component m_World->AttachComponent(entityID, componentType); // Copy data to newly created component - memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); + updateFields(packet, componentInfo, entityID, componentType); } + // If the entity dosent exist nor the component } else { + //Create Entity // If entity dosen't exist EntityID newEntityID = m_World->CreateEntity(); // Check if EntityIDs are out of sync if (newEntityID != entityID) { - LOG_INFO("Client::parseSnapshot(Packet& packet): Newly created EntityID is not the same as the one sent by server \ - EntityIDs are out of sync"); + LOG_INFO("Client::parseSnapshot(Packet& packet): Newly created EntityID is not the \ + same as the one sent by server (EntityIDs are out of sync)"); } + // Create component m_World->AttachComponent(newEntityID, componentType); // Copy data to newly created component - memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); + updateFields(packet, componentInfo, newEntityID, componentType); } - //ComponentWrapper model2 = m_World->GetComponent(entityID, "Model"); - //std::string checkPath2 = model2["Resource"]; } - } int Client::receive(char* data, size_t length) @@ -234,7 +237,7 @@ int Client::receive(char* data, size_t length) 0, error); if (error) { - //LOG_ERROR("receive: %s", error.message().c_str()); + LOG_ERROR("receive: %s", error.message().c_str()); } return bytesReceived; diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 86a91f5d..2b2c7938 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -35,13 +35,13 @@ void Packet::Init(MessageType type, unsigned int & packetID) packetID++; } -void Packet::WriteString(std::string str) +void Packet::WriteString(const std::string& str) { // Message, add one extra byte for null terminator int sizeOfString = str.size() + 1; if (m_Offset + sizeOfString > m_MaxPacketSize) { - LOG_WARNING("Package::WriteString(): Data size in packet exceeded maximum package size.\n"); - return; + LOG_WARNING("Package::WriteString(): Data size in packet exceeded maximum package size. New size is %i bytes\n", m_MaxPacketSize*2); + resizeData(); } memcpy(m_Data + m_Offset, str.data(), sizeOfString * sizeof(char)); m_Offset += sizeOfString * sizeof(char); @@ -50,8 +50,8 @@ void Packet::WriteString(std::string str) void Packet::WriteData(char * data, int sizeOfData) { if (m_Offset + sizeOfData > m_MaxPacketSize) { - LOG_WARNING("Packet::WriteData(): Data size in packet exceeded maximum packet size.\n"); - return; + LOG_WARNING("Packet::WriteData(): Data size in packet exceeded maximum packet size. New size is %i bytes\n", m_MaxPacketSize*2); + resizeData(); } memcpy(m_Data + m_Offset, data, sizeOfData); m_Offset += sizeOfData; @@ -78,4 +78,24 @@ char * Packet::ReadData(int SizeOfData) unsigned int oldReturnDataOffset = m_ReturnDataOffset; m_ReturnDataOffset += SizeOfData; return (m_Data + oldReturnDataOffset); -} \ No newline at end of file +} + +void Packet::resizeData() +{ + + // Allocate memory to store our data in + char* holdData = new char[m_MaxPacketSize]; + // Copy our data to the newly allocated memory + memcpy(holdData, m_Data, m_Offset); + // Increase max packet size + m_MaxPacketSize = m_MaxPacketSize * 2; + // Delete our data + delete m_Data; + // Allocate twice the memory we had before + m_Data = new char[m_MaxPacketSize]; + // Copy our data to new location + memcpy(m_Data, holdData, m_Offset); + // Delete the memory allocated to hold our data + // while we resized the old data container. + delete holdData; +} diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 791f5a42..837a77d6 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -32,10 +32,6 @@ void Server::Close() void Server::readFromClients() { - // m_ThreadIsRunning might be unnecessary but the - // program crashed if it executed m_Socket.available() - // when closing the program. - while (m_Socket.available()) { try { bytesRead = receive(readBuffer, INPUTSIZE); @@ -44,7 +40,6 @@ void Server::readFromClients() } catch (const std::exception& err) { //LOG_ERROR("%i: Read from client crashed %s", m_PacketID, err.what()); } - } std::clock_t currentTime = std::clock(); // Send snapshot @@ -111,7 +106,7 @@ int Server::receive(char * data, size_t length) void Server::send(Packet& packet, int playerID) { - m_Socket.send_to( + int bytesSent = m_Socket.send_to( boost::asio::buffer(packet.Data(), packet.Size()), m_PlayerDefinitions[playerID].Endpoint, 0); @@ -152,120 +147,35 @@ void Server::broadcast(Packet& packet) } } } -// -//void Server::parseShitTest(Packet& packet) -//{ -// packet.ReadPrimitive(); // MessageType -// packet.ReadPrimitive(); // Packet ID -// -// std::string componentType = packet.ReadString(); -// //LOG_INFO("A snapshot was parsed. first component type is: %s", componentType.c_str()); -// int stride = packet.ReadPrimitive(); -// int nrOfComponents = (packet.Size() - packet.DataReadSize()) / (stride + sizeof(EntityID)); -// //if (componentType == "Model") -// // return; -// for (size_t i = 0; i < nrOfComponents; i++) { -// EntityID entityID = packet.ReadPrimitive(); -// ComponentWrapper model = m_World->GetComponent(entityID, "Model"); -// std::string checkPath = model["Resource"]; -// // Check if entity exists -// if (m_World->HasEntity(entityID)) { -// // check if component exists -// if (m_World->HasComponent(entityID, componentType)) { -// //Copy data to component -// memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); -// } else { -// // If component doesen't exist -// // Create component -// m_World->AttachComponent(entityID, componentType); -// // Copy data to newly created component -// memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); -// } -// } else { -// // If entity dosen't exist -// EntityID newEntityID = m_World->CreateEntity(); -// // Check if EntityIDs are out of sync -// if (newEntityID != entityID) { -// LOG_INFO("Client::parseSnapshot(Packet& packet): Newly created EntityID is not the same as the one sent by server \ -// EntityIDs are out of sync"); -// } -// m_World->AttachComponent(newEntityID, componentType); -// // Copy data to newly created component -// memcpy(m_World->GetComponent(entityID, componentType).Data, packet.ReadData(stride), stride); -// } -// ComponentWrapper model2 = m_World->GetComponent(entityID, "Model"); -// std::string checkPath2 = model2["Resource"]; -// } -//} +// Send snapshot fields void Server::sendSnapshot() { // Should time this std::unordered_map worldComponentPools = m_World->GetComponentPools(); - for (auto it : worldComponentPools) { + for (auto& it : worldComponentPools) { Packet packet(MessageType::Snapshot, m_SendPacketID); std::string componentType = it.first; - //if (componentType != "Model") - // continue; ComponentPool* componentPool = it.second; ComponentInfo componentInfo = componentPool->ComponentInfo(); packet.WriteString(componentInfo.Name); - packet.WritePrimitive(componentInfo.Meta.Stride); - for (auto componentWrapper : *componentPool) { - if (packet.Size() + componentInfo.Meta.Stride >= packet.MaxSize()) { - broadcast(packet); - //parseShitTest(packet); - // Packet destructor is called (which is what we want). - packet.Init(MessageType::Snapshot, m_SendPacketID); - // Add Component header - packet.WriteString(componentInfo.Name); - packet.WritePrimitive(componentInfo.Meta.Stride); - } - // Component data + + for (auto& componentWrapper : *componentPool) { packet.WritePrimitive(componentWrapper.EntityID); - packet.WriteData(componentWrapper.Data, componentWrapper.Info.Meta.Stride); + for (auto& componentField : componentWrapper.Info.FieldsInOrder) { + ComponentInfo::Field_t fieldInfo = componentInfo.Fields.at(componentField); + if (fieldInfo.Type == "string") { + std::string& value = componentWrapper[componentField]; + packet.WriteString(value); + } else { + packet.WriteData(componentWrapper.Data + fieldInfo.Offset, fieldInfo.Stride); + } + } } broadcast(packet); } } -//void Server::sendSnapshot() -//{ -// // Should time this -// std::unordered_map worldComponentPools = m_World->GetComponentPools(); -// for (auto it : worldComponentPools) { -// Packet packet(MessageType::Snapshot, m_SendPacketID); -// std::string componentType = it.first; -// ComponentPool* componentPool = it.second; -// ComponentInfo componentInfo = componentPool->ComponentInfo(); -// if (componentInfo.Name != "Transform") -// continue; -// packet.WriteString(componentInfo.Name); -// packet.WritePrimitive(componentInfo.Meta.Stride); -// auto componentWrapper = *componentPool->begin(); -// packet.WritePrimitive(componentWrapper.EntityID); -// packet.WriteData(componentWrapper.Data, componentWrapper.Info.Meta.Stride); -// -// for (auto componentWrapper : *componentPool) { -// //// When packet is full send it -// //if (packet.Size() + componentInfo.Meta.Stride >= packet.MaxSize()) { -// // broadcast(packet); -// // // Packet destructor is called (which is what we want). -// // packet.Init(MessageType::Snapshot, m_SendPacketID); -// // // Add Component header -// // packet.WriteString(componentInfo.Name); -// // packet.WritePrimitive(componentInfo.Meta.Stride); -// -// //} -// //// Component data -// //packet.WritePrimitive(componentWrapper.EntityID); -// //packet.WriteData(componentWrapper.Data, componentWrapper.Info.Meta.Stride); -// broadcast(packet); -// } -// broadcast(packet); -// } -//} - void Server::sendPing() { // Prints connected players ping @@ -275,7 +185,6 @@ void Server::sendPing() LOG_INFO("Last packetID received %i: Player %i's ping: %i", m_PacketID, i, ping); } } - // Create ping message Packet packet(MessageType::ServerPing, m_SendPacketID); packet.WriteString("Ping from server"); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index bf08d340..718c74c6 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -77,6 +77,8 @@ Game::Game(int argc, char* argv[]) networkFunction(); } m_LastTime = glfwGetTime(); + // For testing + debugInitialize(); } Game::~Game() @@ -113,7 +115,8 @@ void Game::Tick() if (m_IsClientOrServer) { m_ClientOrServer->Update(); } - + // For testing + debugTick(dt); // Iterate through systems and update world! m_SystemPipeline->Update(m_World, dt); m_Renderer->Update(dt); @@ -132,6 +135,33 @@ void Game::debugTick(double dt) m_EventBroker->Process(); } +// For testing +bool Game::debugOnInputCommand(const Events::InputCommand& e) +{ + if (e.Command == "SwitchToServer" && e.Value > 0) { + m_ClientOrServer->Close(); // memory leak for now, use delete when it works + //delete m_ClientOrServer; + m_ClientOrServer = new Server(); + LOG_INFO("Switching to server"); + m_ClientOrServer->Start(m_World, m_EventBroker); + } else if (e.Command == "SwitchToClient" && e.Value > 0) { + m_ClientOrServer->Close(); // memory leak for now, use delete when it works + //delete m_ClientOrServer; + m_ClientOrServer = new Client(m_Config); + m_ClientOrServer->Start(m_World, m_EventBroker); + LOG_INFO("Switching to client"); + } + + return false; +} + +// For testing +void Game::debugInitialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Game::debugOnInputCommand); +} + + void Game::networkFunction() { bool isServer = m_Config->Get("Networking.IsServer", false); From 56ac592d6d8355e1a25c1c2cf01b74fb979243b4 Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 12 Jan 2016 14:16:01 +0100 Subject: [PATCH 15/20] Removed debug code from Game.cpp --- src/Game/Game.cpp | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 718c74c6..c84c556b 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -77,8 +77,6 @@ Game::Game(int argc, char* argv[]) networkFunction(); } m_LastTime = glfwGetTime(); - // For testing - debugInitialize(); } Game::~Game() @@ -115,8 +113,6 @@ void Game::Tick() if (m_IsClientOrServer) { m_ClientOrServer->Update(); } - // For testing - debugTick(dt); // Iterate through systems and update world! m_SystemPipeline->Update(m_World, dt); m_Renderer->Update(dt); @@ -135,33 +131,6 @@ void Game::debugTick(double dt) m_EventBroker->Process(); } -// For testing -bool Game::debugOnInputCommand(const Events::InputCommand& e) -{ - if (e.Command == "SwitchToServer" && e.Value > 0) { - m_ClientOrServer->Close(); // memory leak for now, use delete when it works - //delete m_ClientOrServer; - m_ClientOrServer = new Server(); - LOG_INFO("Switching to server"); - m_ClientOrServer->Start(m_World, m_EventBroker); - } else if (e.Command == "SwitchToClient" && e.Value > 0) { - m_ClientOrServer->Close(); // memory leak for now, use delete when it works - //delete m_ClientOrServer; - m_ClientOrServer = new Client(m_Config); - m_ClientOrServer->Start(m_World, m_EventBroker); - LOG_INFO("Switching to client"); - } - - return false; -} - -// For testing -void Game::debugInitialize() -{ - EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Game::debugOnInputCommand); -} - - void Game::networkFunction() { bool isServer = m_Config->Get("Networking.IsServer", false); From 228439953843aecc18c177d0cf63d55786b09ca0 Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 12 Jan 2016 17:47:03 +0100 Subject: [PATCH 16/20] Removed Close method from Client, Server and Network. Removed legacy variable m_ThreadIsRunning in Client.h and Server.h. Removed m_EventBroker->Unsubscribe(m_EInputCommand) in Client destructor. --- include/Engine/Network/Client.h | 2 -- include/Engine/Network/Network.h | 1 - include/Engine/Network/Server.h | 5 ----- src/Engine/Network/Client.cpp | 9 --------- src/Engine/Network/Server.cpp | 6 ------ 5 files changed, 23 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index b7bd9b38..a5488210 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -23,7 +23,6 @@ public: ~Client(); void Start(World* world, EventBroker* eventBroker) override; void Update() override; - void Close(); private: // Assio UDP logic boost::asio::ip::udp::endpoint m_ReceiverEndpoint; @@ -49,7 +48,6 @@ private: // Network logic PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; SnapshotDefinitions m_NextSnapshot; - bool m_ThreadIsRunning = true; double m_DurationOfPingTime; std::clock_t m_StartPingTime; // Use to check if we should send disconnect message diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index 8a50f061..cb86b941 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -14,7 +14,6 @@ public: virtual ~Network() { }; virtual void Start(World* m_world, EventBroker *eventBroker) = 0; virtual void Update() = 0; - virtual void Close() = 0; }; #endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 58ee2631..893eed0b 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -20,8 +20,6 @@ public: ~Server(); void Start(World* m_world, EventBroker *eventBroker) override; void Update() override; - void Close(); - private: // UDP logic boost::asio::ip::udp::endpoint m_ReceiverEndpoint; @@ -55,9 +53,6 @@ private: unsigned int m_PacketID; unsigned int m_PreviousPacketID; unsigned int m_SendPacketID; - - // Close logic - bool m_ThreadIsRunning = true; // Private member functions int receive(char* data, size_t length); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index e682297e..b8849ed0 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -17,7 +17,6 @@ Client::Client(ConfigFile* config) : m_Socket(m_IOService) Client::~Client() { - m_EventBroker->Unsubscribe(m_EInputCommand); } void Client::Start(World* world, EventBroker* eventBroker) @@ -38,14 +37,6 @@ void Client::Update() readFromServer(); } -void Client::Close() -{ - disconnect(); - m_ThreadIsRunning = false; - m_Socket.close(); - m_EventBroker->Unsubscribe(m_EInputCommand); -} - void Client::readFromServer() { while (m_Socket.available()) { diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 837a77d6..07fed65b 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -24,12 +24,6 @@ void Server::Update() readFromClients(); } -void Server::Close() -{ - m_ThreadIsRunning = false; - m_Socket.close(); -} - void Server::readFromClients() { while (m_Socket.available()) { From e7f02f14a074d9dc6873779779c18567e00fd13b Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 14 Jan 2016 11:12:02 +0100 Subject: [PATCH 17/20] 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 18/20] 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 19/20] 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 20/20] 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); - }