Minor refactoring

This commit is contained in:
2025-07-29 17:17:28 -04:00
parent c8b5a5ebd4
commit 7a7bfc4930
10 changed files with 69 additions and 57 deletions

View File

@@ -1,10 +1,10 @@
cmake_minimum_required(VERSION 3.31) cmake_minimum_required(VERSION 3.31)
project(Ugly)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
project(Ugly)
find_package(GLEW REQUIRED) find_package(GLEW REQUIRED)
find_package(glfw3 CONFIG REQUIRED) find_package(glfw3 CONFIG REQUIRED)
find_package(glm CONFIG REQUIRED) find_package(glm CONFIG REQUIRED)

View File

@@ -5,9 +5,8 @@
#include "App.hpp" #include "App.hpp"
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
auto args = std::vector<std::string>{}; auto args = std::vector<std::string>{};
std::copy_n(argv, argc, std::back_inserter(args)); std::copy_n(argv, argc, std::back_inserter(args));
return App::main(args); return ugly::App::main(args);
} }

View File

@@ -9,23 +9,40 @@
#include "ShaderProgramBuilder.hpp" #include "ShaderProgramBuilder.hpp"
#include "TimestampLog.hpp" #include "TimestampLog.hpp"
namespace ugly {
int App::main(std::vector<std::string> &args) { int App::main(std::vector<std::string> &args) {
auto cerrLog = ugly::TimestampLog{std::cerr, "ugly::log"}; auto cerrLog = TimestampLog{"ugly::log", std::cerr};
ugly::log = ugly::LogAlias{&cerrLog}; log = LogAlias{&cerrLog};
ugly::log("hello, world! app started."); 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(); app.game_loop();
ugly::log("app quitting."); glfwTerminate();
glfwSetErrorCallback(NULL);
log("app quitting.");
return 0; return 0;
} }
void App::error_callback_s(int error, const char *description) 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(): App::App(GLFWwindow *window):
mpWindow{NULL} { mpWindow{window} {
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);
glfwSetWindowUserPointer(mpWindow, this); glfwSetWindowUserPointer(mpWindow, this);
glfwSetKeyCallback(mpWindow, key_callback_s); glfwSetKeyCallback(mpWindow, key_callback_s);
glfwMakeContextCurrent(mpWindow);
glewExperimental = GL_TRUE;
if(glewInit() != GLEW_OK) {
ugly::log("glewInit() failed!");
}
float vertices[] = { float vertices[] = {
.0f, .5f, 1.f, 0.f, 0.f, .0f, .5f, 1.f, 0.f, 0.f,
.5f, -.5f, 0.f, 1.f, 0.f, .5f, -.5f, 0.f, 1.f, 0.f,
@@ -66,7 +68,7 @@ App::App():
glBindBuffer(GL_ARRAY_BUFFER, vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 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_VERTEX_SHADER, "assets/shaders/shader.vert")
.attachFromFile(GL_FRAGMENT_SHADER, "assets/shaders/shader.frag") .attachFromFile(GL_FRAGMENT_SHADER, "assets/shaders/shader.frag")
.link(); .link();
@@ -82,12 +84,6 @@ App::App():
} }
App::~App() {
glfwTerminate();
glfwSetErrorCallback(NULL);
}
void App::game_loop() { void App::game_loop() {
while(!glfwWindowShouldClose(mpWindow)) { while(!glfwWindowShouldClose(mpWindow)) {
glfwPollEvents(); glfwPollEvents();
@@ -105,3 +101,5 @@ void App::key_callback(int key, int scancode, int action, int mods) {
glfwSetWindowShouldClose(mpWindow, GLFW_TRUE); glfwSetWindowShouldClose(mpWindow, GLFW_TRUE);
} }
} }
}

View File

@@ -5,6 +5,8 @@
struct GLFWwindow; struct GLFWwindow;
namespace ugly {
class App { class App {
public: public:
static int main(std::vector<std::string> &args); static int main(std::vector<std::string> &args);
@@ -16,8 +18,9 @@ private:
GLFWwindow *mpWindow; GLFWwindow *mpWindow;
private: private:
App(); App(GLFWwindow *window);
~App();
void game_loop(); void game_loop();
void key_callback(int key, int scancode, int action, int mods); void key_callback(int key, int scancode, int action, int mods);
}; };
}

View File

@@ -7,6 +7,7 @@ namespace ugly {
class ILogFacility { class ILogFacility {
public: public:
~ILogFacility() = default;
virtual void vlog(std::string_view fmt, std::format_args args) = 0; virtual void vlog(std::string_view fmt, std::format_args args) = 0;
}; };

View File

@@ -11,9 +11,9 @@ public:
ILogFacility *mpLog; ILogFacility *mpLog;
template<typename ...Args> template<typename ...Args>
LogAlias &operator()(std::format_string<Args...> format, Args &&...args) { LogAlias &operator()(std::format_string<Args...> fmt, Args &&...args) {
if(mpLog) { if(mpLog) {
mpLog->vlog(format.get(), std::make_format_args(args...)); mpLog->vlog(fmt.get(), std::make_format_args(args...));
} }
return *this; return *this;
} }

View File

@@ -12,12 +12,12 @@ namespace ugly {
class TimestampLog: virtual public ILogFacility { class TimestampLog: virtual public ILogFacility {
private: private:
std::chrono::high_resolution_clock::time_point mStartTime;
std::ostream &mrOutputStream; std::ostream &mrOutputStream;
std::string mDescription; std::string mDescription;
std::chrono::high_resolution_clock::time_point mStart;
public: 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; void vlog(std::string_view fmt, std::format_args args) override;
}; };

View File

@@ -3,16 +3,20 @@
#include <format> #include <format>
#include <chrono> #include <chrono>
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}, mrOutputStream{os},
mDescription{description}, mDescription{description} {}
mStart{std::chrono::high_resolution_clock::now()} {}
void ugly::TimestampLog::vlog(std::string_view fmt, std::format_args args) { void TimestampLog::vlog(std::string_view fmt, std::format_args args) {
auto now = std::chrono::high_resolution_clock::now(); using namespace std::chrono;
auto timestamp = std::chrono::duration_cast<std::chrono::duration<float>>(now - mStart).count(); auto now = high_resolution_clock::now();
auto timestamp = duration_cast<duration<float>>(now - mStartTime).count();
auto message = std::vformat(fmt, args); auto message = std::vformat(fmt, args);
mrOutputStream << std::format("[{:9.4f}] {}: {}\n", timestamp, mDescription, message); mrOutputStream << std::format("[{:9.4f}] {}: {}\n", timestamp, mDescription, message);
} }
}

View File

@@ -1,3 +1,7 @@
#include "LogUtils.hpp" #include "LogUtils.hpp"
ugly::LogAlias ugly::log{nullptr}; namespace ugly {
LogAlias log{nullptr};
}

View File

@@ -6,26 +6,27 @@
#include "LogUtils.hpp" #include "LogUtils.hpp"
namespace ugly {
ugly::ShaderProgramBuilder::ShaderProgramBuilder(): ShaderProgramBuilder::ShaderProgramBuilder():
mProgram{glCreateProgram()} {} mProgram{glCreateProgram()} {}
ugly::ShaderProgramBuilder::~ShaderProgramBuilder() { ShaderProgramBuilder::~ShaderProgramBuilder() {
if(mProgram != 0) { if(mProgram != 0) {
glDeleteProgram(mProgram); glDeleteProgram(mProgram);
} }
} }
void ugly::ShaderProgramBuilder::reset() { void ShaderProgramBuilder::reset() {
using namespace std; using namespace std;
ShaderProgramBuilder b; ShaderProgramBuilder b;
swap(*this, 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); auto shader = glCreateShader(type);
glShaderSource(shader, 1, &string, length != 0 ? &length : NULL); glShaderSource(shader, 1, &string, length != 0 ? &length : NULL);
glCompileShader(shader); glCompileShader(shader);
@@ -36,7 +37,7 @@ ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromMemory(GLenum
char buf[512]; char buf[512];
glGetShaderInfoLog(shader, 512, NULL, buf); glGetShaderInfoLog(shader, 512, NULL, buf);
glDeleteShader(shader); glDeleteShader(shader);
ugly::log("failed to compile shader:\n\t{}", buf); log("failed to compile shader:\n\t{}", buf);
} }
glAttachShader(mProgram, shader); 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 file = std::filebuf{};
auto ss = std::ostringstream{}; auto ss = std::ostringstream{};
ugly::log("loading shader from file {}", filename); log("loading shader from file {}", filename);
file.open(filename, std::ios_base::in); file.open(filename, std::ios_base::in);
if(!file.is_open()) { if(!file.is_open()) {
ugly::log("couldn't open file {}", filename); log("couldn't open file {}", filename);
} }
ss << &file; ss << &file;
@@ -60,7 +61,7 @@ ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromFile(GLenum ty
} }
GLuint ugly::ShaderProgramBuilder::link() { GLuint ShaderProgramBuilder::link() {
glLinkProgram(mProgram); glLinkProgram(mProgram);
GLint status; GLint status;
@@ -68,7 +69,7 @@ GLuint ugly::ShaderProgramBuilder::link() {
if(status != GL_TRUE) { if(status != GL_TRUE) {
char buf[512]; char buf[512];
glGetProgramInfoLog(mProgram, 512, NULL, buf); 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; auto result = mProgram;
@@ -76,3 +77,5 @@ GLuint ugly::ShaderProgramBuilder::link() {
reset(); reset();
return result; return result;
} }
}