#include "sound.hpp" #include "ai.hpp" #include "animation.hpp" #include #include "shaders.hpp" #include "backend.hpp" #include "events.hpp" #include "constants.hpp" #include "gui/event_router.hpp" #include "constants.hpp" #include #include "gui/event_router.hpp" #include #include using namespace std::chrono_literals; 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|_|_]" "[_|_|_|_]"); 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); } }; int main(int argc, char* argv[]) { shaders::init(); components::init(); sfml::Backend backend; guecs::init(&backend); ai::init("ai"); animation::init(); 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; 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); } return 0; }