From 13e072853fc8013629ac938cb167e0fb02516a9e Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Wed, 28 Oct 2026 22:52:04 -0400 Subject: [PATCH] Refactored and setup for better analyzer. --- Makefile | 2 +- TODO.md | 2 + lua/builder_test.lua | 5 +- src/bezos.cpp | 2 + src/document.cpp | 24 +++++++++ src/document.hpp | 3 ++ src/image.cpp | 4 ++ src/main.cpp | 108 +++---------------------------------- src/render.cpp | 123 +++++++++++++++++++++++++++++++++++++------ src/render.hpp | 16 ++++-- src/text.hpp | 2 +- 11 files changed, 164 insertions(+), 127 deletions(-) create mode 100644 TODO.md diff --git a/Makefile b/Makefile index 2457586..5bfefd0 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ debug: build gdb --nx -x .gdbinit --ex run --args builddir/bezos_tests debug_run: build - gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args builddir/bezos_tests + gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args builddir/bezos clean: meson compile --clean -C builddir diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..b52ee1c --- /dev/null +++ b/TODO.md @@ -0,0 +1,2 @@ +* Make the Deck::analyze do a more thorough analysis/check. +* Get the code online. diff --git a/lua/builder_test.lua b/lua/builder_test.lua index 47c6b42..8ca0129 100644 --- a/lua/builder_test.lua +++ b/lua/builder_test.lua @@ -31,7 +31,10 @@ slide{ t [[ Makes programming content more interesting. - ]] + ]], + image{ + src="assets/test.jpg" + } } slide{ diff --git a/src/bezos.cpp b/src/bezos.cpp index d247cad..c32d593 100644 --- a/src/bezos.cpp +++ b/src/bezos.cpp @@ -40,7 +40,9 @@ namespace Bezos { lua.script_file(file); + // BUG: don't do this, instead set the builder on the lua script Builder builder = lua["DECK"]; + return builder.deck; } diff --git a/src/document.cpp b/src/document.cpp index 1ec547f..7f0eef4 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -1,2 +1,26 @@ #include "document.hpp" #include + +void Deck::analyze() { + // Needed work: + // * Character mapping for the fonts + // * Checks for errors + // * Resource prep: images, fonts, font glyphs + for(auto& slide : slides) { + for(auto& node : slide.content) { + switch(node.type) { + case NodeType::IMAGE: { + dbc::check(node.image == nullptr, "Got an image node that's already setup."); + node.image = std::make_shared(); + std::string src = std::any_cast(node.config.at("src")); + node.image->load(src); + break; + } + default: + fmt::println("Skipping unknown node"); + } + } + } + + analyzed = true; +} diff --git a/src/document.hpp b/src/document.hpp index 1216d48..c05eaef 100644 --- a/src/document.hpp +++ b/src/document.hpp @@ -41,4 +41,7 @@ struct Slide { struct Deck { std::vector slides{}; std::unordered_map config{}; + bool analyzed = false; + + void analyze(); }; diff --git a/src/image.cpp b/src/image.cpp index 68619bb..6de4462 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -59,6 +59,9 @@ void Image::render() { glBindVertexArray(image_vao); glBindTexture(GL_TEXTURE_2D, texture_id); glDrawArrays(GL_TRIANGLES, 0, 6); + + glBindTexture(GL_TEXTURE_2D, 0); + glBindVertexArray(0); } Image::Image() { @@ -76,4 +79,5 @@ Image::Image() { // color attribute glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float))); glEnableVertexAttribArray(1); + glBindVertexArray(0); } diff --git a/src/main.cpp b/src/main.cpp index 8699913..8171f61 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,116 +1,20 @@ #define _USE_MATH_DEFINES -#include -#include -#include -#include #include -#include -#include #include "config.hpp" #include "render.hpp" #include "bezos.hpp" -void framebuffer_size_callback(GLFWwindow *window, int width, int height); - - -void init_glfw() { - glfwInit(); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - -#ifdef __APPLE__ - glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); -#endif -} - -void framebuffer_size_callback(GLFWwindow *, int width, int height) { - glViewport(0, 0, width, height); -} - -void mouse_callback(GLFWwindow *window, double xpos, double ypos) { - Engine* engine = static_cast(glfwGetWindowUserPointer(window)); - engine->mouse(xpos, ypos); -} - -void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) -{ - Engine* engine = static_cast(glfwGetWindowUserPointer(window)); - - if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { - glfwSetWindowShouldClose(window, true); - } - - if (key == GLFW_KEY_W && action == GLFW_PRESS) { - engine->change_slide(-1); - } - - if (key == GLFW_KEY_S && action == GLFW_PRESS) { - engine->change_slide(1); - } -} - -GLFWwindow* create_window() { - GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL); - dbc::check(window != NULL, "failed to open window"); - - glfwMakeContextCurrent(window); - - glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - - auto good = gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); - dbc::check(good, "failed to load GLAD"); - - glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); - - glfwSetCursorPosCallback(window, mouse_callback); - glfwSetKeyCallback(window, key_callback); - - return window; -} - -void setup() { - glEnable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glEnable(GL_CULL_FACE); - glEnable(GL_MULTISAMPLE); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - glDepthFunc(GL_LESS); -} - -void update(GLFWwindow* window) { - glfwPollEvents(); -} - -void render(GLFWwindow* window, Engine &state) { - state.render(); - - glfwSwapBuffers(window); -} - -void quit(GLFWwindow* window) { - glfwTerminate(); -} - int main() { - init_glfw(); - - auto window = create_window(); - setup(); Deck deck = Bezos::load("lua/builder_test.lua"); + Engine state{.deck=deck}; + state.init(); - Engine state(deck); - - glfwSetWindowUserPointer(window, &state); - - while(!glfwWindowShouldClose(window)) { - update(window); - render(window, state); + while(state.active()) { + state.update(); + state.render(); } - quit(window); + state.quit(); return 0; } diff --git a/src/render.cpp b/src/render.cpp index f5d33da..ea88dd6 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -6,17 +6,97 @@ #include #include #include "image.hpp" +#include -Engine::Engine(Deck &deck) : - deck(deck) +void framebuffer_size_callback(GLFWwindow *, int width, int height) { + glViewport(0, 0, width, height); +} + +void mouse_callback(GLFWwindow *window, double xpos, double ypos) { + Engine* engine = static_cast(glfwGetWindowUserPointer(window)); + engine->mouse(xpos, ypos); +} + +void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { - text.load_font(); - screen.init(); - framebuffer.init(); + Engine* engine = static_cast(glfwGetWindowUserPointer(window)); + + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { + glfwSetWindowShouldClose(window, true); + } + + if (key == GLFW_KEY_W && action == GLFW_PRESS) { + engine->change_slide(-1); + } + + if (key == GLFW_KEY_S && action == GLFW_PRESS) { + engine->change_slide(1); + } +} + +void init_glfw() { + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + +#ifdef __APPLE__ + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); +#endif +} + + +GLFWwindow* create_window() { + GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL); + dbc::check(window != NULL, "failed to open window"); + + glfwMakeContextCurrent(window); + + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + + auto good = gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); + dbc::check(good, "failed to load GLAD"); + + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + + glfwSetCursorPosCallback(window, mouse_callback); + glfwSetKeyCallback(window, key_callback); + + return window; +} + +void setup() { + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glEnable(GL_CULL_FACE); + glEnable(GL_MULTISAMPLE); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glDepthFunc(GL_LESS); +} + +void Engine::init() { + init_glfw(); + window = create_window(); + setup(); + + text = std::make_shared(); + screen = std::make_shared(); + framebuffer = std::make_shared(); + + text->load_font(); + // BUG: this will fail if it's before text.load_font + deck.analyze(); + + screen->init(); + framebuffer->init(); + + glfwSetWindowUserPointer(window, this); } void Engine::render() { - framebuffer.begin(); + framebuffer->begin(); glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); @@ -26,25 +106,22 @@ void Engine::render() { for(auto& node : slide.content) { line++; - float y = (text.font_size + 20) * line; + float y = (text->font_size + 20) * line; if(node.type == NodeType::TEXT || node.type == NodeType::H1 || node.type == NodeType::UL) { - text.render(node.content, 25.0f, SCR_HEIGHT - y, 1.0f, glm::vec3(1.0f, 1.0f, 1.0f)); - } else if(node.type == NodeType::IMAGE) { - if(node.image == nullptr) { - node.image = std::make_shared(); - std::string src = std::any_cast(node.config.at("src")); - node.image->load(src); - } - + text->render(node.content, 25.0f, SCR_HEIGHT - y, 1.0f, glm::vec3(1.0f, 1.0f, 1.0f)); + } else if(node.type == NodeType::IMAGE && node.image != nullptr) { + dbc::check(node.image != nullptr, "Node's image not configured."); node.image->render(); } else { dbc::sentinel("Unknown NodeType"); } } - framebuffer.commit(); - framebuffer.draw(screen); + framebuffer->commit(); + framebuffer->draw(*screen); + + glfwSwapBuffers(window); } void Engine::change_slide(int dir) { @@ -52,3 +129,15 @@ void Engine::change_slide(int dir) { at_slide = std::clamp(at_slide + dir, 0, int(deck.slides.size() - 1)); } + +void Engine::update() { + glfwPollEvents(); +} + +void Engine::quit() { + glfwTerminate(); +} + +bool Engine::active() { + return !glfwWindowShouldClose(window); +} diff --git a/src/render.hpp b/src/render.hpp index cb38be3..d16f5e1 100644 --- a/src/render.hpp +++ b/src/render.hpp @@ -3,17 +3,18 @@ #include "framebuffer.hpp" #include "text.hpp" #include "document.hpp" +#include +#include struct Engine { Deck& deck; - FrameBuffer framebuffer; - Screen screen; - Text text{.font_size=100}; + std::shared_ptr framebuffer = nullptr; + std::shared_ptr screen = nullptr; + std::shared_ptr text = nullptr; int at_slide = 0; float mouse_x = 0.0f; float mouse_y = 0.0f; - - Engine(Deck& deck); + GLFWwindow* window = nullptr; void render(); void change_slide(int dir); @@ -22,4 +23,9 @@ struct Engine { mouse_x = x; mouse_y = y; } + + void update(); + void quit(); + void init(); + bool active(); }; diff --git a/src/text.hpp b/src/text.hpp index 6af8f5a..bab7cd4 100644 --- a/src/text.hpp +++ b/src/text.hpp @@ -12,7 +12,7 @@ struct Character { }; struct Text { - int font_size = 48; + int font_size = 108; std::string font{"assets/fonts/text.ttf"}; Shader text_shader{{"shaders/text.vert.glsl", "shaders/text.frag.glsl", ""}}; unsigned int text_vao = UINT_MAX;