From fa66e9ff477ef9b406c8d07c3e0aebe4163c2ba9 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Tue, 15 Dec 2015 15:29:19 +0100 Subject: [PATCH] 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"); }