diff --git a/include/Core/Engine.h b/include/Core/Engine.h index bfa4038..24c43ae 100644 --- 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" @@ -45,49 +46,55 @@ namespace dd class Engine { public: - Engine(int argc, char* argv[]) - { - m_EventBroker = std::make_shared(); + Engine(int argc, char* argv[]) { + m_EventBroker = std::make_shared(); - m_Renderer = std::make_shared(); - m_Renderer->SetFullscreen(false); - m_Renderer->SetResolution(Rectangle(0, 0, 1280, 720)); - m_Renderer->Initialize(); + m_Renderer = std::make_shared(); + m_Renderer->SetFullscreen(false); + m_Renderer->SetResolution(Rectangle(0, 0, 1920, 1080)); + m_Renderer->Initialize(); - m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); + m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); - m_World = std::make_shared(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(); + //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->ComponentFactory.Register(); - m_World->SystemFactory.Register([this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); + m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->Initialize(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->SystemFactory.Register( + [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); - 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->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->Initialize(); - std::shared_ptr boxShape = m_World->AddComponent(ent); - boxShape->x = 5.f; - boxShape->y = 5.f; + { + 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 physics = m_World->AddComponent(ent); - physics->Static = true; + std::shared_ptr sprite = m_World->AddComponent(ent); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - m_World->CommitEntity(ent); + std::shared_ptr boxShape = m_World->AddComponent(ent); + boxShape->x = 5.f; + boxShape->y = 5.f; + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = true; + m_World->CommitEntity(ent); + } m_LastTime = glfwGetTime(); } @@ -102,17 +109,17 @@ public: ResourceManager::Update(); -// // Update input + // 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"); -// } + + 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(); + TEMPAddToRenderQueue(); // Render scene //TODO send renderqueue to draw. @@ -162,6 +169,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(); @@ -188,10 +210,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_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/Engine.h.orig b/include/Core/Engine.h.orig new file mode 100644 index 0000000..2bd66b4 --- /dev/null +++ b/include/Core/Engine.h.orig @@ -0,0 +1,259 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#include +#include + +#include "ResourceManager.h" +#include "OBJ.h" +#include "Model.h" +#include "Texture.h" +#include "EventBroker.h" +#include "RenderQueue.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" + +#include "Physics/PhysicsSystem.h" +#include "Physics/CPhysics.h" + +#include "CBoxShape.h" + +namespace dd +{ + +class Engine +{ +public: + Engine(int argc, char* argv[]) + { + m_EventBroker = std::make_shared(); + + m_Renderer = std::make_shared(); + m_Renderer->SetFullscreen(false); + 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(); +<<<<<<< HEAD + + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->SystemFactory.Register([this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + + 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); + std::shared_ptr model = m_World->AddComponent(ent); + model->ModelFile = "Models/Core/UnitSphere.obj"; + + std::shared_ptr boxShape = m_World->AddComponent(ent); + boxShape->x = 5.f; + boxShape->y = 5.f; + + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = true; + + m_World->CommitEntity(ent); + + +======= + 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"; +// } +>>>>>>> origin/master + + m_LastTime = glfwGetTime(); + } + + bool Running() const { return !glfwWindowShouldClose(m_Renderer->Window()); } + + void Tick() + { + double currentTime = glfwGetTime(); + double dt = currentTime - m_LastTime; + m_LastTime = currentTime; + + ResourceManager::Update(); + +<<<<<<< HEAD +// // 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(); +======= + // 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(); +>>>>>>> origin/master + + // Render scene + //TODO send renderqueue to draw. + m_Renderer->Draw(m_RendererQueue); + + // Swap event queues + m_EventBroker->Clear(); + + glfwPollEvents(); + } + + std::shared_ptr m_TransformSystem; + + //TODO: Get this out of engine.h + void TEMPAddToRenderQueue() + { + + if (!m_TransformSystem) + m_TransformSystem = m_World->GetSystem(); + + m_RendererQueue.Clear(); + + for (auto &pair : *m_World->GetEntities()) + { + EntityID entity = pair.first; + + auto templateComponent = m_World->GetComponent(entity); + if (templateComponent) + continue; + + auto transform = m_World->GetComponent(entity); + if (!transform) + continue; + + auto modelComponent = m_World->GetComponent(entity); + if (modelComponent) + { + Model* modelAsset = nullptr; + modelAsset = ResourceManager::Load(modelComponent->ModelFile); + + if (modelAsset) + { + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + glm::mat4 modelMatrix = glm::translate(glm::mat4(), absoluteTransform.Position) + * glm::toMat4(absoluteTransform.Orientation) + * glm::scale(absoluteTransform.Scale); + 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(); + } + + //TODO: Get this out of engine.h + void EnqueueModel(Model* model, glm::mat4 modelMatrix, float transparent, glm::vec4 color) + { + for (auto texGroup : model->TextureGroups) + { + ModelJob job; + job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; + job.DiffuseTexture = (texGroup.Texture) ? *texGroup.Texture : 0; + job.NormalTexture = (texGroup.NormalMap) ? *texGroup.NormalMap : 0; + job.SpecularTexture = (texGroup.SpecularMap) ? *texGroup.SpecularMap : 0; + job.VAO = model->VAO; + job.ElementBuffer = model->ElementBuffer; + job.StartIndex = texGroup.StartIndex; + job.EndIndex = texGroup.EndIndex; + job.ModelMatrix = modelMatrix; + job.Color = color; + + m_RendererQueue.Deferred.Add(job); + } + } + + // 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_EventBroker; + std::shared_ptr m_Renderer; + RenderQueueCollection m_RendererQueue; + std::shared_ptr m_InputManager; + std::shared_ptr m_World; + + double m_LastTime; +}; + +} diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp old mode 100644 new mode 100755 index 5af1892..69aee81 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -322,6 +322,26 @@ 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; + 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_UnitQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + + continue; } } } @@ -396,9 +416,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..46ccf5a --- a/src/game/Core/Shaders/Forward/Vertex.glsl +++ b/src/game/Core/Shaders/Forward/Vertex.glsl @@ -65,7 +65,8 @@ 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); Output.Position = (V * M * boneTransform * vec4(Position, 1.0)).xyz; Output.Normal = (inverse(transpose(V * M)) * boneTransform * vec4(Normal, 0.0)).xyz;