From 33735ef2e803b75d0aab6c5f1e8460c5cad503f0 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 6 Oct 2019 20:23:41 +0100 Subject: [PATCH] Well faces kinda render --- resources/shaders/simple.frag | 9 +- resources/shaders/simple.vert | 6 +- src/common.hpp | 1 + src/game.cpp | 25 +++-- src/renderer/camera.hpp | 4 +- src/renderer/face.cpp | 193 ++++++++++++++++++---------------- src/renderer/face.hpp | 9 +- src/renderer/renderer.cpp | 8 +- src/renderer/renderer.hpp | 4 +- src/renderer/shader.cpp | 18 ++-- src/renderer/shader.hpp | 2 +- src/renderer/voxel.cpp | 0 src/renderer/voxel.hpp | 0 src/world/world.hpp | 2 + 14 files changed, 159 insertions(+), 122 deletions(-) create mode 100644 src/renderer/voxel.cpp create mode 100644 src/renderer/voxel.hpp diff --git a/resources/shaders/simple.frag b/resources/shaders/simple.frag index 9ce4bb4..3c768fb 100644 --- a/resources/shaders/simple.frag +++ b/resources/shaders/simple.frag @@ -1,12 +1,11 @@ #version 330 -in vec2 TexCoord; +in vec3 TexCoord; + out vec4 outColour; -uniform vec3 triangleColour; - -uniform sampler2D tex; +// uniform sampler2D tex; void main() { - outColour = texture(tex, TexCoord); + outColour = vec4(TexCoord, 1.0); // texture(tex, TexCoord); } diff --git a/resources/shaders/simple.vert b/resources/shaders/simple.vert index 6e080eb..862f199 100644 --- a/resources/shaders/simple.vert +++ b/resources/shaders/simple.vert @@ -1,9 +1,9 @@ #version 330 -in vec3 position; -in vec2 texcoord; +layout (location = 0) in vec3 position; +layout (location = 1) in vec3 texcoord; -out vec2 TexCoord; +out vec3 TexCoord; uniform mat4 model; uniform mat4 view; diff --git a/src/common.hpp b/src/common.hpp index 3325660..75797c5 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #if _WIN32 #include diff --git a/src/game.cpp b/src/game.cpp index 1534d02..7644833 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -4,6 +4,7 @@ #include #include "renderer/renderer.hpp" +#include "renderer/shader.hpp" #include "renderer/camera.hpp" #include "renderer/face.hpp" @@ -56,8 +57,8 @@ void Game::Setup(int w, int h) { *m_logger << LOGGER_INFO << "Creating OpenGL context" << LOGGER_ENDL; m_glContext = SDL_GL_CreateContext(m_window); - //SDL_WarpMouseInWindow(m_window, w / 2, h / 2); - //SDL_SetRelativeMouseMode(SDL_TRUE); + SDL_WarpMouseInWindow(m_window, w / 2, h / 2); + SDL_SetRelativeMouseMode(SDL_TRUE); // Set VSYNC swap interval SDL_GL_SetSwapInterval(1); @@ -70,7 +71,7 @@ void Game::Setup(int w, int h) { glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); - + //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); #ifdef __IMGUI IMGUI_CHECKVERSION(); @@ -109,12 +110,13 @@ void Game::Setup(int w, int h) { void Game::Input(SDL_Event* e) { - while (SDL_PollEvent(e)) + while (SDL_PollEvent(e)) { + m_activeCamera->HandleMouse(*e); if (e->type == SDL_QUIT) IsDisplayOpen = false; + } m_activeCamera->MoveCamera(); - m_activeCamera->HandleMouse(*e); } @@ -123,12 +125,20 @@ void Game::Run() { SDL_Event e; const float clear[] = { 0.1f, 0.45f, 0.9f, 1.0f }; - glClearBufferfv(GL_COLOR, 0, clear); m_renderer = std::make_unique(); m_world = std::make_unique(); m_world->Faces.push_back(std::make_shared(FaceDirection::Top, 1)); + m_world->Faces.push_back(std::make_shared(FaceDirection::Bottom, 1)); + m_world->Faces.push_back(std::make_shared(FaceDirection::Right, 1)); + m_world->Faces.push_back(std::make_shared(FaceDirection::Left, 1)); + m_world->Faces.push_back(std::make_shared(FaceDirection::Front, 1)); + m_world->Faces.push_back(std::make_shared(FaceDirection::Back, 1)); + + m_world->Shaders["Basic"] = std::make_shared(); + m_world->Shaders["Basic"]->Load("E:/Games/minecraft/resources/shaders/simple"); + m_world->Shaders["Basic"]->Link(); while (IsDisplayOpen) { @@ -142,7 +152,8 @@ void Game::Run() { if (ImGui::Button("Save")) {} ImGui::End(); #endif - glClear(GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClearBufferfv(GL_COLOR, 0, clear); m_renderer->Render(m_world , m_activeCamera); diff --git a/src/renderer/camera.hpp b/src/renderer/camera.hpp index bb1ecc5..0039c89 100644 --- a/src/renderer/camera.hpp +++ b/src/renderer/camera.hpp @@ -15,8 +15,8 @@ public: void MoveCamera(); void MouseMoved(glm::vec2 mouseDelta); - float MouseSensitivity = 0.0025f; - float CameraSpeed = 1.0f; + float MouseSensitivity = 0.0009f; + float CameraSpeed = 0.1f; private: float roll, pitch, yaw; diff --git a/src/renderer/face.cpp b/src/renderer/face.cpp index 8c10eca..0af23cf 100644 --- a/src/renderer/face.cpp +++ b/src/renderer/face.cpp @@ -1,5 +1,8 @@ #include "face.hpp" +#include "shader.hpp" +#include "camera.hpp" + Face::Face(FaceDirection direction, int textureID) { Direction = direction; Texture = textureID; @@ -13,106 +16,116 @@ Face::Face(FaceDirection direction, int textureID) { { 0.0f, 0.0f } }; - switch (Direction) {case FaceDirection::Top: - { + if (Direction == FaceDirection::Top) { + m_verticies = { + { -0.5f, -0.5f, -0.5f }, + { 0.5f, -0.5f, -0.5f }, + { 0.5f, 0.5f, -0.5f }, + { 0.5f, 0.5f, -0.5f }, + { -0.5f, 0.5f, -0.5f }, + { -0.5f, -0.5f, -0.5f }, + }; + } + else if (Direction == FaceDirection::Bottom) { + m_verticies = { + { -0.5f, -0.5f, 0.5f }, + { 0.5f, -0.5f, 0.5f }, + { 0.5f, 0.5f, 0.5f }, + { 0.5f, 0.5f, 0.5f }, + { -0.5f, 0.5f, 0.5f }, + { -0.5f, -0.5f, 0.5f }, + }; + } + else if (Direction == FaceDirection::Front) { + m_verticies = { + { -0.5f, 0.5f, 0.5f }, + { -0.5f, 0.5f, -0.5f }, + { -0.5f, -0.5f, -0.5f }, + { -0.5f, -0.5f, -0.5f }, + { -0.5f, -0.5f, 0.5f }, + { -0.5f, 0.5f, 0.5f }, + }; + } + else if (Direction == FaceDirection::Back) { + m_verticies = { + { 0.5f, 0.5f, 0.5f }, + { 0.5f, 0.5f, -0.5f }, + { 0.5f, -0.5f, -0.5f }, + { 0.5f, -0.5f, -0.5f }, + { 0.5f, -0.5f, 0.5f }, + { 0.5f, 0.5f, 0.5f }, + }; + } + else if (Direction == FaceDirection::Left) { + m_verticies = { + { -0.5f, -0.5f, -0.5f }, + { 0.5f, -0.5f, -0.5f }, + { 0.5f, -0.5f, 0.5f }, + { 0.5f, -0.5f, 0.5f }, + { -0.5f, -0.5f, 0.5f }, + { -0.5f, -0.5f, -0.5f }, + }; + } else if (Direction == FaceDirection::Right) { + m_verticies = { + { -0.5f, 0.5f, -0.5f }, + { 0.5f, 0.5f, -0.5f }, + { 0.5f, 0.5f, 0.5f }, + { 0.5f, 0.5f, 0.5f }, + { -0.5f, 0.5f, 0.5f }, + { -0.5f, 0.5f, -0.5f }, + }; + } + + glGenVertexArrays(1, &m_vao); + glBindVertexArray(m_vao); - m_verticies = { - { -0.5f, -0.5f, -0.5f }, - { 0.5f, -0.5f, -0.5f }, - { 0.5f, 0.5f, -0.5f }, - { 0.5f, 0.5f, -0.5f }, - { -0.5f, 0.5f, -0.5f }, - { -0.5f, -0.5f, -0.5f }, - }; + glGenBuffers(1, &m_vbo); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); - break; + std::vector uvs; + + for (auto& uv : m_uvs) { + uvs.push_back({ uv.x, uv.y, textureID }); + } - } + std::vector data; + data.insert(data.end(), m_verticies.begin(), m_verticies.end()); + data.insert(data.end(), uvs.begin(), uvs.end()); - case FaceDirection::Bottom: - { + glBufferData(GL_ARRAY_BUFFER, data.size() * sizeof(glm::vec3), &data[0], GL_STATIC_DRAW); - m_verticies = { - { -0.5f, -0.5f, 0.5f }, - { 0.5f, -0.5f, 0.5f }, - { 0.5f, 0.5f, 0.5f }, - { 0.5f, 0.5f, 0.5f }, - { -0.5f, 0.5f, 0.5f }, - { -0.5f, -0.5f, 0.5f }, - }; + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (const void*)0); - break; + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (const void*)(m_verticies.size() * sizeof(glm::vec3))); - } - - case FaceDirection::Front: - { - - m_verticies = { - { -0.5f, 0.5f, 0.5f }, - { -0.5f, 0.5f, -0.5f }, - { -0.5f, -0.5f, -0.5f }, - { -0.5f, -0.5f, -0.5f }, - { -0.5f, -0.5f, 0.5f }, - { -0.5f, 0.5f, 0.5f }, - }; - - break; - - } - - case FaceDirection::Back: - { - - m_verticies = { - { 0.5f, 0.5f, 0.5f }, - { 0.5f, 0.5f, -0.5f }, - { 0.5f, -0.5f, -0.5f }, - { 0.5f, -0.5f, -0.5f }, - { 0.5f, -0.5f, 0.5f }, - { 0.5f, 0.5f, 0.5f }, - }; - - break; - - } - - case FaceDirection::Left: - { - - m_verticies = { - { -0.5f, -0.5f, -0.5f }, - { 0.5f, -0.5f, -0.5f }, - { 0.5f, -0.5f, 0.5f }, - { 0.5f, -0.5f, 0.5f }, - { -0.5f, -0.5f, 0.5f }, - { -0.5f, -0.5f, -0.5f }, - }; - - break; - - } - - case FaceDirection::Right: - { - - m_verticies = { - { -0.5f, 0.5f, -0.5f }, - { 0.5f, 0.5f, -0.5f }, - { 0.5f, 0.5f, 0.5f }, - { 0.5f, 0.5f, 0.5f }, - { -0.5f, 0.5f, 0.5f }, - { -0.5f, 0.5f, -0.5f }, - }; - - break; - - } - - }; + glBindVertexArray(1); } void Face::GetMesh(std::vector& verts, std::vector& uvs) { } + +void Face::Render(std::shared_ptr camera, std::shared_ptr shader) { + + shader->Use(); + + glm::mat4 model = glm::mat4(1.0f); + GLint uniTrans = glGetUniformLocation(shader->Program, "model"); + glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(model)); + + GLint uniView = glGetUniformLocation(shader->Program, "view"); + glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(camera->GetViewMatrix())); + + // Projection matrice + glm::mat4 proj = glm::perspective(glm::radians(45.0f), 1080.0f / 720.0f, 1.0f, 1000.0f); + // Get uniform and send it to the GPU + GLint uniProj = glGetUniformLocation(shader->Program, "proj"); + glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(proj)); + + + glDrawArrays(GL_TRIANGLES, 0, m_verticies.size()); + +} diff --git a/src/renderer/face.hpp b/src/renderer/face.hpp index 2c66f79..949f56d 100644 --- a/src/renderer/face.hpp +++ b/src/renderer/face.hpp @@ -3,6 +3,9 @@ #include "../common.hpp" +class Camera; +class Shader; + enum FaceDirection { Top, Bottom, @@ -17,16 +20,20 @@ public: Face(FaceDirection direction, int textureID); void GetMesh(std::vector& verts, std::vector& uvs); + void Render(std::shared_ptr camera, std::shared_ptr shader); int Texture = 0; - FaceDirection Direction = FaceDirection::Up; + FaceDirection Direction = FaceDirection::Top; private: std::vector m_verticies; std::vector m_uvs; + GLuint m_vao; + GLuint m_vbo; + }; #endif diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp index 42d373b..8685e81 100644 --- a/src/renderer/renderer.cpp +++ b/src/renderer/renderer.cpp @@ -1,5 +1,9 @@ #include "renderer.hpp" +#include "../world/world.hpp" +#include "shader.hpp" +#include "face.hpp" + Renderer::Renderer() { } @@ -7,6 +11,8 @@ Renderer::Renderer() { // Perform the render passes void Renderer::Render(std::shared_ptr world, std::shared_ptr camera) { - + for (int i = 0; i < world->Faces.size(); i++) { + world->Faces[i]->Render(camera, world->Shaders["Basic"]); + } } diff --git a/src/renderer/renderer.hpp b/src/renderer/renderer.hpp index c24dcf9..1ad3151 100644 --- a/src/renderer/renderer.hpp +++ b/src/renderer/renderer.hpp @@ -3,8 +3,8 @@ #include "../common.hpp" -#include "../world/world.hpp" -#include "camera.hpp" +class Camera; +class World; // Does GL render passes then returns to the game loop class Renderer { diff --git a/src/renderer/shader.cpp b/src/renderer/shader.cpp index 7308060..c5ae645 100644 --- a/src/renderer/shader.cpp +++ b/src/renderer/shader.cpp @@ -3,7 +3,7 @@ Shader::Shader() : m_fileReader() { - m_program = 0; + Program = 0; m_frag = 0; m_vert = 0; @@ -23,8 +23,6 @@ void Shader::Load(std::string path) { Load(fragmentLocation, GL_FRAGMENT_SHADER); *m_logger << LOGGER_INFO << "Fragment shader at '" << fragmentLocation << "' loaded..." << LOGGER_ENDL; - Link(); - } @@ -63,23 +61,23 @@ void Shader::Link() { *m_logger << LOGGER_INFO << "Fragment shader '" << m_frag << "' compiled..." << LOGGER_ENDL; } - m_program = glCreateProgram(); + Program = glCreateProgram(); - glAttachShader(m_program, m_vert); - glAttachShader(m_program, m_frag); + glAttachShader(Program, m_vert); + glAttachShader(Program, m_frag); - glLinkProgram(m_program); + glLinkProgram(Program); glDeleteShader(m_vert); glDeleteShader(m_frag); - *m_logger << LOGGER_INFO << "Program '" << m_program << "' loaded..." << LOGGER_ENDL; + *m_logger << LOGGER_INFO << "Program '" << Program << "' loaded..." << LOGGER_ENDL; } void Shader::Use() { - glUseProgram(m_program); + glUseProgram(Program); } @@ -104,7 +102,7 @@ bool Shader::m_CheckShader(GLuint uid) { Shader::~Shader() { - glDeleteProgram(m_program); + glDeleteProgram(Program); glDeleteShader(m_vert); glDeleteShader(m_frag); diff --git a/src/renderer/shader.hpp b/src/renderer/shader.hpp index 8dc8a94..02e68d1 100644 --- a/src/renderer/shader.hpp +++ b/src/renderer/shader.hpp @@ -13,6 +13,7 @@ public: void Load(std::string path); void Load(std::string path, GLenum type); + GLuint Program; void Link(); void Use(); @@ -25,7 +26,6 @@ private: FileReader m_fileReader; - GLuint m_program; GLuint m_vert; GLuint m_frag; }; diff --git a/src/renderer/voxel.cpp b/src/renderer/voxel.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/renderer/voxel.hpp b/src/renderer/voxel.hpp new file mode 100644 index 0000000..e69de29 diff --git a/src/world/world.hpp b/src/world/world.hpp index c5ee4ad..7bccc97 100644 --- a/src/world/world.hpp +++ b/src/world/world.hpp @@ -3,11 +3,13 @@ #include "../common.hpp" +class Shader; class Face; class World { public: + std::map> Shaders; std::vector> Faces; };