diff --git a/assets/Textures/Test/Brick_Diffuse.png b/assets/Textures/Test/Brick_Diffuse.png new file mode 100755 index 0000000..f661c9d Binary files /dev/null and b/assets/Textures/Test/Brick_Diffuse.png differ diff --git a/assets/Textures/Test/Brick_Normal.png b/assets/Textures/Test/Brick_Normal.png new file mode 100755 index 0000000..af5a481 Binary files /dev/null and b/assets/Textures/Test/Brick_Normal.png differ diff --git a/assets/Textures/Test/Brick_Specular.png b/assets/Textures/Test/Brick_Specular.png new file mode 100755 index 0000000..38679bb Binary files /dev/null and b/assets/Textures/Test/Brick_Specular.png differ diff --git a/assets/Textures/Test/Single_Brick_Diffuse.png b/assets/Textures/Test/Single_Brick_Diffuse.png new file mode 100755 index 0000000..f004fcc Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Diffuse.png differ diff --git a/assets/Textures/Test/Single_Brick_Diffuse2.png b/assets/Textures/Test/Single_Brick_Diffuse2.png new file mode 100755 index 0000000..db16d67 Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Diffuse2.png differ diff --git a/assets/Textures/Test/Single_Brick_Diffuse3.png b/assets/Textures/Test/Single_Brick_Diffuse3.png new file mode 100755 index 0000000..b168ae6 Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Diffuse3.png differ diff --git a/assets/Textures/Test/Single_Brick_Diffuse4.png b/assets/Textures/Test/Single_Brick_Diffuse4.png new file mode 100755 index 0000000..d7b2853 Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Diffuse4.png differ diff --git a/assets/Textures/Test/Single_Brick_Normal.png b/assets/Textures/Test/Single_Brick_Normal.png new file mode 100755 index 0000000..2d1c1ef Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Normal.png differ diff --git a/assets/Textures/Test/Single_Brick_Normal2.png b/assets/Textures/Test/Single_Brick_Normal2.png new file mode 100755 index 0000000..97aa42a Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Normal2.png differ diff --git a/assets/Textures/Test/Single_Brick_Normal3.png b/assets/Textures/Test/Single_Brick_Normal3.png new file mode 100755 index 0000000..4074a7d Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Normal3.png differ diff --git a/assets/Textures/Test/Single_Brick_Normal4.png b/assets/Textures/Test/Single_Brick_Normal4.png new file mode 100755 index 0000000..3efbf6c Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Normal4.png differ diff --git a/assets/Textures/Test/Single_Brick_Specular.png b/assets/Textures/Test/Single_Brick_Specular.png new file mode 100755 index 0000000..824d862 Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Specular.png differ diff --git a/assets/Textures/Test/Single_Brick_Specular2.png b/assets/Textures/Test/Single_Brick_Specular2.png new file mode 100755 index 0000000..c592a6c Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Specular2.png differ diff --git a/assets/Textures/Test/Single_Brick_Specular3.png b/assets/Textures/Test/Single_Brick_Specular3.png new file mode 100755 index 0000000..71a4aa7 Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Specular3.png differ diff --git a/assets/Textures/Test/Single_Brick_Specular4.png b/assets/Textures/Test/Single_Brick_Specular4.png new file mode 100755 index 0000000..191f633 Binary files /dev/null and b/assets/Textures/Test/Single_Brick_Specular4.png differ diff --git a/assets/Textures/Test/TestBrick.psd b/assets/Textures/Test/TestBrick.psd new file mode 100755 index 0000000..3c80e38 Binary files /dev/null and b/assets/Textures/Test/TestBrick.psd differ diff --git a/assets/Textures/Test/TestBrick_Diffuse.png b/assets/Textures/Test/TestBrick_Diffuse.png new file mode 100755 index 0000000..b68f07e Binary files /dev/null and b/assets/Textures/Test/TestBrick_Diffuse.png differ diff --git a/assets/Textures/Test/TestBrick_Diffuse_Simple.png b/assets/Textures/Test/TestBrick_Diffuse_Simple.png new file mode 100755 index 0000000..2918318 Binary files /dev/null and b/assets/Textures/Test/TestBrick_Diffuse_Simple.png differ diff --git a/assets/Textures/Test/TestBrick_Normal.png b/assets/Textures/Test/TestBrick_Normal.png new file mode 100755 index 0000000..13ae8e3 Binary files /dev/null and b/assets/Textures/Test/TestBrick_Normal.png differ diff --git a/assets/Textures/Test/TestBrick_Specular.png b/assets/Textures/Test/TestBrick_Specular.png new file mode 100755 index 0000000..632bf6d Binary files /dev/null and b/assets/Textures/Test/TestBrick_Specular.png differ diff --git a/include/Core/Engine.h b/include/Core/Engine.h old mode 100644 new mode 100755 index 503bd5b..915458d --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -34,6 +34,7 @@ #include "Rendering/CModel.h" #include "Rendering/CSprite.h" #include "CTemplate.h" +#include "Rendering/CPointLight.h" #include "Transform/TransformSystem.h" #include "Game/LevelSystem.h" #include "Game/PadSystem.h" @@ -91,15 +92,30 @@ public: m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); m_World->Initialize(); + + //TODO: Remove tobias light-test code. + { + auto t_BrickWall = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_BrickWall); + transform->Position = glm::vec3(0.f, 0.f, -10.f); + auto sprite = m_World->AddComponent(t_BrickWall); + //TODO: Rename SpriteFile to DiffuseTexture or similar. + sprite->SpriteFile = "Textures/Test/Brick_Diffuse.png"; + sprite->NormalTexture = "Textures/Test/Brick_Normal.png"; + sprite->SpecularTexture = "Textures/Test/Brick_Specular.png"; + } + + { auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); transform->Position = glm::vec3(0.5f, 0.f, -10.f); transform->Scale = glm::vec3(1.f, 1.f, 1.f); - std::shared_ptr sprite = m_World->AddComponent(ent); + //std::shared_ptr sprite = m_World->AddComponent(ent); sprite->SpriteFile = "Textures/Ball.png"; std::shared_ptr circleShape = m_World->AddComponent(ent); @@ -108,6 +124,9 @@ public: std::shared_ptr physics = m_World->AddComponent(ent); physics->Static = false; + auto plight = m_World->AddComponent(ent); + plight->Radius = 2.f; + m_World->CommitEntity(ent); Events::SetImpulse e; @@ -170,7 +189,7 @@ public: /*{ auto ent = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.f, -3.f, -9.f); + transform->Position = glm::vec3(0.f, -3.f, -10.f); transform->Scale = glm::vec3(2.f, 0.5f, 1.f); transform->Orientation = glm::rotate(transform->Orientation, glm::radians(25.f), glm::vec3(0, 0, -1)); @@ -287,19 +306,43 @@ public: } } + //TODO: Add LightLoadShit + + auto pointLightComponent = m_World->GetComponent(entity); + if (pointLightComponent) + { + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + EnqueuePointLight(absoluteTransform.Position, + pointLightComponent->Diffuse, + pointLightComponent->Specular, + pointLightComponent->Radius); + } + + 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); + + std::string normal = spriteComponent->NormalTexture; + std::string spec = spriteComponent->SpecularTexture; + + if (normal.empty()) { + normal = "Textures/Core/NeutralNormalMap.png"; } + if (spec.empty()) { + spec = "Textures/Core/NeutralSpecularMap.png"; + } + auto texturediff = ResourceManager::Load(spriteComponent->SpriteFile); + auto texturenorm = ResourceManager::Load(normal); + auto texturespec = ResourceManager::Load(spec); + + + 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(texturediff, texturenorm, texturespec, modelMatrix, spriteComponent->Color); } } @@ -328,15 +371,29 @@ public: } // TODO: Get this out of engine.h - void EnqueueSprite(Texture* texture, glm::mat4 modelMatrix, glm::vec4 color) + void EnqueueSprite(Texture* texture, Texture* normalTexture, Texture* specularTexture, glm::mat4 modelMatrix, glm::vec4 color) { SpriteJob job; job.TextureID = texture->ResourceID; - job.Texture = *texture; + job.DiffuseTexture = *texture; + job.NormalTexture = *normalTexture; + job.SpecularTexture = *specularTexture; job.ModelMatrix = modelMatrix; job.Color = color; - m_RendererQueue.Forward.Add(job); + m_RendererQueue.Deferred.Add(job); + } + + void EnqueuePointLight(glm::vec3 position, glm::vec3 diffuseColor, glm::vec3 specularColor, float radius) + { + PointLightJob job; + job.Position = position; + job.DiffuseColor = diffuseColor; + job.SpecularColor = specularColor; + job.Radius = radius; + + m_RendererQueue.Lights.Add(job); + } private: diff --git a/include/Core/Engine.h.orig b/include/Core/Engine.h.orig new file mode 100755 index 0000000..819b19e --- /dev/null +++ b/include/Core/Engine.h.orig @@ -0,0 +1,417 @@ +/* + 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 "Core/EventBroker.h" +#include "Rendering/CModel.h" +#include "Rendering/CSprite.h" +#include "CTemplate.h" +#include "Rendering/CPointLight.h" +#include "Transform/TransformSystem.h" +#include "Game/LevelSystem.h" +#include "Game/PadSystem.h" +#include "Game/CBall.h" +#include "Game/CBrick.h" +#include "Game/CPad.h" + +#include "Physics/PhysicsSystem.h" +#include "Physics/CPhysics.h" +#include "Physics/CBoxShape.h" +#include "Physics/ESetImpulse.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(); +// m_World->ComponentFactory.Register(); +// m_World->ComponentFactory.Register(); + + + m_World->ComponentFactory.Register(); + + m_World->ComponentFactory.Register(); + 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->SystemFactory.Register([this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + m_World->SystemFactory.Register([this]() { return new Systems::PadSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->Initialize(); + + + //TODO: Remove tobias light-test code. + { + auto t_BrickWall = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_BrickWall); + transform->Position = glm::vec3(0.f, 0.f, -10.f); + auto sprite = m_World->AddComponent(t_BrickWall); + //TODO: Rename SpriteFile to DiffuseTexture or similar. + sprite->SpriteFile = "Textures/Test/Brick_Diffuse.png"; + sprite->NormalTexture = "Textures/Test/Brick_Normal.png"; + sprite->SpecularTexture = "Textures/Test/Brick_Specular.png"; + } + + + { + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); +<<<<<<< HEAD + transform->Position = glm::vec3(0.5f, 0.f, -10.f); + transform->Scale = glm::vec3(1.f, 1.f, 1.f); + + std::shared_ptr sprite = m_World->AddComponent(ent); + sprite->SpriteFile = "Textures/Ball.png"; +======= + transform->Position = glm::vec3(0.f, 0.f, -9.5f); + + //std::shared_ptr sprite = m_World->AddComponent(ent); + //sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; +>>>>>>> GLrenderer + + std::shared_ptr circleShape = m_World->AddComponent(ent); + std::shared_ptr ball = m_World->AddComponent(ent); + + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = false; + + auto plight = m_World->AddComponent(ent); + plight->Radius = 2.f; + + m_World->CommitEntity(ent); + + Events::SetImpulse e; + e.Entity = ent; + e.Impulse = glm::vec2(0.f, -7.f); + e.Point = glm::vec2(0.5f, 0.f); + m_EventBroker->Publish(e); + } + + { + auto topWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(topWall); + transform->Position = glm::vec3(0.f, 5.f, -10.f); + transform->Scale = glm::vec3(15.f, 0.5f, 1.f); + + std::shared_ptr sprite = m_World->AddComponent(topWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + + std::shared_ptr boxShape = m_World->AddComponent(topWall); + + std::shared_ptr physics = m_World->AddComponent(topWall); + physics->Static = true; + + m_World->CommitEntity(topWall); + } + { + auto leftWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(leftWall); + transform->Position = glm::vec3(-9.f, 1.f, -10.f); + transform->Scale = glm::vec3(0.5f, 10.f, 1.f); + + std::shared_ptr sprite = m_World->AddComponent(leftWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + + std::shared_ptr boxShape = m_World->AddComponent(leftWall); + + std::shared_ptr physics = m_World->AddComponent(leftWall); + physics->Static = true; + + m_World->CommitEntity(leftWall); + } + { + auto rightWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(rightWall); + transform->Position = glm::vec3(9.f, 1.f, -10.f); + transform->Scale = glm::vec3(0.5f, 10.f, 1.f); + + std::shared_ptr sprite = m_World->AddComponent(rightWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + + std::shared_ptr boxShape = m_World->AddComponent(rightWall); + + std::shared_ptr physics = m_World->AddComponent(rightWall); + physics->Static = true; + + m_World->CommitEntity(rightWall); + } + + + /*{ + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(0.f, -3.f, -10.f); + transform->Scale = glm::vec3(2.f, 0.5f, 1.f); + transform->Orientation = glm::rotate(transform->Orientation, glm::radians(25.f), glm::vec3(0, 0, -1)); + + std::shared_ptr sprite = m_World->AddComponent(ent); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + + std::shared_ptr boxShape = m_World->AddComponent(ent); + + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = true; + + m_World->CommitEntity(ent); + }*/ + + { + auto ent = m_World->CreateEntity(); + m_World->SetProperty(ent, "Name", "Pad"); + auto ctransform = m_World->AddComponent(ent); + ctransform->Position = glm::vec3(0.f, -5.f, -10.f); + ctransform->Scale = glm::vec3(3.2, 0.8, 0.); + auto rectangle = m_World->AddComponent(ent); + auto physics = m_World->AddComponent(ent); + auto csprite = m_World->AddComponent(ent); + auto pad = m_World->AddComponent(ent); + csprite->SpriteFile = "Textures/Pad.png"; + m_World->CommitEntity(ent); + } + + 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(); + + // 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); + + 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(); + + glfwPollEvents(); + } + + std::shared_ptr m_TransformSystem; + std::shared_ptr m_LevelSystem; + + //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); + } + } + + //TODO: Add LightLoadShit + + auto pointLightComponent = m_World->GetComponent(entity); + if (pointLightComponent) + { + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + EnqueuePointLight(absoluteTransform.Position, + pointLightComponent->Diffuse, + pointLightComponent->Specular, + pointLightComponent->Radius); + } + + + auto spriteComponent = m_World->GetComponent(entity); + if (spriteComponent) + { + + std::string normal = spriteComponent->NormalTexture; + std::string spec = spriteComponent->SpecularTexture; + + if (normal.empty()) { + normal = "Textures/Core/NeutralNormalMap.png"; + } + if (spec.empty()) { + spec = "Textures/Core/NeutralSpecularMap.png"; + } + auto texturediff = ResourceManager::Load(spriteComponent->SpriteFile); + auto texturenorm = ResourceManager::Load(normal); + auto texturespec = ResourceManager::Load(spec); + + + 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(texturediff, texturenorm, texturespec, 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, Texture* normalTexture, Texture* specularTexture, glm::mat4 modelMatrix, glm::vec4 color) + { + SpriteJob job; + job.TextureID = texture->ResourceID; + job.DiffuseTexture = *texture; + job.NormalTexture = *normalTexture; + job.SpecularTexture = *specularTexture; + job.ModelMatrix = modelMatrix; + job.Color = color; + + m_RendererQueue.Deferred.Add(job); + } + + void EnqueuePointLight(glm::vec3 position, glm::vec3 diffuseColor, glm::vec3 specularColor, float radius) + { + PointLightJob job; + job.Position = position; + job.DiffuseColor = diffuseColor; + job.SpecularColor = specularColor; + job.Radius = radius; + + m_RendererQueue.Lights.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/include/Core/RenderQueue.h b/include/Core/RenderQueue.h old mode 100644 new mode 100755 index 13c50a9..ccf1a3a --- a/include/Core/RenderQueue.h +++ b/include/Core/RenderQueue.h @@ -89,7 +89,9 @@ struct SpriteJob : RenderJob unsigned int TextureID; glm::mat4 ModelMatrix; - GLuint Texture; + GLuint DiffuseTexture; + GLuint NormalTexture; + GLuint SpecularTexture; glm::vec4 Color; void CalculateHash() override diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h index d3c7054..ac84ef7 100755 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -75,6 +75,7 @@ private: GLuint m_ScreenQuad = 0; Model* m_UnitSphere = nullptr; + Model* m_UnitQuad = nullptr; GLuint m_rbDepthBuffer = 0; GLuint m_fbDeferred1 = 0; diff --git a/include/Rendering/CSprite.h b/include/Rendering/CSprite.h old mode 100644 new mode 100755 index 6e55d7e..9c39068 --- a/include/Rendering/CSprite.h +++ b/include/Rendering/CSprite.h @@ -34,6 +34,8 @@ struct Sprite : Component Sprite() : Color(glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)) { } std::string SpriteFile; + std::string NormalTexture; + std::string SpecularTexture; glm::vec4 Color; }; diff --git a/src/game/Core/Camera.cpp b/src/game/Core/Camera.cpp old mode 100644 new mode 100755 index 111b11e..5e05394 --- a/src/game/Core/Camera.cpp +++ b/src/game/Core/Camera.cpp @@ -77,12 +77,20 @@ void dd::Camera::SetOrientation(glm::quat val) void dd::Camera::UpdateProjectionMatrix() { - m_ProjectionMatrix = glm::perspective( - m_FOV, - m_AspectRatio, + 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 +// ); } void dd::Camera::UpdateViewMatrix() diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index c22530a..59c08b1 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -111,6 +111,7 @@ void dd::Renderer::LoadShaders() void dd::Renderer::CreateBuffers() { m_ScreenQuad = CreateQuad(); + m_UnitQuad = ResourceManager::Load("Models/Core/UnitQuad.obj"); m_UnitSphere = ResourceManager::Load("Models/Core/UnitSphere.obj"); glGenRenderbuffers(1, &m_rbDepthBuffer); @@ -264,7 +265,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); m_spDeferred3->Bind(); - glUniform3fv(glGetUniformLocation(*m_spDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.3f))); + glUniform3fv(glGetUniformLocation(*m_spDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.5f))); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GDiffuse); glActiveTexture(GL_TEXTURE1); @@ -306,6 +307,7 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glUniform1f(glGetUniformLocation(shaderProgramHandle, "MaterialShininess"), modelJob->Shininess); + //TODO: Make sure that a normal/specular is loaded in. glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture); if (modelJob->NormalTexture != 0) { @@ -328,17 +330,21 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) 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); + glBindTexture(GL_TEXTURE_2D, spriteJob->DiffuseTexture); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, spriteJob->NormalTexture); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, spriteJob->SpecularTexture); - glBindVertexArray(m_ScreenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(m_UnitQuad->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_UnitQuad->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, m_UnitQuad->m_Indices.size(), GL_UNSIGNED_INT, 0, 0); continue; } diff --git a/src/game/Core/Shaders/Deferred/1/Vertex.glsl b/src/game/Core/Shaders/Deferred/1/Vertex.glsl old mode 100644 new mode 100755 index 4b4e649..8c8f058 --- a/src/game/Core/Shaders/Deferred/1/Vertex.glsl +++ b/src/game/Core/Shaders/Deferred/1/Vertex.glsl @@ -65,7 +65,7 @@ void main() + BoneWeights2[3] * Bones[int(BoneIndices2[3])]; } - 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; diff --git a/src/game/Core/Shaders/Deferred/3/Fragment.glsl b/src/game/Core/Shaders/Deferred/3/Fragment.glsl index 08b7f08..27e9c62 100755 --- a/src/game/Core/Shaders/Deferred/3/Fragment.glsl +++ b/src/game/Core/Shaders/Deferred/3/Fragment.glsl @@ -38,6 +38,7 @@ void main() //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; + frag_Diffuse = DiffuseTexel * (vec4(1.f, 1.f, 1.f, 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/Fragment.glsl b/src/game/Core/Shaders/Forward/Fragment.glsl old mode 100644 new mode 100755 index 83279c0..144062f --- a/src/game/Core/Shaders/Forward/Fragment.glsl +++ b/src/game/Core/Shaders/Forward/Fragment.glsl @@ -84,6 +84,6 @@ void main() vec4 diffuseTexel = texture(DiffuseTexture, Input.TextureCoord); - //FragmentColor = phong(Input.Position, normalize(normal), specularTexel.rgb, specularTexel.a); - FragmentColor = diffuseTexel; + FragmentColor = phong(Input.Position, normalize(normal), specularTexel.rgb, specularTexel.a); + //FragmentColor = diffuseTexel; } \ No newline at end of file diff --git a/src/game/Core/Texture.cpp b/src/game/Core/Texture.cpp index 6e1b7c7..f9ba46e 100755 --- a/src/game/Core/Texture.cpp +++ b/src/game/Core/Texture.cpp @@ -24,7 +24,7 @@ dd::Texture::Texture(std::string path) std::unique_ptr image = std::make_unique(path); if (image->Width == 0 && image->Height == 0 || image->Format == Image::ImageFormat::Unknown) { - image = std::make_unique("Textures/ErrorTexture.png"); + image = std::make_unique("Textures/Core/ErrorTexture.png"); if (image->Width == 0 && image->Height == 0 || image->Format == Image::ImageFormat::Unknown) { LOG_ERROR("Couldn't even load the error texture. This is a dark day indeed."); return;