diff --git a/Escape-the-Dawn/Escape-the-Dawn.vcxproj b/Escape-the-Dawn/Escape-the-Dawn.vcxproj index 07148a6..a0fcc96 100644 --- a/Escape-the-Dawn/Escape-the-Dawn.vcxproj +++ b/Escape-the-Dawn/Escape-the-Dawn.vcxproj @@ -149,6 +149,7 @@ + @@ -165,6 +166,8 @@ + + diff --git a/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters b/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters index 7752005..69c566e 100644 --- a/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters +++ b/Escape-the-Dawn/Escape-the-Dawn.vcxproj.filters @@ -146,6 +146,7 @@ + @@ -154,6 +155,12 @@ Shaders + + Shaders + + + Shaders + diff --git a/Escape-the-Dawn/Model.h b/Escape-the-Dawn/Model.h index cd529fc..716d1c2 100644 --- a/Escape-the-Dawn/Model.h +++ b/Escape-the-Dawn/Model.h @@ -8,11 +8,7 @@ #include #include -#include -#define GLFW_INCLUDE_GLU -#include -#include -#define GLM_FORCE_RADIANS +#include "OpenGL.h" #include #include #include diff --git a/Escape-the-Dawn/OpenGL.h b/Escape-the-Dawn/OpenGL.h new file mode 100644 index 0000000..dec332d --- /dev/null +++ b/Escape-the-Dawn/OpenGL.h @@ -0,0 +1,5 @@ +#include +#define GLFW_INCLUDE_GLU +#include +#include +#define GLM_FORCE_RADIANS \ No newline at end of file diff --git a/Escape-the-Dawn/Renderer.cpp b/Escape-the-Dawn/Renderer.cpp index e6f01cd..617484e 100644 --- a/Escape-the-Dawn/Renderer.cpp +++ b/Escape-the-Dawn/Renderer.cpp @@ -55,7 +55,20 @@ void Renderer::Draw(double dt) glClearColor(1.0f, 1.0f, 0.0f, 1.0f); m_ShaderProgram.Bind(); + DrawModels(); + +#ifdef DEBUG + m_ShaderProgramNormals.Bind(); + DrawModels(); +#endif + ModelsToRender.clear(); + + glfwSwapBuffers(m_Window); +} + +void Renderer::DrawModels() +{ glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix() * m_Camera->ViewMatrix(); glm::mat4 MVP; @@ -73,7 +86,7 @@ void Renderer::Draw(double dt) glUniform1f(glGetUniformLocation(m_ShaderProgram.GetHandle(), "linearAttenuation"), 0.0f); glUniform1f(glGetUniformLocation(m_ShaderProgram.GetHandle(), "quadraticAttenuation"), 0.0f); - + glBindVertexArray(model->VAO); for (auto texGroup : model->TextureGroups) { glActiveTexture(GL_TEXTURE0); @@ -81,9 +94,6 @@ void Renderer::Draw(double dt) glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, (texGroup.EndIndex - texGroup.StartIndex + 1) * abs(sin(glfwGetTime()))); } } - ModelsToRender.clear(); - - glfwSwapBuffers(m_Window); } void Renderer::DrawText() @@ -108,8 +118,20 @@ void Renderer::AddModelToDraw(std::shared_ptr _model, glm::vec3 _position void Renderer::LoadContent() { - m_ShaderProgram.AddShader(std::unique_ptr(new VertexShader("Shaders/Vertex.glsl"))); - m_ShaderProgram.AddShader(std::unique_ptr(new FragmentShader("Shaders/Fragment.glsl"))); + auto standardVS = std::shared_ptr(new VertexShader("Shaders/Vertex.glsl")); + auto standardFS = std::shared_ptr(new FragmentShader("Shaders/Fragment.glsl")); + + auto normalsGS = std::shared_ptr(new GeometryShader("Shaders/Normals.geo.glsl")); + auto normalsFS = std::shared_ptr(new FragmentShader("Shaders/Normals.frag.glsl")); + + m_ShaderProgram.AddShader(standardVS); + m_ShaderProgram.AddShader(standardFS); m_ShaderProgram.Compile(); m_ShaderProgram.Link(); + + m_ShaderProgramNormals.AddShader(normalsGS); + m_ShaderProgramNormals.AddShader(standardVS); + m_ShaderProgramNormals.AddShader(normalsFS); + m_ShaderProgramNormals.Compile(); + m_ShaderProgramNormals.Link(); } diff --git a/Escape-the-Dawn/Renderer.h b/Escape-the-Dawn/Renderer.h index 1077e3b..9dd1c2c 100644 --- a/Escape-the-Dawn/Renderer.h +++ b/Escape-the-Dawn/Renderer.h @@ -7,11 +7,7 @@ #include #include -#include -#define GLFW_INCLUDE_GLU -#include -#include -#define GLM_FORCE_RADIANS +#include "OpenGL.h" #include #include #include @@ -27,7 +23,7 @@ class Renderer { public: - ShaderProgram m_ShaderProgram; + glm::mat4 viewMatrix; glm::mat4 projectionMatrix; @@ -64,7 +60,11 @@ private: std::shared_ptr m_Camera; - GLuint vertexArrayObject; + ShaderProgram m_ShaderProgram; + ShaderProgram m_ShaderProgramNormals; + + void DrawModels(); + }; #endif // Renderer_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/ShaderProgram.cpp b/Escape-the-Dawn/ShaderProgram.cpp index cd08061..d95aeeb 100644 --- a/Escape-the-Dawn/ShaderProgram.cpp +++ b/Escape-the-Dawn/ShaderProgram.cpp @@ -84,18 +84,13 @@ bool Shader::IsCompiled() const return m_ShaderHandle != 0; } -ShaderProgram::ShaderProgram() -{ - Initialize(); -} - ShaderProgram::~ShaderProgram() { Unbind(); glDeleteProgram(m_ShaderProgramHandle); } -void ShaderProgram::AddShader(std::unique_ptr shader) +void ShaderProgram::AddShader(std::shared_ptr shader) { m_Shaders.push_back(std::move(shader)); } @@ -111,6 +106,10 @@ void ShaderProgram::Compile() GLuint ShaderProgram::Link() { + if (m_Shaders.size() == 0) { + LOG_ERROR("Failed to link shader program: No shaders bound"); + } + LOG_INFO("Linking shader program"); m_ShaderProgramHandle = glCreateProgram(); for (auto &shader : m_Shaders) { @@ -119,10 +118,6 @@ GLuint ShaderProgram::Link() glLinkProgram(m_ShaderProgramHandle); if (GLERROR("glLinkProgram")) return 0; - - for (auto &shader : m_Shaders) { - shader.release(); - } m_Shaders.clear(); return m_ShaderProgramHandle; @@ -144,9 +139,4 @@ void ShaderProgram::Bind() void ShaderProgram::Unbind() { glActiveShaderProgram(0, 0); -} - -void ShaderProgram::Initialize() -{ - m_ShaderProgramHandle = 0; -} +} \ No newline at end of file diff --git a/Escape-the-Dawn/ShaderProgram.h b/Escape-the-Dawn/ShaderProgram.h index 894575a..341bb64 100644 --- a/Escape-the-Dawn/ShaderProgram.h +++ b/Escape-the-Dawn/ShaderProgram.h @@ -6,11 +6,7 @@ #include #include -#define _CRT_SECURE_NO_WARNINGS -#include -#define GLFW_INCLUDE_GLU -#include -#include +#include "OpenGL.h" #include "glerror.h" @@ -68,25 +64,20 @@ public: class ShaderProgram { public: - ShaderProgram(); + ShaderProgram() + : m_ShaderProgramHandle(0) { } ~ShaderProgram(); - void AddShader(std::unique_ptr shader); - + void AddShader(std::shared_ptr shader); void Compile(); GLuint Link(); - GLuint GetHandle(); - void Bind(); - void Unbind(); private: GLuint m_ShaderProgramHandle; - std::vector> m_Shaders; - - void Initialize(); + std::vector> m_Shaders; }; #endif // ShaderProgram_h__ \ No newline at end of file diff --git a/Escape-the-Dawn/Shaders/Normals.frag.glsl b/Escape-the-Dawn/Shaders/Normals.frag.glsl new file mode 100644 index 0000000..fd1bb9a --- /dev/null +++ b/Escape-the-Dawn/Shaders/Normals.frag.glsl @@ -0,0 +1,9 @@ +#version 430 + +uniform mat4 MVP; + +out vec4 FragmentColor; + +void main() { + FragmentColor = vec4(1.0, 1.0, 1.0, 1.0); +} \ No newline at end of file diff --git a/Escape-the-Dawn/Shaders/Normals.geo.glsl b/Escape-the-Dawn/Shaders/Normals.geo.glsl new file mode 100644 index 0000000..c848a50 --- /dev/null +++ b/Escape-the-Dawn/Shaders/Normals.geo.glsl @@ -0,0 +1,34 @@ +#version 430 + +uniform mat4 MVP; + +layout(triangles) in; +layout(line_strip, max_vertices = 6) out; + +in VertexData { + vec3 Position; + vec3 Normal; + vec2 TextureCoord; +} Input[3]; + +out VertexData { + vec3 Position; + vec3 Normal; + vec2 TextureCoord; +} Output; + +void main() +{ + for (int i = 0; i < gl_in.length(); i++) + { + gl_Position = MVP * vec4(Input[i].Position, 1.0); + EmitVertex(); + gl_Position = MVP * vec4(Input[i].Position, 1.0) + MVP * vec4(Input[i].Normal, 0.0); + EmitVertex(); + EndPrimitive(); + + Output.Position = Input[i].Position; + Output.Normal = Input[i].Normal; + Output.TextureCoord = Input[i].TextureCoord; + } +} \ No newline at end of file diff --git a/Escape-the-Dawn/Systems/PlayerSystem.h b/Escape-the-Dawn/Systems/PlayerSystem.h index 99efd8b..8058956 100644 --- a/Escape-the-Dawn/Systems/PlayerSystem.h +++ b/Escape-the-Dawn/Systems/PlayerSystem.h @@ -4,7 +4,6 @@ #include #include "System.h" -#include "Renderer.h" #include "Components/Transform.h" #include "Components/Input.h" #include "logging.h" diff --git a/Escape-the-Dawn/Systems/RenderSystem.h b/Escape-the-Dawn/Systems/RenderSystem.h index 3795e04..086a54a 100644 --- a/Escape-the-Dawn/Systems/RenderSystem.h +++ b/Escape-the-Dawn/Systems/RenderSystem.h @@ -1,6 +1,8 @@ #ifndef RenderSystem_h__ #define RenderSystem_h__ +#include + #include "System.h" #include "Model.h" #include "Texture.h" @@ -8,7 +10,6 @@ #include "Components/Transform.h" #include "Components/Camera.h" #include "Renderer.h" -#include namespace Systems { diff --git a/Escape-the-Dawn/Texture.h b/Escape-the-Dawn/Texture.h index ba77847..f24cb2f 100644 --- a/Escape-the-Dawn/Texture.h +++ b/Escape-the-Dawn/Texture.h @@ -3,10 +3,7 @@ #include -#include -#define GLFW_INCLUDE_GLU -#include -#include +#include "OpenGL.h" #include class Texture diff --git a/Escape-the-Dawn/World.h b/Escape-the-Dawn/World.h index 0e1a652..009c768 100644 --- a/Escape-the-Dawn/World.h +++ b/Escape-the-Dawn/World.h @@ -6,6 +6,7 @@ #include #include #include +#include #include