From cbf8da808eba128e4a1f624af7a76565a3eb973d Mon Sep 17 00:00:00 2001 From: Hopson97 Date: Tue, 25 Jul 2017 14:50:49 +0100 Subject: [PATCH] Episode 27 - Chunk Renderer and Shader --- Data/Shaders/Chunk_Fragment.glsl | 14 ++++++++++++++ Data/Shaders/Chunk_Vertex.glsl | 18 ++++++++++++++++++ Minecraft Tutorial.cbp | 5 +++++ Source/Renderer/RChunk.cpp | 28 ++++++++++++++++++++++++++++ Source/Renderer/RChunk.h | 32 ++++++++++++++++++++++++++++++++ Source/Renderer/RMaster.cpp | 7 +++++++ Source/Renderer/RMaster.h | 3 +++ Source/Shaders/Chunk_Shader.cpp | 13 +++++++++++++ Source/Shaders/Chunk_Shader.h | 18 ++++++++++++++++++ Source/Shaders/Simple_Shader.cpp | 6 +++--- Source/Shaders/Simple_Shader.h | 9 ++++++--- Source/States/Game_State.h | 1 + 12 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 Data/Shaders/Chunk_Fragment.glsl create mode 100644 Data/Shaders/Chunk_Vertex.glsl create mode 100644 Source/Renderer/RChunk.cpp create mode 100644 Source/Renderer/RChunk.h create mode 100644 Source/Shaders/Chunk_Shader.cpp create mode 100644 Source/Shaders/Chunk_Shader.h diff --git a/Data/Shaders/Chunk_Fragment.glsl b/Data/Shaders/Chunk_Fragment.glsl new file mode 100644 index 0000000..315740d --- /dev/null +++ b/Data/Shaders/Chunk_Fragment.glsl @@ -0,0 +1,14 @@ +#version 330 + +out vec4 colour; + +in vec2 passTextureCoords; + +uniform sampler2D ourTexture; + +uniform float time; + +void main() +{ + colour = texture(ourTexture, passTextureCoords); +} diff --git a/Data/Shaders/Chunk_Vertex.glsl b/Data/Shaders/Chunk_Vertex.glsl new file mode 100644 index 0000000..d0b59ae --- /dev/null +++ b/Data/Shaders/Chunk_Vertex.glsl @@ -0,0 +1,18 @@ +#version 330 + +layout (location = 0) in vec3 inVertexPosition; +layout (location = 1) in vec2 inTextureCoords; + +out vec2 passTextureCoords; + +uniform mat4 viewMatrix; +uniform mat4 projMatrix; + +void main() +{ + gl_Position = projMatrix * viewMatrix * + vec4 (inVertexPosition.xyz, + 1.0); + + passTextureCoords = inTextureCoords; +} diff --git a/Minecraft Tutorial.cbp b/Minecraft Tutorial.cbp index 5be6224..60c4427 100644 --- a/Minecraft Tutorial.cbp +++ b/Minecraft Tutorial.cbp @@ -55,6 +55,8 @@ + + @@ -67,10 +69,13 @@ + + + diff --git a/Source/Renderer/RChunk.cpp b/Source/Renderer/RChunk.cpp new file mode 100644 index 0000000..b9a5b8a --- /dev/null +++ b/Source/Renderer/RChunk.cpp @@ -0,0 +1,28 @@ +#include "RChunk.h" + +#include "../Camera.h" +#include "../World/Chunk/Chunk_Section.h" + +namespace Renderer +{ + void Chunk_Renderer::draw(const Chunk::Chunk_Section& chunk) + { + m_chunks.push_back(&chunk); + } + + void Chunk_Renderer::update(const Camera& camera) + { + m_shader.bind(); + + m_shader.setViewMatrix(camera.getViewMatrix()); + m_shader.setProjMatrix(camera.getProjectionMatrix()); + + for (auto& chunk : m_chunks) + { + + } + + m_chunks.clear(); + } + +} diff --git a/Source/Renderer/RChunk.h b/Source/Renderer/RChunk.h new file mode 100644 index 0000000..bb14cf6 --- /dev/null +++ b/Source/Renderer/RChunk.h @@ -0,0 +1,32 @@ +#ifndef RCHUNK_H_INCLUDED +#define RCHUNK_H_INCLUDED + +#include +#include + +#include "../Shaders/Chunk_Shader.h" + +namespace Chunk +{ + class Chunk_Section; +} + +struct Camera; + +namespace Renderer +{ + class Chunk_Renderer + { + public: + void draw (const Chunk::Chunk_Section& chunk); + + void update(const Camera& camera); + + private: + std::vector m_chunks; + + Shader::Chunk_Shader m_shader; + }; +} + +#endif // RCHUNK_H_INCLUDED diff --git a/Source/Renderer/RMaster.cpp b/Source/Renderer/RMaster.cpp index db3ee35..21e9062 100644 --- a/Source/Renderer/RMaster.cpp +++ b/Source/Renderer/RMaster.cpp @@ -12,6 +12,7 @@ namespace Renderer void Master::update(const Camera& camera) { m_simpleRenderer.update(camera); + m_chunkRenderer.update(camera); Display::get().update(); } @@ -21,4 +22,10 @@ namespace Renderer m_simpleRenderer.draw(model); } + void Master::draw(const Chunk::Chunk_Section& chunk) + { + m_chunkRenderer.draw(chunk); + } + + } diff --git a/Source/Renderer/RMaster.h b/Source/Renderer/RMaster.h index 2e82d94..62d5429 100644 --- a/Source/Renderer/RMaster.h +++ b/Source/Renderer/RMaster.h @@ -2,6 +2,7 @@ #define MASTER_H_INCLUDED #include "RSimple.h" +#include "RChunk.h" class Quad; struct Camera; @@ -16,9 +17,11 @@ namespace Renderer void update(const Camera& camera); void draw(const Quad& model); + void draw(const Chunk::Chunk_Section& model); private: Simple m_simpleRenderer; + Chunk_Renderer m_chunkRenderer; }; } diff --git a/Source/Shaders/Chunk_Shader.cpp b/Source/Shaders/Chunk_Shader.cpp new file mode 100644 index 0000000..2e705d0 --- /dev/null +++ b/Source/Shaders/Chunk_Shader.cpp @@ -0,0 +1,13 @@ +#include "Chunk_Shader.h" + +namespace Shader +{ + Chunk_Shader::Chunk_Shader() + : Simple_Shader ("Chunk_Vertex", "Chunk_Fragment") + { + getUniformLocations(); + } + + void Chunk_Shader::getUniformLocations() + { } +} diff --git a/Source/Shaders/Chunk_Shader.h b/Source/Shaders/Chunk_Shader.h new file mode 100644 index 0000000..1ce6b99 --- /dev/null +++ b/Source/Shaders/Chunk_Shader.h @@ -0,0 +1,18 @@ +#ifndef CHUNK_SHADER_H_INCLUDED +#define CHUNK_SHADER_H_INCLUDED + +#include "Simple_Shader.h" + +namespace Shader +{ + class Chunk_Shader : public Simple_Shader + { + public: + Chunk_Shader(); + + private: + void getUniformLocations() override; + }; +} + +#endif // CHUNK_SHADER_H_INCLUDED diff --git a/Source/Shaders/Simple_Shader.cpp b/Source/Shaders/Simple_Shader.cpp index 1b970a3..5c17cc9 100644 --- a/Source/Shaders/Simple_Shader.cpp +++ b/Source/Shaders/Simple_Shader.cpp @@ -4,8 +4,9 @@ namespace Shader { - Simple_Shader::Simple_Shader() - : Shader_Program ("Simple_Vertex", "Simple_Fragment") + Simple_Shader::Simple_Shader(const std::string& vertexFile, + const std::string& fragmentFile) + : Shader_Program (vertexFile, fragmentFile) { getUniformLocations(); } @@ -38,7 +39,6 @@ namespace Shader m_locationViewMatrix = glGetUniformLocation(getID(), "viewMatrix"); m_locationModelMatrix = glGetUniformLocation(getID(), "modelMatrix"); m_locationProjMatrix = glGetUniformLocation(getID(), "projMatrix"); - } } diff --git a/Source/Shaders/Simple_Shader.h b/Source/Shaders/Simple_Shader.h index 75880f6..d14104c 100644 --- a/Source/Shaders/Simple_Shader.h +++ b/Source/Shaders/Simple_Shader.h @@ -8,7 +8,8 @@ namespace Shader class Simple_Shader : public Shader_Program { public: - Simple_Shader(); + Simple_Shader(const std::string& vertexFile = "Simple_Vertex", + const std::string& fragmentFile = "Simple_Fragment"); void setTime(float time); @@ -16,9 +17,11 @@ namespace Shader void setModelMatrix (const Matrix4& matrix); void setProjMatrix (const Matrix4& matrix); - private: - void getUniformLocations() override; + protected: + virtual void getUniformLocations() override; + + private: GLuint m_locationTime = 0; GLuint m_locationViewMatrix = 0; GLuint m_locationModelMatrix = 0; diff --git a/Source/States/Game_State.h b/Source/States/Game_State.h index db16350..0f04386 100644 --- a/Source/States/Game_State.h +++ b/Source/States/Game_State.h @@ -15,6 +15,7 @@ namespace State { public: Game_State(Application& application); + virtual ~Game_State() = default; virtual void input (Camera& camera) = 0; virtual void update (Camera& camera, float dt) = 0;