From d81e127686115f3311d1b85ded54579092c58c91 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Sun, 18 Jan 2026 23:12:19 -0500 Subject: [PATCH] Get the FSM for the GUIworked out and fix the rendering so it works right. --- gui/fsm.cpp | 1 - gui/fsm.hpp | 1 - tools/animator.cpp | 154 ++++++++++++++++++++++++++++----------------- 3 files changed, 95 insertions(+), 61 deletions(-) diff --git a/gui/fsm.cpp b/gui/fsm.cpp index 48d755e..2f2a617 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -22,7 +22,6 @@ namespace gui { $window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"), $main_ui($window), $combat_ui(false), - $font{FONT_FILE_NAME}, $dnd_loot($status_ui, $loot_ui, $window, $router) { $window.setVerticalSyncEnabled(VSYNC); diff --git a/gui/fsm.hpp b/gui/fsm.hpp index 0e6fab7..55308b4 100644 --- a/gui/fsm.hpp +++ b/gui/fsm.hpp @@ -44,7 +44,6 @@ namespace gui { StatusUI $status_ui; MapViewUI $map_ui; LootUI $loot_ui; - sf::Font $font; gui::routing::Router $router; DNDLoot $dnd_loot; diff --git a/tools/animator.cpp b/tools/animator.cpp index f493b29..6836906 100644 --- a/tools/animator.cpp +++ b/tools/animator.cpp @@ -15,38 +15,103 @@ using namespace std::chrono_literals; -struct UI { - guecs::UI $ui; +namespace animator { + struct UI { + guecs::UI $ui; - void init(const std::string& sprite_name) { - $ui.position(0,0, SCREEN_WIDTH, SCREEN_HEIGHT); - $ui.layout( - "[*%(100,200)data|*%=(300,200)viewer|_|_]" - "[_|_|_|_]"); + void init(const std::string& sprite_name) { + $ui.position(0,0, SCREEN_WIDTH, SCREEN_HEIGHT); + $ui.layout( + "[*%(100,200)data|*%=(300,200)viewer|_|_]" + "[_|_|_|_]"); - for(auto& [name, cell] : $ui.cells()) { - auto comp = $ui.entity(name); - if(name == "viewer") { - $ui.set(comp, { - sprite_name, 0, false}); - } else { - $ui.set(comp, {}); - $ui.set(comp, {guecs::to_wstring(name)}); - $ui.set(comp, {}); + for(auto& [name, cell] : $ui.cells()) { + auto comp = $ui.entity(name); + if(name == "viewer") { + $ui.set(comp, { + sprite_name, 0, false}); + } else { + $ui.set(comp, {}); + $ui.set(comp, {guecs::to_wstring(name)}); + $ui.set(comp, {}); + } + } + + $ui.init(); + } + + void render(sf::RenderWindow& window) { + $ui.render(window); + } + + bool mouse(float x, float y, guecs::Modifiers mods) { + return $ui.mouse(x, y, mods); + } + }; + + enum class State { + START=__LINE__, + END=__LINE__, + }; + + struct FSM : public DeadSimpleFSM { + UI $ui; + gui::routing::Router $router; + sf::RenderWindow $window{sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Animation Crafting Tool"}; + + void init(const std::string &sprite_name) { + $ui.init(sprite_name); + $window.setVerticalSyncEnabled(VSYNC); + if(FRAME_LIMIT) $window.setFramerateLimit(FRAME_LIMIT); + $window.setPosition({0,0}); + } + + void event(game::Event ev, std::any data={}) { + switch($state) { + FSM_STATE(State, START, ev); + FSM_STATE(State, END, ev); } } - $ui.init(); - } + void START(game::Event ev) { + state(State::START); + } - void render(sf::RenderWindow& window) { - $ui.render(window); - } + void END(game::Event ev) { + } - bool mouse(float x, float y, guecs::Modifiers mods) { - return $ui.mouse(x, y, mods); - } -}; + void handle_keyboard_mouse() { + while(const auto ev = $window.pollEvent()) { + using enum game::Event; + auto gui_ev = $router.process_event(ev); + auto mouse_pos = $window.mapPixelToCoords($router.position); + + switch(gui_ev) { + case MOUSE_CLICK: + $ui.mouse(mouse_pos.x, mouse_pos.y, guecs::NO_MODS); + break; + case MOUSE_MOVE: + $ui.mouse(mouse_pos.x, mouse_pos.y, {1 << guecs::ModBit::hover}); + break; + case QUIT: + state(State::END); + default: + break; // ignored + } + } + } + + void render() { + $window.clear(); + $ui.render($window); + $window.display(); + } + + bool active() { + return !in_state(State::END); + } + }; +} int main(int argc, char* argv[]) { shaders::init(); @@ -59,44 +124,15 @@ int main(int argc, char* argv[]) { dbc::check(argc == 2, "USAGE: animator "); std::string sprite_name{argv[1]}; - sf::RenderWindow window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Animation Crafting Tool"); - window.setVerticalSyncEnabled(VSYNC); - - if(FRAME_LIMIT) window.setFramerateLimit(FRAME_LIMIT); - window.setPosition({0,0}); - sound::mute(true); sound::play("ambient_1", true); - UI main{}; - main.init(sprite_name); - gui::routing::Router router; + animator::FSM main; + main.init(argv[1]); - while(true) { - while(const auto ev = window.pollEvent()) { - using enum game::Event; - auto gui_ev = router.process_event(ev); - auto mouse_pos = window.mapPixelToCoords(router.position); - - switch(gui_ev) { - case MOUSE_CLICK: - main.mouse(mouse_pos.x, mouse_pos.y, guecs::NO_MODS); - break; - case MOUSE_MOVE: - main.mouse(mouse_pos.x, mouse_pos.y, {1 << guecs::ModBit::hover}); - break; - case QUIT: - return 0; - default: - break; // ignored - } - - window.clear(); - main.render(window); - window.display(); - } - - std::this_thread::sleep_for(10ms); + while(main.active()) { + main.render(); + main.handle_keyboard_mouse(); } return 0;