From 41d09c2b5f377d11d6901349e28be1671fcf6ffe Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Sun, 9 Oct 2022 17:34:23 +0200 Subject: [PATCH] Refactoring --- .clang-format | 1 + .gitmodules | 3 ++ lib/CMakeLists.txt | 4 +++ lib/tinygltf | 1 + src/CMakeLists.txt | 2 +- src/Controller.cpp | 69 ++++++++----------------------------------- src/Controller.h | 18 +++++------ src/FrameBuffer.cpp | 14 ++++----- src/FrameBuffer.h | 4 +-- src/ShaderProgram.cpp | 2 ++ src/Window.cpp | 11 +++---- src/main.cpp | 6 ++-- src/util/Log.cpp | 4 +-- src/util/Log.h | 2 +- 14 files changed, 53 insertions(+), 88 deletions(-) create mode 160000 lib/tinygltf diff --git a/.clang-format b/.clang-format index df21f94..b5847b4 100644 --- a/.clang-format +++ b/.clang-format @@ -7,6 +7,7 @@ AllowShortLoopsOnASingleLine: 'false' AlwaysBreakTemplateDeclarations: 'true' BreakBeforeBraces: Mozilla ColumnLimit: '120' +ConstructorInitializerAllOnOneLineOrOnePerLine: 'true' IndentWidth: '4' PointerAlignment: Right diff --git a/.gitmodules b/.gitmodules index 83efd45..1da9628 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "lib/entt"] path = lib/entt url = https://github.com/skypjack/entt.git +[submodule "lib/tinygltf"] + path = lib/tinygltf + url = https://github.com/syoyo/tinygltf.git diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 8e04ccb..b574f61 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,4 +1,8 @@ option(SPDLOG_NO_EXCEPTIONS "" ON) +set(TINYGLTF_HEADER_ONLY OFF CACHE INTERNAL "" FORCE) +set(TINYGLTF_INSTALL OFF CACHE INTERNAL "" FORCE) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/glad) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/entt) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tinygltf) diff --git a/lib/tinygltf b/lib/tinygltf new file mode 160000 index 0000000..091a1fc --- /dev/null +++ b/lib/tinygltf @@ -0,0 +1 @@ +Subproject commit 091a1fcc1abcef17c58bbbf400e85f5b87952491 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 40319c0..931ad7f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,7 +8,7 @@ add_library(fever_engine Mesh.cpp Entity.cpp Light.cpp - Scene.cpp + # Scene.cpp FrameBuffer.cpp Helper.cpp resources/Resource.cpp diff --git a/src/Controller.cpp b/src/Controller.cpp index 4b5204c..b98ca64 100644 --- a/src/Controller.cpp +++ b/src/Controller.cpp @@ -16,41 +16,20 @@ #include Controller::Controller() - : m_gameWindow(std::make_shared()), m_camera(std::make_shared(90., m_gameWindow->aspectRatio())) + : m_gameWindow(std::make_shared()), + m_camera(std::make_shared(90., m_gameWindow->aspectRatio())), + m_postProcessFrameBuffer(m_gameWindow->dimensions().first, m_gameWindow->dimensions().second, + postProcessingProgram) { - std::array shaderProgramPrototypes{ - ShaderProgram::Prototype{"defaultProgram", "data/shaders/basic.vert", "data/shaders/basic.frag"}, - ShaderProgram::Prototype{"lightProgram", "data/shaders/light.vert", "data/shaders/light.frag"}, - ShaderProgram::Prototype{"skyboxProgram", "data/shaders/skybox.vert", "data/shaders/skybox.frag"}, - ShaderProgram::Prototype{"postProcessingProgram", "data/shaders/postprocessing.vert", - "data/shaders/postprocessing.frag"}, - }; - - for (auto &prototype : shaderProgramPrototypes) { - m_shaderPrograms.push_back(std::make_shared(prototype)); - Log::logger().info("Loaded shaderprogram \"{}\"", prototype.name); - } - - auto dimensions = m_gameWindow->dimensions(); - m_postProcessFrameBuffer = std::make_shared(dimensions.first, dimensions.second, - getShaderProgramByName("postProcessingProgram").get()); - - m_scene = std::make_shared(m_shaderPrograms); } void Controller::run() { - updateExposure(*getShaderProgramByName("postProcessingProgram")); - - auto lightSource = m_scene->getEntityByName("light"); - lightSource->setScale(.1F); - lightSource->setRotation(glm::vec3(0.)); - lightSource->setPosition(glm::vec3(-2., 1.5, 2.)); + updateExposure(postProcessingProgram); m_camera->translate(glm::vec3(0., 1.5, 5.)); - static constexpr float INTENSITY = 7.5; - glm::vec3 lightColor{1., 1., 1.}; + Log::logger().info("Startup complete."); // This is the game loop while (glfwWindowShouldClose(&m_gameWindow->glfw_window()) == GLFW_FALSE) { @@ -59,26 +38,21 @@ void Controller::run() limit_framerate(); // --- Update game --- - m_scene->updatePointLight(0, true, m_scene->getEntityByName("light")->getPosition(), lightColor, INTENSITY); - m_scene->updateDirectionalLight(true, m_scene->getDirectionalLight()->getDirection(), lightColor); - getShaderProgramByName("lightProgram")->bind(); - getShaderProgramByName("lightProgram")->setUniform("v_lightColor", glm::vec3{1., 1., 1.} * 100.0F); - getShaderProgramByName("lightProgram")->unbind(); + lightProgram.bind(); + lightProgram.setUniform("v_lightColor", glm::vec3{1., 1., 1.} * 100.0F); + lightProgram.unbind(); // --- Render and buffer swap --- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_postProcessFrameBuffer->bind(); + m_postProcessFrameBuffer.bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_camera->lookForward(); m_camera->updateVPM(); - m_scene->getSkybox()->draw(m_camera->getView(), m_camera->getProj()); - m_scene->draw(m_camera->getViewProj(), m_camera->getPosition()); - - m_postProcessFrameBuffer->unbind(); - m_postProcessFrameBuffer->drawOnEntireScreen(); + m_postProcessFrameBuffer.unbind(); + m_postProcessFrameBuffer.drawOnEntireScreen(); glfwSwapBuffers(&m_gameWindow->glfw_window()); @@ -127,7 +101,7 @@ void Controller::update_window_dimensions() // m_gameEventHandler->setFirstMouseInput(1); auto dimensions = m_gameWindow->dimensions(); - m_postProcessFrameBuffer->changeDimensions(dimensions.first, dimensions.second); + m_postProcessFrameBuffer.changeDimensions(dimensions.first, dimensions.second); } void Controller::updateExposure(ShaderProgram &shaderProgram) const @@ -136,20 +110,3 @@ void Controller::updateExposure(ShaderProgram &shaderProgram) const shaderProgram.setUniform("u_exposure", m_exposure); shaderProgram.unbind(); } - -std::shared_ptr Controller::getShaderProgramByName(const std::string &name) -{ - return getShaderProgramByName(name, m_shaderPrograms); -} - -std::shared_ptr -Controller::getShaderProgramByName(const std::string &name, std::vector> shaderPrograms) -{ - for (auto program : shaderPrograms) { - if (program->getUniqueName() == name) { - return program; - } - } - Log::logger().critical("Shaderprogram could not be found by name \"{}\"", name); - return {}; -} diff --git a/src/Controller.h b/src/Controller.h index 01bd066..546ae09 100644 --- a/src/Controller.h +++ b/src/Controller.h @@ -1,10 +1,12 @@ #pragma once +#include "FrameBuffer.h" +#include "ShaderProgram.h" + #include #include #include -class ShaderProgram; class Window; class Scene; class Camera; @@ -17,11 +19,6 @@ public: void run(); - // TODO remove... - std::shared_ptr getShaderProgramByName(const std::string &name); - static std::shared_ptr - getShaderProgramByName(const std::string &name, std::vector> shaderPrograms); - void updateExposure(ShaderProgram &shaderProgram) const; private: @@ -29,13 +26,16 @@ private: void update_window_dimensions(); std::shared_ptr m_gameWindow; - std::shared_ptr m_scene; std::shared_ptr m_camera; - std::vector> m_shaderPrograms; + ShaderProgram defaultProgram{{"defaultProgram", "data/shaders/basic.vert", "data/shaders/basic.frag"}}; + ShaderProgram lightProgram{{"lightProgram", "data/shaders/light.vert", "data/shaders/light.frag"}}; + ShaderProgram skyboxProgram{{"skyboxProgram", "data/shaders/skybox.vert", "data/shaders/skybox.frag"}}; + ShaderProgram postProcessingProgram{ + {"postProcessingProgram", "data/shaders/postprocessing.vert", "data/shaders/postprocessing.frag"}}; - std::shared_ptr m_postProcessFrameBuffer; + FrameBuffer m_postProcessFrameBuffer; static constexpr unsigned MAX_FPS = 60; diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index cb3120b..b9448ba 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -26,7 +26,7 @@ GLuint AbstractFrameBuffer::getFBO() const return m_FBO; } -FrameBuffer::FrameBuffer(uint32_t width, uint32_t height, ShaderProgram *shaderProgram) : m_shaderProgram(shaderProgram) +FrameBuffer::FrameBuffer(uint32_t width, uint32_t height, ShaderProgram &shaderProgram) : m_shaderProgram(shaderProgram) { glGenFramebuffers(1, &m_FBO); @@ -53,11 +53,11 @@ void FrameBuffer::drawOnEntireScreen() const glGetIntegerv(GL_POLYGON_MODE, &wireframe); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - m_shaderProgram->bind(); + m_shaderProgram.bind(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, getTextureId()); - GLint location = glGetUniformLocation(m_shaderProgram->getShaderProgramId(), "u_texture"); + GLint location = glGetUniformLocation(m_shaderProgram.getShaderProgramId(), "u_texture"); glUniform1i(location, 0); // A VAO is necessary although no data is stored in it @@ -68,7 +68,7 @@ void FrameBuffer::drawOnEntireScreen() const glBindVertexArray(0); glPolygonMode(GL_FRONT_AND_BACK, static_cast(wireframe)); - m_shaderProgram->unbind(); + m_shaderProgram.unbind(); } void FrameBuffer::changeDimensions(uint32_t width, uint32_t height) @@ -111,9 +111,9 @@ void FrameBuffer::generateTextures(uint32_t width, uint32_t height) void FrameBuffer::setExposureCorrection(bool exposureCorrection) const { - m_shaderProgram->bind(); - m_shaderProgram->setUniform("u_exposureCorrection", exposureCorrection); - m_shaderProgram->unbind(); + m_shaderProgram.bind(); + m_shaderProgram.setUniform("u_exposureCorrection", exposureCorrection); + m_shaderProgram.unbind(); } AbstractDepthMap::~AbstractDepthMap() diff --git a/src/FrameBuffer.h b/src/FrameBuffer.h index 40a922e..fbe8a23 100644 --- a/src/FrameBuffer.h +++ b/src/FrameBuffer.h @@ -22,7 +22,7 @@ protected: class FrameBuffer : public AbstractFrameBuffer { public: - FrameBuffer(uint32_t width, uint32_t height, ShaderProgram *shaderProgram); + FrameBuffer(uint32_t width, uint32_t height, ShaderProgram &shaderProgram); ~FrameBuffer(); void drawOnEntireScreen() const; @@ -39,7 +39,7 @@ private: GLuint m_colorBuffer; GLuint m_depthStencilBuffer; - ShaderProgram *m_shaderProgram; + ShaderProgram &m_shaderProgram; }; class AbstractDepthMap : public AbstractFrameBuffer diff --git a/src/ShaderProgram.cpp b/src/ShaderProgram.cpp index bcb9840..f79ad82 100644 --- a/src/ShaderProgram.cpp +++ b/src/ShaderProgram.cpp @@ -31,6 +31,8 @@ ShaderProgram::ShaderProgram(Prototype prototype) : m_uniqueName(prototype.name) glDeleteShader(vs); glDeleteShader(fs); #endif + + Log::logger().info("Loaded shaderprogram \"{}\"", prototype.name); } ShaderProgram::~ShaderProgram() diff --git a/src/Window.cpp b/src/Window.cpp index df28fe6..241200d 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -20,7 +20,7 @@ Window::Window() glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); -#ifdef _DEBUG +#ifndef NDEBUG glfwSetErrorCallback(glfw_error_callback); glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); #else @@ -55,8 +55,8 @@ Window::Window() std::terminate(); } -#ifdef _DEBUG - Log::logger().debug("OpenGL version: {}", glGetString(GL_VERSION)); +#ifndef NDEBUG + Log::logger().debug("OpenGL version: {}", reinterpret_cast(glGetString(GL_VERSION))); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); glDebugMessageCallback(Helper::gl_debug_callback, nullptr); @@ -95,11 +95,8 @@ auto Window::dimensions_changed() const -> bool { int new_width{}; int new_height{}; - int new_posx{}; - int new_posy{}; glfwGetFramebufferSize(m_glfw_window.get(), &new_width, &new_height); - glfwGetWindowPos(m_glfw_window.get(), &new_posx, &new_posy); return !(static_cast(new_width) == m_width && static_cast(new_height) == m_height); } @@ -131,7 +128,7 @@ void Window::set_catched_cursor(bool value) // GLFW error function void Window::glfw_error_callback(int error, const char *description) { - Log::logger().warn("GLFW [%d]: %s\n", error, description); + Log::logger().warn("GLFW [{:d}]: {:s}\n", error, description); } // This function is called when the window gets resized (currently not used) diff --git a/src/main.cpp b/src/main.cpp index a9ca7f8..ed96c96 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,15 +1,15 @@ +#include "Controller.h" + #include #include -#include "Controller.h" - auto main(int argc, char **argv) -> int { // Suppress warning about unused variable (void)argc; (void)argv; -#ifdef _DEBUG +#ifndef NDEBUG std::cout << "[Debug Mode]" << std::endl; #endif diff --git a/src/util/Log.cpp b/src/util/Log.cpp index 34a3181..255a1f5 100644 --- a/src/util/Log.cpp +++ b/src/util/Log.cpp @@ -4,12 +4,12 @@ Log Log::s_instance; -Log::Log() +Log::Log() noexcept { m_logger = spdlog::stdout_color_mt("Core"); m_logger->set_pattern("[%H:%M:%S.%e] [%n] [%^%l%$] %v"); -#ifdef _DEBUG +#ifndef NDEBUG m_logger->set_level(spdlog::level::debug); #else m_logger->set_level(spdlog::level::warn); diff --git a/src/util/Log.h b/src/util/Log.h index 32d17ed..d4044e1 100644 --- a/src/util/Log.h +++ b/src/util/Log.h @@ -8,7 +8,7 @@ public: static spdlog::logger &logger(); private: - Log(); + Log() noexcept; static Log s_instance;