From fb3e6dc70534c49b914178dc1525df424ae3b49c Mon Sep 17 00:00:00 2001 From: chris bell Date: Fri, 7 Aug 2026 11:36:22 -0500 Subject: [PATCH] SDL conversion --- CMakeLists.txt | 70 ++++++++++++++++++++++++++++---------------------- flake.nix | 22 +++++++--------- src/main.cpp | 55 +++++++++++---------------------------- 3 files changed, 64 insertions(+), 83 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c1a83d..3fab7d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,55 +8,65 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(PkgConfig REQUIRED) find_package(Freetype REQUIRED) -find_package(glfw3 CONFIG REQUIRED) find_package(Lua REQUIRED) +find_package(SDL3 CONFIG REQUIRED) +find_package(SDL3_image CONFIG REQUIRED) +find_package(SQLiteCpp REQUIRED) +find_package(toml11 CONFIG REQUIRED) pkg_check_modules(LUNASVG REQUIRED IMPORTED_TARGET lunasvg) add_library(lunasvg::lunasvg ALIAS PkgConfig::LUNASVG) -#pkg_check_modules(SQLITE3 REQUIRED IMPORTED_TARGET sqlite3) -#add_library(sqlite3::sqlite3 ALIAS PkgConfig::SQLITE3) - -find_package(SQLiteCpp REQUIRED) - -find_package(toml11 CONFIG REQUIRED) - find_package(RmlUi CONFIG REQUIRED) +add_library(rmlui_backend STATIC + vendor/rmlui_backend/RmlUi_Backend_SDL_SDLrenderer.cpp + vendor/rmlui_backend/RmlUi_Platform_SDL.cpp + vendor/rmlui_backend/RmlUi_Renderer_SDL.cpp +) + +target_include_directories(rmlui_backend PUBLIC + vendor/rmlui_backend +) + +target_compile_definitions(rmlui_backend PUBLIC + RMLUI_SDL_VERSION_MAJOR=3 +) + +target_link_libraries(rmlui_backend PUBLIC + RmlUi::RmlUi + SDL3::SDL3 + SDL3_image::SDL3_image + Freetype::Freetype +) add_executable(${PROJECT_NAME} - src/main.cpp - src/database.cpp - src/ui.cpp - src/image_utils.cpp - - vendor/rmlui_backend/RmlUi_Backend_GLFW_GL3.cpp - vendor/rmlui_backend/RmlUi_Platform_GLFW.cpp - vendor/rmlui_backend/RmlUi_Renderer_GL3.cpp + src/main.cpp + src/database.cpp + src/ui.cpp + src/image_utils.cpp ) target_include_directories(${PROJECT_NAME} PRIVATE - src - vendor/rmlui_backend - ${FREETYPE_INCLUDE_DIRS} + src + ${FREETYPE_INCLUDE_DIRS} ) target_link_libraries(${PROJECT_NAME} PRIVATE - RmlUi::RmlUi - RmlUi::Debugger - RmlUi::Lua - ${LUA_LIBRARIES} - Freetype::Freetype - lunasvg::lunasvg - glfw - toml11::toml11 - SQLiteCpp + rmlui_backend + RmlUi::RmlUi + RmlUi::Debugger + RmlUi::Lua + ${LUA_LIBRARIES} + Freetype::Freetype + lunasvg::lunasvg + toml11::toml11 + SQLiteCpp ) install(TARGETS ${PROJECT_NAME} DESTINATION bin) install(DIRECTORY assets DESTINATION bin) target_compile_definitions(${PROJECT_NAME} PRIVATE - ASSETS_DIR="${CMAKE_SOURCE_DIR}/bin/assets" + ASSETS_DIR="${CMAKE_SOURCE_DIR}/bin/assets" ) - diff --git a/flake.nix b/flake.nix index 7909984..4036ee2 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,7 @@ rmlui = pkgs.stdenv.mkDerivation rec { pname = "rmlui"; version = "master"; + src = pkgs.fetchFromGitHub { owner = "mikke89"; repo = "RmlUi"; @@ -31,14 +32,14 @@ pkgs.lunasvg pkgs.lua ]; - + cmakeFlags = [ "-DRMLUI_LUA_BINDINGS=ON" "-DRMLUI_LUA_BINDINGS_LIBRARY=lua" "-DRMLUI_SVG_PLUGIN=ON" "-DBUILD_SHARED_LIBS=ON" - "-DBUILD_SAMPLES=OFF" - "-DBUILD_TESTING=OFF" + "-DBUILD_SAMPLES=OFF" + "-DBUILD_TESTING=OFF" "-DNO_FONT_INTERFACE_DEFAULT=OFF" ]; }; @@ -52,14 +53,9 @@ ]; runtimeDeps = with pkgs; [ - raylib - glfw + sdl3 + sdl3-image libGL - libX11 - libXcursor - libXrandr - libXinerama - libXi wayland libxkbcommon rmlui @@ -77,10 +73,10 @@ buildInputs = runtimeDeps; shellHook = '' - export CP_PATH="${pkgs.raylib}/include:${pkgs.glfw}/include:${rmlui}/include" - export LIBRARY_PATH="${pkgs.raylib}/lib:${pkgs.glfw}/lib:${pkgs.libGL}/lib:${rmlui}/lib" + export CP_PATH="${rmlui}/include" + export LIBRARY_PATH="${pkgs.libGL}/lib:${rmlui}/lib" export LD_LIBRARY_PATH="$LIBRARY_PATH:$LD_LIBRARY_PATH" - + echo "Env ready" ''; }; diff --git a/src/main.cpp b/src/main.cpp index d7536b2..96c53d6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,18 +3,15 @@ #include "ui.hpp" #include "../vendor/stb/stb_image.h" #include "../vendor/stb/stb_image_write.h" - -#include +#include #include #include #include #include #include - #include #include #include - static bool is_initalized = false; static bool is_running = false; static Rml::Context *ctx = nullptr; @@ -22,47 +19,42 @@ static std::map critters; static std::vector critter_list; static Rml::ElementDocument *doc; static AppData app_data; - void shutdown() { Rml::Shutdown(); Backend::Shutdown(); + SDL_Quit(); } - bool initialize() { + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { + std::cout << "[ERROR] Failed to initialize SDL3: " << SDL_GetError() << "\n"; + return false; + } if (!Backend::Initialize("CritterFolio", 800, 600, true)) { std::cout << "[ERROR] Failed to initialize backend.\n"; return false; } std::cout << "[INFO] RmlUI Backend initialized.\n"; - Rml::SetSystemInterface(Backend::GetSystemInterface()); Rml::SetRenderInterface(Backend::GetRenderInterface()); Rml::Initialise(); Rml::Lua::Initialise(); - std::cout << "[INFO] Loading local DB...\n"; if (!db_get_all_critters(critters)) { std::cout << "[ERROR] Local DB failed to initialize.\n"; return false; } std::cout << "[INFO] Local DB initialized.\n"; - sync_map_to_list(critters, critter_list); - ctx = Rml::CreateContext("main", Rml::Vector2i(800, 600)); if (!ctx) { std::cout << "[ERROR] Failed to create context.\n"; return false; } std::cout << "[INFO] Main context initialized.\n"; - Rml::LoadFontFace("./assets/fonts/Hubballi-Regular.ttf"); - Rml::Debugger::Initialise(ctx); return true; } - - bool load_document() { doc = ctx->LoadDocument("./assets/main.rml"); if (!doc) { @@ -74,7 +66,6 @@ bool load_document() { doc->Show(); return true; } - bool reload_doc() { if (doc) { Rml::Factory::ClearStyleSheetCache(); @@ -82,79 +73,63 @@ bool reload_doc() { doc->Close(); doc = nullptr; } - if (!load_document()) { return false; } - return true; } - - bool f5_was_pressed = false; bool f8_was_pressed = false; - void handle_input() { - GLFWwindow *window = glfwGetCurrentContext(); - if(window) { + const bool *state = SDL_GetKeyboardState(NULL); + if (state) { // Reload ui - bool f5_state = glfwGetKey(window, GLFW_KEY_F5); - if (f5_state == GLFW_PRESS && !f5_was_pressed) { + bool f5_state = state[SDL_SCANCODE_F5]; + if (f5_state && !f5_was_pressed) { f5_was_pressed = true; reload_doc(); - } else if (f5_state == GLFW_RELEASE) { + } else if (!f5_state) { f5_was_pressed = false; } - // Toggle debugger window - bool f8_state = glfwGetKey(window, GLFW_KEY_F8); - if (f8_state == GLFW_PRESS && !f8_was_pressed) { + bool f8_state = state[SDL_SCANCODE_F8]; + if (f8_state && !f8_was_pressed) { f8_was_pressed = true; bool is_visible = Rml::Debugger::IsVisible(); Rml::Debugger::SetVisible(!is_visible); - } else if (f8_state == GLFW_RELEASE) { + } else if (!f8_state) { f8_was_pressed = false; } } } - int main() { std::cout << "[INFO] Starting CritterFolio...\n"; - is_initalized = initialize(); if (!is_initalized) { std::cout << "[ERROR] Failed to initialize, shutting down.\n"; shutdown(); return 1; } - is_running = true; - Rml::DataModelHandle app_data_handle; if (!setup_data_binding(ctx, app_data_handle, app_data, critter_list, critters)) { shutdown(); return 1; } - if (!load_document()) { shutdown(); return 1; } std::cout << "[INFO] Main page loaded.\n"; - - while (is_running) { is_running = Backend::ProcessEvents(ctx); - handle_input(); - ctx->Update(); Backend::BeginFrame(); ctx->Render(); Backend::PresentFrame(); } - shutdown(); return 0; -} \ No newline at end of file +}