From aebd69a027fa908a127ac98a35bccb093e8ef5bf Mon Sep 17 00:00:00 2001 From: Pablo Rodriguez Date: Tue, 29 Jul 2025 17:17:28 -0400 Subject: [PATCH] Minor refactoring --- CMakeLists.txt | 4 +- source/app/main.cpp | 3 +- source/app/src/App.cpp | 58 +++++++++++----------- source/app/src/App.hpp | 7 ++- source/log/include/ILogFacility.hpp | 1 + source/log/include/LogUtils.hpp | 4 +- source/log/include/TimestampLog.hpp | 4 +- source/log/src/TimestampLog.cpp | 16 +++--- source/log/src/globals.cpp | 6 ++- source/shader/src/ShaderProgramBuilder.cpp | 23 +++++---- 10 files changed, 69 insertions(+), 57 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ac0c6bc..bd04340 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,10 @@ cmake_minimum_required(VERSION 3.31) -project(Ugly) - set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) +project(Ugly) + find_package(GLEW REQUIRED) find_package(glfw3 CONFIG REQUIRED) find_package(glm CONFIG REQUIRED) diff --git a/source/app/main.cpp b/source/app/main.cpp index aced843..2e81eb7 100644 --- a/source/app/main.cpp +++ b/source/app/main.cpp @@ -5,9 +5,8 @@ #include "App.hpp" - int main(int argc, char *argv[]) { auto args = std::vector{}; std::copy_n(argv, argc, std::back_inserter(args)); - return App::main(args); + return ugly::App::main(args); } diff --git a/source/app/src/App.cpp b/source/app/src/App.cpp index 31d43b9..11f3b97 100644 --- a/source/app/src/App.cpp +++ b/source/app/src/App.cpp @@ -9,23 +9,40 @@ #include "ShaderProgramBuilder.hpp" #include "TimestampLog.hpp" +namespace ugly { int App::main(std::vector &args) { - auto cerrLog = ugly::TimestampLog{std::cerr, "ugly::log"}; - ugly::log = ugly::LogAlias{&cerrLog}; - ugly::log("hello, world! app started."); + auto cerrLog = TimestampLog{"ugly::log", std::cerr}; + log = LogAlias{&cerrLog}; + log("hello, world! app started."); - auto app = App{}; + glfwSetErrorCallback(error_callback_s); + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + + auto window = glfwCreateWindow(640, 480, "uGLy", NULL, NULL); + glfwMakeContextCurrent(window); + glewExperimental = GL_TRUE; + if(glewInit() != GLEW_OK) { + log("glewInit() failed!"); + } + + auto app = App{window}; app.game_loop(); - ugly::log("app quitting."); + glfwTerminate(); + glfwSetErrorCallback(NULL); + log("app quitting."); return 0; } void App::error_callback_s(int error, const char *description) { - ugly::log("(glfw error): {}", description); + log("(glfw error): {}", description); } @@ -35,26 +52,11 @@ void App::key_callback_s(GLFWwindow *window, int key, int scancode, int action, } -App::App(): - mpWindow{NULL} { - glfwSetErrorCallback(error_callback_s); - glfwInit(); - - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); - - mpWindow = glfwCreateWindow(640, 480, "uGLy", NULL, NULL); +App::App(GLFWwindow *window): + mpWindow{window} { glfwSetWindowUserPointer(mpWindow, this); glfwSetKeyCallback(mpWindow, key_callback_s); - glfwMakeContextCurrent(mpWindow); - glewExperimental = GL_TRUE; - if(glewInit() != GLEW_OK) { - ugly::log("glewInit() failed!"); - } - float vertices[] = { .0f, .5f, 1.f, 0.f, 0.f, .5f, -.5f, 0.f, 1.f, 0.f, @@ -66,7 +68,7 @@ App::App(): glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - GLuint shaderProgram = ugly::ShaderProgramBuilder{} + GLuint shaderProgram = ShaderProgramBuilder{} .attachFromFile(GL_VERTEX_SHADER, "assets/shaders/shader.vert") .attachFromFile(GL_FRAGMENT_SHADER, "assets/shaders/shader.frag") .link(); @@ -82,12 +84,6 @@ App::App(): } -App::~App() { - glfwTerminate(); - glfwSetErrorCallback(NULL); -} - - void App::game_loop() { while(!glfwWindowShouldClose(mpWindow)) { glfwPollEvents(); @@ -105,3 +101,5 @@ void App::key_callback(int key, int scancode, int action, int mods) { glfwSetWindowShouldClose(mpWindow, GLFW_TRUE); } } + +} diff --git a/source/app/src/App.hpp b/source/app/src/App.hpp index a9554bd..3af3d87 100644 --- a/source/app/src/App.hpp +++ b/source/app/src/App.hpp @@ -5,6 +5,8 @@ struct GLFWwindow; +namespace ugly { + class App { public: static int main(std::vector &args); @@ -16,8 +18,9 @@ private: GLFWwindow *mpWindow; private: - App(); - ~App(); + App(GLFWwindow *window); void game_loop(); void key_callback(int key, int scancode, int action, int mods); }; + +} diff --git a/source/log/include/ILogFacility.hpp b/source/log/include/ILogFacility.hpp index fea9469..e9bd8eb 100644 --- a/source/log/include/ILogFacility.hpp +++ b/source/log/include/ILogFacility.hpp @@ -7,6 +7,7 @@ namespace ugly { class ILogFacility { public: + ~ILogFacility() = default; virtual void vlog(std::string_view fmt, std::format_args args) = 0; }; diff --git a/source/log/include/LogUtils.hpp b/source/log/include/LogUtils.hpp index 800824e..7e7156d 100644 --- a/source/log/include/LogUtils.hpp +++ b/source/log/include/LogUtils.hpp @@ -11,9 +11,9 @@ public: ILogFacility *mpLog; template - LogAlias &operator()(std::format_string format, Args &&...args) { + LogAlias &operator()(std::format_string fmt, Args &&...args) { if(mpLog) { - mpLog->vlog(format.get(), std::make_format_args(args...)); + mpLog->vlog(fmt.get(), std::make_format_args(args...)); } return *this; } diff --git a/source/log/include/TimestampLog.hpp b/source/log/include/TimestampLog.hpp index aa98d8a..07eedf3 100644 --- a/source/log/include/TimestampLog.hpp +++ b/source/log/include/TimestampLog.hpp @@ -12,12 +12,12 @@ namespace ugly { class TimestampLog: virtual public ILogFacility { private: + std::chrono::high_resolution_clock::time_point mStartTime; std::ostream &mrOutputStream; std::string mDescription; - std::chrono::high_resolution_clock::time_point mStart; public: - TimestampLog(std::ostream &os, std::string_view description); + TimestampLog(std::string_view description, std::ostream &os); void vlog(std::string_view fmt, std::format_args args) override; }; diff --git a/source/log/src/TimestampLog.cpp b/source/log/src/TimestampLog.cpp index 4e00506..41a1844 100644 --- a/source/log/src/TimestampLog.cpp +++ b/source/log/src/TimestampLog.cpp @@ -3,16 +3,20 @@ #include #include +namespace ugly { -ugly::TimestampLog::TimestampLog(std::ostream &os, std::string_view description): +TimestampLog::TimestampLog(std::string_view description, std::ostream &os): + mStartTime{std::chrono::high_resolution_clock::now()}, mrOutputStream{os}, - mDescription{description}, - mStart{std::chrono::high_resolution_clock::now()} {} + mDescription{description} {} -void ugly::TimestampLog::vlog(std::string_view fmt, std::format_args args) { - auto now = std::chrono::high_resolution_clock::now(); - auto timestamp = std::chrono::duration_cast>(now - mStart).count(); +void TimestampLog::vlog(std::string_view fmt, std::format_args args) { + using namespace std::chrono; + auto now = high_resolution_clock::now(); + auto timestamp = duration_cast>(now - mStartTime).count(); auto message = std::vformat(fmt, args); mrOutputStream << std::format("[{:9.4f}] {}: {}\n", timestamp, mDescription, message); } + +} diff --git a/source/log/src/globals.cpp b/source/log/src/globals.cpp index 637dae2..72881e0 100644 --- a/source/log/src/globals.cpp +++ b/source/log/src/globals.cpp @@ -1,3 +1,7 @@ #include "LogUtils.hpp" -ugly::LogAlias ugly::log{nullptr}; +namespace ugly { + +LogAlias log{nullptr}; + +} diff --git a/source/shader/src/ShaderProgramBuilder.cpp b/source/shader/src/ShaderProgramBuilder.cpp index 0fe8117..31ff29b 100644 --- a/source/shader/src/ShaderProgramBuilder.cpp +++ b/source/shader/src/ShaderProgramBuilder.cpp @@ -6,26 +6,27 @@ #include "LogUtils.hpp" +namespace ugly { -ugly::ShaderProgramBuilder::ShaderProgramBuilder(): +ShaderProgramBuilder::ShaderProgramBuilder(): mProgram{glCreateProgram()} {} -ugly::ShaderProgramBuilder::~ShaderProgramBuilder() { +ShaderProgramBuilder::~ShaderProgramBuilder() { if(mProgram != 0) { glDeleteProgram(mProgram); } } -void ugly::ShaderProgramBuilder::reset() { +void ShaderProgramBuilder::reset() { using namespace std; ShaderProgramBuilder b; swap(*this, b); } -ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromMemory(GLenum type, const GLchar *string, GLint length) { +ShaderProgramBuilder &ShaderProgramBuilder::attachFromMemory(GLenum type, const GLchar *string, GLint length) { auto shader = glCreateShader(type); glShaderSource(shader, 1, &string, length != 0 ? &length : NULL); glCompileShader(shader); @@ -36,7 +37,7 @@ ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromMemory(GLenum char buf[512]; glGetShaderInfoLog(shader, 512, NULL, buf); glDeleteShader(shader); - ugly::log("failed to compile shader:\n\t{}", buf); + log("failed to compile shader:\n\t{}", buf); } glAttachShader(mProgram, shader); @@ -45,14 +46,14 @@ ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromMemory(GLenum } -ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromFile(GLenum type, const char *filename) { +ShaderProgramBuilder &ShaderProgramBuilder::attachFromFile(GLenum type, const char *filename) { auto file = std::filebuf{}; auto ss = std::ostringstream{}; - ugly::log("loading shader from file {}", filename); + log("loading shader from file {}", filename); file.open(filename, std::ios_base::in); if(!file.is_open()) { - ugly::log("couldn't open file {}", filename); + log("couldn't open file {}", filename); } ss << &file; @@ -60,7 +61,7 @@ ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromFile(GLenum ty } -GLuint ugly::ShaderProgramBuilder::link() { +GLuint ShaderProgramBuilder::link() { glLinkProgram(mProgram); GLint status; @@ -68,7 +69,7 @@ GLuint ugly::ShaderProgramBuilder::link() { if(status != GL_TRUE) { char buf[512]; glGetProgramInfoLog(mProgram, 512, NULL, buf); - ugly::log("failed to link program:\n\t{}", buf); + log("failed to link program:\n\t{}", buf); } auto result = mProgram; @@ -76,3 +77,5 @@ GLuint ugly::ShaderProgramBuilder::link() { reset(); return result; } + +}