diff --git a/Escape-the-Dawn/Escape-the-Dawn.vcxproj b/Escape-the-Dawn/Escape-the-Dawn.vcxproj index 8a6c3db..cb14255 100644 --- a/Escape-the-Dawn/Escape-the-Dawn.vcxproj +++ b/Escape-the-Dawn/Escape-the-Dawn.vcxproj @@ -166,6 +166,7 @@ + diff --git a/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters b/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters index da3ea10..94202f3 100644 --- a/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters +++ b/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters @@ -176,6 +176,9 @@ Shaders + + Shaders + diff --git a/Escape-the-Dawn/GameWorld.cpp b/Escape-the-Dawn/GameWorld.cpp index 4569985..278761c 100644 --- a/Escape-the-Dawn/GameWorld.cpp +++ b/Escape-the-Dawn/GameWorld.cpp @@ -79,22 +79,25 @@ void GameWorld::Initialize() //ground ent = CreateEntity(); transform = AddComponent(ent, "Transform"); - transform->Position = glm::vec3(0.f, -4.f, 0.f); + transform->Position = glm::vec3(0.f, 0.f, 0.f); model = AddComponent(ent, "Model"); model->ModelFile = "plane.obj"; // Player - ent = CreateEntity(); - SetProperty(ent, "Name", std::string("PlayerShip")); - transform = AddComponent(ent, "Transform"); - transform->Position = glm::vec3(0.f, 0.f, 0.f); - model = AddComponent(ent, "Model"); + m_Player = CreateEntity(); + SetProperty(m_Player, "Name", std::string("PlayerShip")); + transform = AddComponent(m_Player, "Transform"); + transform->Position = glm::vec3(0.f, 4.f, 0.f); + model = AddComponent(m_Player, "Model"); model->ModelFile = "ship.obj"; - AddComponent(ent, "Input"); + AddComponent(m_Player, "Input"); + auto bounds = AddComponent(m_Player, "Bounds"); + bounds->Origin = glm::vec3(0.f); + bounds->VolumeVector = glm::vec3(1.0f, 2.0f, 3.0f); ent = CreateEntity(); transform = AddComponent(ent, "Transform"); - transform->Position = glm::vec3(10.f, 0.f, 0.f); + transform->Position = glm::vec3(10.f, 4.f, 0.f); model = AddComponent(ent, "Model"); model->ModelFile = "ship.obj"; } diff --git a/Escape-the-Dawn/GameWorld.h b/Escape-the-Dawn/GameWorld.h index 49ff95a..d797ca9 100644 --- a/Escape-the-Dawn/GameWorld.h +++ b/Escape-the-Dawn/GameWorld.h @@ -42,6 +42,8 @@ public: private: std::shared_ptr m_Renderer; + + EntityID m_Player; }; #endif // GameWorld_h__ diff --git a/Escape-the-Dawn/Renderer.cpp b/Escape-the-Dawn/Renderer.cpp index bffbaae..1c5aa20 100644 --- a/Escape-the-Dawn/Renderer.cpp +++ b/Escape-the-Dawn/Renderer.cpp @@ -7,7 +7,7 @@ Renderer::Renderer() m_DrawWireframe = false; m_SunPosition = glm::vec3(0, 10, 10); - m_SunTarget = glm::vec3(0); + m_SunTarget = glm::vec3(0, 0, 0); m_SunProjection = glm::ortho(-20, 20, -20, 20, -10, 20); } @@ -85,6 +85,12 @@ void Renderer::LoadContent() m_ShaderProgramShadowsDrawDepth.Compile(); m_ShaderProgramShadowsDrawDepth.Link(); + m_ShaderProgramDebugAABB.AddShader(standardVS); + m_ShaderProgramDebugAABB.AddShader(std::shared_ptr(new FragmentShader("Shaders/AABB.frag.glsl"))); + m_ShaderProgramDebugAABB.Compile(); + m_ShaderProgramDebugAABB.Link(); + + m_DebugAABB = CreateAABB(); m_ScreenQuad = CreateQuad(); CreateShadowMap(2048*2); } @@ -116,9 +122,25 @@ void Renderer::CreateShadowMap(int resolution) } void Renderer::Draw(double dt) { + glDisable(GL_BLEND); + DrawShadowMap(); DrawScene(); +#ifdef DEBUG + glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); + m_ShaderProgramDebugAABB.Bind(); + for (auto aabbModelMatrix : AABBsToRender) { + glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix(); + glm::mat4 MVP = cameraMatrix * aabbModelMatrix; + glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgramDebugAABB.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glBindVertexArray(m_DebugAABB); + glDrawArrays(GL_LINES, 0, 24); + } + AABBsToRender.clear(); +#endif + DrawDebugShadowMap(); ModelsToRender.clear(); @@ -336,4 +358,63 @@ GLuint Renderer::CreateQuad() glBindBuffer(GL_ARRAY_BUFFER, 0); return vao; -} \ No newline at end of file +} + +GLuint Renderer::CreateAABB() +{ + float vertices[] = { + // Bottom + -1.0f, -1.0f, 1.0f, // 0 + 1.0f, -1.0f, 1.0f, // 1 + 1.0f, -1.0f, 1.0f, // 1 + 1.0f, -1.0f, -1.0f, // 2 + 1.0f, -1.0f, -1.0f, // 2 + -1.0f, -1.0f, -1.0f, // 3 + -1.0f, -1.0f, -1.0f, // 3 + -1.0f, -1.0f, 1.0f, // 0 + + // Top + -1.0f, 1.0f, 1.0f, // 4 + 1.0f, 1.0f, 1.0f, // 5 + 1.0f, 1.0f, 1.0f, // 5 + 1.0f, 1.0f, -1.0f, // 6 + 1.0f, 1.0f, -1.0f, // 6 + -1.0f, 1.0f, -1.0f, // 7 + -1.0f, 1.0f, -1.0f, // 7 + -1.0f, 1.0f, 1.0f, // 4 + + // Connectors + -1.0f, -1.0f, 1.0f, // 0 + -1.0f, 1.0f, 1.0f, // 4 + 1.0f, -1.0f, 1.0f, // 1 + 1.0f, 1.0f, 1.0f, // 5 + 1.0f, -1.0f, -1.0f, // 2 + 1.0f, 1.0f, -1.0f, // 6 + -1.0f, -1.0f, -1.0f, // 3 + -1.0f, 1.0f, -1.0f, // 7 + }; + + GLuint vbo, vao; + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(0); + + glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + return vao; +} + +void Renderer::AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector) +{ + glm::mat4 model; + model *= glm::translate(origin); + model *= glm::scale(volumeVector); + AABBsToRender.push_back(model); +} diff --git a/Escape-the-Dawn/Renderer.h b/Escape-the-Dawn/Renderer.h index 7fcca0d..7ec2264 100644 --- a/Escape-the-Dawn/Renderer.h +++ b/Escape-the-Dawn/Renderer.h @@ -46,6 +46,7 @@ public: std::vector Light_linearAttenuation; std::vector Light_quadraticAttenuation; std::vector Light_spotExponent; + std::vector AABBsToRender; Renderer(); @@ -64,6 +65,7 @@ public: float _quadraticAttenuation, float _spotExponent ); + void AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector); void LoadContent(); @@ -87,6 +89,7 @@ private: glm::vec3 m_SunTarget; glm::mat4 m_SunProjection; + GLuint m_DebugAABB; GLuint m_ScreenQuad; GLuint m_ShadowFrameBuffer; GLuint m_ShadowDepthTexture; @@ -97,6 +100,7 @@ private: ShaderProgram m_ShaderProgramNormals; ShaderProgram m_ShaderProgramShadows; ShaderProgram m_ShaderProgramShadowsDrawDepth; + ShaderProgram m_ShaderProgramDebugAABB; void DrawScene(); void DrawModels(ShaderProgram &shader); @@ -104,6 +108,7 @@ private: void CreateShadowMap(int resolution); GLuint CreateQuad(); void DrawDebugShadowMap(); + GLuint CreateAABB(); }; diff --git a/Escape-the-Dawn/Shaders/AABB.frag.glsl b/Escape-the-Dawn/Shaders/AABB.frag.glsl new file mode 100644 index 0000000..00cb7ab --- /dev/null +++ b/Escape-the-Dawn/Shaders/AABB.frag.glsl @@ -0,0 +1,15 @@ +#version 430 + +in VertexData { + vec3 Position; + vec3 Normal; + vec2 TextureCoord; + vec3 ShadowCoord; +} Input; + +out vec4 FragmentColor; + +void main() { + //FragmentColor = vec4(1.0 - gl_Color.r, 1.0 - gl_Color.g, 1.0 - gl_Color.b, 0.0); + FragmentColor = vec4(1.0, 1.0, 1.0, 1.0); +} \ No newline at end of file diff --git a/Escape-the-Dawn/Systems/PlayerSystem.cpp b/Escape-the-Dawn/Systems/PlayerSystem.cpp index ef28f37..361f33a 100644 --- a/Escape-the-Dawn/Systems/PlayerSystem.cpp +++ b/Escape-the-Dawn/Systems/PlayerSystem.cpp @@ -5,11 +5,8 @@ Systems::PlayerSystem::PlayerSystem( World* world ) : System(world) { } - - void Systems::PlayerSystem::Update(double dt) { - } void Systems::PlayerSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -100,8 +97,6 @@ void Systems::PlayerSystem::UpdateEntity(double dt, EntityID entity, EntityID pa else if(Euler.z > 0.f) transform->Orientation = transform->Orientation * glm::angleAxis((float)dt,glm::vec3(0,0,-1)); } - - } } diff --git a/Escape-the-Dawn/Systems/RenderSystem.cpp b/Escape-the-Dawn/Systems/RenderSystem.cpp index 8a7681a..1c3fb20 100644 --- a/Escape-the-Dawn/Systems/RenderSystem.cpp +++ b/Escape-the-Dawn/Systems/RenderSystem.cpp @@ -27,10 +27,19 @@ void Systems::RenderSystem::UpdateEntity( double dt, EntityID entity, EntityID p auto model = m_CachedModels[modelComponent->ModelFile]; m_Renderer->AddModelToDraw(model, transformComponent->Position, transformComponent->Orientation); } + + // Debug draw bounds +#ifdef DEBUG + auto bounds = m_World->GetComponent(entity, "Bounds"); + if (bounds != nullptr) { + glm::vec3 origin = transformComponent->Position + bounds->Origin; + m_Renderer->AddAABBToDraw(origin, bounds->VolumeVector); + } +#endif + auto pointLightComponent = m_World->GetComponent(entity, "PointLight"); if (pointLightComponent != nullptr) { - m_Renderer->AddPointLightToDraw( transformComponent->Position, pointLightComponent->Specular, diff --git a/Escape-the-Dawn/Systems/RenderSystem.h b/Escape-the-Dawn/Systems/RenderSystem.h index dc3f15b..b63ec05 100644 --- a/Escape-the-Dawn/Systems/RenderSystem.h +++ b/Escape-the-Dawn/Systems/RenderSystem.h @@ -9,6 +9,7 @@ #include "Components/Model.h" #include "Components/Transform.h" #include "Components/Camera.h" +#include "Components/Bounds.h" #include "Renderer.h" namespace Systems diff --git a/Escape-the-Dawn/plane.obj b/Escape-the-Dawn/plane.obj index 82c648c..e266edb 100644 --- a/Escape-the-Dawn/plane.obj +++ b/Escape-the-Dawn/plane.obj @@ -1,17 +1,14 @@ -# Blender v2.69 (sub 0) OBJ File: 'obstaclesandstuff.blend' -# www.blender.org mtllib plane.mtl -o Plane_Plane.001 -v 102.461288 0.778257 97.553291 -v -97.538712 0.778257 97.553291 -v 102.461288 0.778257 -102.446709 -v -97.538712 0.778257 -102.446709 -vt 0.000100 0.000100 -vt 0.999900 0.000100 -vt 0.000100 0.999900 -vt 0.999900 0.999900 +o Plane +v -1000 0 1000 +v 1000 0 1000 +v 1000 0 -1000 +v -1000 0 -1000 vn 0.000000 1.000000 0.000000 +vt 0 0 +vt 1 0 +vt 1 1 +vt 0 1 usemtl Material.001 -s off -f 2/1/1 1/2/1 4/3/1 -f 1/2/1 3/4/1 4/3/1 +f 1/1/1 3/3/1 4/4/1 +f 1/1/1 2/2/1 3/3/1