diff --git a/include/Core/Engine.h b/include/Core/Engine.h old mode 100644 new mode 100755 index 8b16650..1b05bf8 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -25,12 +25,13 @@ #include "Texture.h" #include "EventBroker.h" #include "RenderQueue.h" -#include "BGFXRenderer.h" +#include "Renderer.h" #include "InputManager.h" //TODO: Remove includes that are only here for the temporary draw solution. #include "World.h" #include "CTransform.h" #include "Rendering/CModel.h" +#include "Rendering/CSprite.h" #include "CTemplate.h" #include "Transform/TransformSystem.h" @@ -42,31 +43,33 @@ class Engine public: Engine(int argc, char* argv[]) { -// m_EventBroker = std::make_shared(); + m_EventBroker = std::make_shared(); - m_Renderer = std::make_shared(); + m_Renderer = std::make_shared(); m_Renderer->SetFullscreen(false); - m_Renderer->SetResolution(Rectangle(0, 0, 1280, 720)); + m_Renderer->SetResolution(Rectangle(0, 0, 1920, 1080)); m_Renderer->Initialize(); -// m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); -// -// m_World = std::make_shared(m_EventBroker); -// -// //TODO: Move this out of engine.h -// m_World->ComponentFactory.Register(); -// m_World->SystemFactory.Register([this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); -// m_World->AddSystem(); -// m_World->ComponentFactory.Register(); -// m_World->ComponentFactory.Register(); -// m_World->Initialize(); + m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); -// auto ent = m_World->CreateEntity(); -// std::shared_ptr transform = m_World->AddComponent(ent); -// transform->Position = glm::vec3(0.f, 0.f, -10.f); -// std::shared_ptr model = m_World->AddComponent(ent); -// model->ModelFile = "Models/Core/UnitSphere.obj"; + m_World = std::make_shared(m_EventBroker); + //TODO: Move this out of engine.h + m_World->ComponentFactory.Register(); + m_World->SystemFactory.Register([this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->Initialize(); + + { + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(0.f, 0.f, -10.f); + auto sprite = m_World->AddComponent(ent); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + } m_LastTime = glfwGetTime(); } @@ -79,26 +82,26 @@ public: double dt = currentTime - m_LastTime; m_LastTime = currentTime; -// ResourceManager::Update(); -// -// // Update input -// m_InputManager->Update(dt); -// -// m_World->Update(dt); -// -// if (glfwGetKey(m_Renderer->Window(), GLFW_KEY_R)) { -// ResourceManager::Reload("Shaders/Deferred/3/Fragment.glsl"); -// } -// -// //TODO Fill up the renderQueue with models (Temp fix) -// TEMPAddToRenderQueue(); -// -// // Render scene -// //TODO send renderqueue to draw. + ResourceManager::Update(); + + // Update input + m_InputManager->Update(dt); + + m_World->Update(dt); + + if (glfwGetKey(m_Renderer->Window(), GLFW_KEY_R)) { + ResourceManager::Reload("Shaders/Deferred/3/Fragment.glsl"); + } + + //TODO Fill up the renderQueue with models (Temp fix) + TEMPAddToRenderQueue(); + + // Render scene + //TODO send renderqueue to draw. m_Renderer->Draw(m_RendererQueue); // Swap event queues -// m_EventBroker->Clear(); + m_EventBroker->Clear(); glfwPollEvents(); } @@ -141,6 +144,21 @@ public: EnqueueModel(modelAsset, modelMatrix, modelComponent->Transparent, modelComponent->Color); } } + + auto spriteComponent = m_World->GetComponent(entity); + if (spriteComponent) + { + auto textureAsset = ResourceManager::Load(spriteComponent->SpriteFile); + if (textureAsset) + { + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + glm::quat orientation2D = glm::angleAxis(glm::eulerAngles(absoluteTransform.Orientation).z, glm::vec3(0, 0, -1)); + glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) + * glm::toMat4(orientation2D) + * glm::scale(absoluteTransform.Scale); + EnqueueSprite(textureAsset, modelMatrix, spriteComponent->Color); + } + } } m_RendererQueue.Sort(); @@ -167,10 +185,22 @@ public: } } + // TODO: Get this out of engine.h + void EnqueueSprite(Texture* texture, glm::mat4 modelMatrix, glm::vec4 color) + { + SpriteJob job; + job.TextureID = texture->ResourceID; + job.Texture = *texture; + job.ModelMatrix = modelMatrix; + job.Color = color; + + m_RendererQueue.Forward.Add(job); + } + private: - //std::shared_ptr m_ResourceManager; + std::shared_ptr m_ResourceManager; std::shared_ptr m_EventBroker; - std::shared_ptr m_Renderer; + std::shared_ptr m_Renderer; RenderQueueCollection m_RendererQueue; std::shared_ptr m_InputManager; std::shared_ptr m_World; diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h old mode 100644 new mode 100755 index 8aa4a2c..d3c7054 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -73,7 +73,7 @@ private: ShaderProgram* m_spForward; ShaderProgram* m_spScreen; - GLuint m_UnitQuad = 0; + GLuint m_ScreenQuad = 0; Model* m_UnitSphere = nullptr; GLuint m_rbDepthBuffer = 0; diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp old mode 100644 new mode 100755 index 5af1892..c22530a --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -98,21 +98,19 @@ void dd::Renderer::LoadShaders() /* Forward rendering */ - m_spForward = ResourceManager::Load("Shaders/Forward/"); m_spForward->Link(); /* Screen draw */ - m_spScreen = ResourceManager::Load("Shaders/Screen/"); m_spScreen->Link(); } void dd::Renderer::CreateBuffers() { - m_UnitQuad = CreateQuad(); + m_ScreenQuad = CreateQuad(); m_UnitSphere = ResourceManager::Load("Models/Core/UnitSphere.obj"); glGenRenderbuffers(1, &m_rbDepthBuffer); @@ -222,7 +220,7 @@ void dd::Renderer::Draw(RenderQueueCollection& rq) m_spScreen->Bind(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_CurrentScreenBuffer); - glBindVertexArray(m_UnitQuad); + glBindVertexArray(m_ScreenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); glfwSwapBuffers(m_Window); @@ -271,7 +269,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glBindTexture(GL_TEXTURE_2D, m_GDiffuse); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_tLighting); - glBindVertexArray(m_UnitQuad); + glBindVertexArray(m_ScreenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); } @@ -322,6 +320,27 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glBindVertexArray(modelJob->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); + + continue; + } + + auto spriteJob = std::dynamic_pointer_cast(job); + if (spriteJob) + { + glm::mat4 modelMatrix = spriteJob->ModelMatrix; + modelMatrix = modelMatrix * glm::scale(glm::vec3(0.5f)); + MVP = PV * modelMatrix; + glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, spriteJob->Texture); + + glBindVertexArray(m_ScreenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + + continue; } } } @@ -396,9 +415,9 @@ GLuint dd::Renderer::CreateQuad() glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); - glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, 0); + glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(0); - glEnableVertexAttribArray(2); + glEnableVertexAttribArray(4); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); diff --git a/src/game/Core/Shaders/Deferred/3/Fragment.glsl b/src/game/Core/Shaders/Deferred/3/Fragment.glsl old mode 100644 new mode 100755 index 2d064f0..08b7f08 --- a/src/game/Core/Shaders/Deferred/3/Fragment.glsl +++ b/src/game/Core/Shaders/Deferred/3/Fragment.glsl @@ -37,6 +37,7 @@ void main() vec4 LightingTexel = texture(LightingTexture, Input.TextureCoord); //frag_Diffuse = DiffuseTexel * (vec4(La, 0.0) * (vec4(LightingTexel.rgb, 0.0) + vec4(LightingTexel.a, LightingTexel.a, LightingTexel.a, 0.0))); - frag_Diffuse = DiffuseTexel * (vec4(La, 0.0) + LightingTexel); + //frag_Diffuse = DiffuseTexel * (vec4(La, 0.0) + LightingTexel); + frag_Diffuse = DiffuseTexel; //frag_Diffuse = vec4(LightingTexel.r, LightingTexel.g, LightingTexel.b, 1.0); } \ No newline at end of file diff --git a/src/game/Core/Shaders/Forward/Vertex.glsl b/src/game/Core/Shaders/Forward/Vertex.glsl old mode 100644 new mode 100755 index 4b4e649..64a9e26 --- a/src/game/Core/Shaders/Forward/Vertex.glsl +++ b/src/game/Core/Shaders/Forward/Vertex.glsl @@ -65,8 +65,10 @@ void main() + BoneWeights2[3] * Bones[int(BoneIndices2[3])]; } - gl_Position = MVP * boneTransform * vec4(Position, 1.0); + //gl_Position = MVP * boneTransform * vec4(Position, 1.0); + gl_Position = MVP * vec4(Position, 1.0); + //TODO: Make sure that boneTransform works here. Output.Position = (V * M * boneTransform * vec4(Position, 1.0)).xyz; Output.Normal = (inverse(transpose(V * M)) * boneTransform * vec4(Normal, 0.0)).xyz; Output.Tangent = Tangent;