From 5a7c096b5281906daba57432eefb185a598ebc3d Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 22 Jul 2025 12:59:10 -0400 Subject: [PATCH] Fix up the backend so it has sane names like get_sprite and get_icon, then implemented a guecs::Icon for icons. Those don't scale and typically have other properties different from a Sprite. --- demos/clicker_game.cpp | 3 +- include/guecs/sfml/backend.hpp | 5 ++-- include/guecs/sfml/components.hpp | 16 ++++++---- include/guecs/sfml/textures.hpp | 1 + include/guecs/theme.hpp | 7 +++-- src/guecs/sfml/backend.cpp | 10 +++++-- src/guecs/sfml/components.cpp | 49 +++++++++++++++++++++++-------- src/guecs/sfml/textures.cpp | 5 ++-- src/guecs/ui.cpp | 9 ++++++ 9 files changed, 76 insertions(+), 29 deletions(-) diff --git a/demos/clicker_game.cpp b/demos/clicker_game.cpp index b2e99b9..bb6cda7 100644 --- a/demos/clicker_game.cpp +++ b/demos/clicker_game.cpp @@ -93,8 +93,7 @@ struct ClickerUI { if(name != "clicker") { $gui.set(id, {}); $gui.set(id, {}); - $gui.set(id, { "clicker_treat_bone" }); - fmt::println("button dim: {},{}", cell.w, cell.h); + $gui.set(id, { "clicker_treat_bone" }); $gui.set(id, { [&](auto, auto) { handle_button(Event::A_BUTTON); } }); diff --git a/include/guecs/sfml/backend.hpp b/include/guecs/sfml/backend.hpp index fed18f8..fc36f35 100644 --- a/include/guecs/sfml/backend.hpp +++ b/include/guecs/sfml/backend.hpp @@ -9,10 +9,11 @@ namespace sfml { public: Backend(); - guecs::SpriteTexture texture_get(const string& name); + guecs::SpriteTexture get_sprite(const string& name); + guecs::SpriteTexture get_icon(const string& name); void sound_play(const string& name); void sound_stop(const string& name); - std::shared_ptr shader_get(const std::string& name); + std::shared_ptr get_shader(const std::string& name); bool shader_updated(); guecs::Theme theme(); }; diff --git a/include/guecs/sfml/components.hpp b/include/guecs/sfml/components.hpp index ca8f4fc..a323371 100644 --- a/include/guecs/sfml/components.hpp +++ b/include/guecs/sfml/components.hpp @@ -38,12 +38,16 @@ namespace guecs { }; struct Sprite { - // either you set a filename here, - // or some kind of config, - // or a callback that does the loading, - // or a virtual function and you subclass - // or there's a static config function you call once, - // that's passed an object with all the necessary gear + string name; + int padding = THEME.PADDING; + std::shared_ptr sprite = nullptr; + + void init(lel::Cell &cell); + void update(const string& new_name); + void render(sf::RenderWindow& window, sf::Shader *shader_ptr); + }; + + struct Icon { string name; int padding = THEME.PADDING; std::shared_ptr sprite = nullptr; diff --git a/include/guecs/sfml/textures.hpp b/include/guecs/sfml/textures.hpp index 7be99f2..d0d3c2b 100644 --- a/include/guecs/sfml/textures.hpp +++ b/include/guecs/sfml/textures.hpp @@ -11,6 +11,7 @@ namespace textures { struct SpriteTexture { std::shared_ptr sprite = nullptr; std::shared_ptr texture = nullptr; + sf::Vector2i frame_size; }; struct TextureManager { diff --git a/include/guecs/theme.hpp b/include/guecs/theme.hpp index c5ff6ba..fd04c93 100644 --- a/include/guecs/theme.hpp +++ b/include/guecs/theme.hpp @@ -35,17 +35,20 @@ namespace guecs { struct SpriteTexture { std::shared_ptr sprite = nullptr; std::shared_ptr texture = nullptr; + sf::Vector2i frame_size; }; class Backend { public: - virtual SpriteTexture texture_get(const string& name) = 0; + virtual SpriteTexture get_sprite(const string& name) = 0; + + virtual SpriteTexture get_icon(const string& name) = 0; virtual void sound_play(const string& name) = 0; virtual void sound_stop(const string& name) = 0; - virtual std::shared_ptr shader_get(const std::string& name) = 0; + virtual std::shared_ptr get_shader(const std::string& name) = 0; virtual bool shader_updated() = 0; virtual Theme theme() = 0; diff --git a/src/guecs/sfml/backend.cpp b/src/guecs/sfml/backend.cpp index 424f54e..f90ee12 100644 --- a/src/guecs/sfml/backend.cpp +++ b/src/guecs/sfml/backend.cpp @@ -4,9 +4,13 @@ #include "guecs/sfml/textures.hpp" namespace sfml { - guecs::SpriteTexture Backend::texture_get(const string& name) { + guecs::SpriteTexture Backend::get_sprite(const string& name) { auto sp = textures::get(name); - return {sp.sprite, sp.texture}; + return {sp.sprite, sp.texture, sp.frame_size}; + } + + guecs::SpriteTexture Backend::get_icon(const string& name) { + return get_sprite(name); } Backend::Backend() { @@ -23,7 +27,7 @@ namespace sfml { sound::stop(name); } - std::shared_ptr Backend::shader_get(const std::string& name) { + std::shared_ptr Backend::get_shader(const std::string& name) { return shaders::get(name); } diff --git a/src/guecs/sfml/components.cpp b/src/guecs/sfml/components.cpp index 1f1f349..064cc3a 100644 --- a/src/guecs/sfml/components.cpp +++ b/src/guecs/sfml/components.cpp @@ -2,6 +2,7 @@ #include "guecs/sfml/backend.hpp" #include #include +#include namespace guecs { using std::make_shared; @@ -36,18 +37,17 @@ namespace guecs { void Sprite::update(const string& new_name) { if(new_name != name) { name = new_name; - auto sprite_texture = BACKEND->texture_get(name); + auto sprite_texture = BACKEND->get_sprite(name); sprite->setTexture(*sprite_texture.texture); - sprite->setTextureRect(sprite_texture.sprite->getTextureRect()); + sprite->setTextureRect({{0,0},sprite_texture.frame_size}); } } void Sprite::init(lel::Cell &cell) { - auto sprite_texture = BACKEND->texture_get(name); + auto sprite_texture = BACKEND->get_sprite(name); - sprite = make_shared( - *sprite_texture.texture, - sprite_texture.sprite->getTextureRect()); + sf::IntRect rect{{0,0},sprite_texture.frame_size}; + sprite = make_shared(*sprite_texture.texture, rect); sprite->setPosition({ float(cell.x + padding), @@ -64,6 +64,32 @@ namespace guecs { window.draw(*sprite, shader_ptr); } + void Icon::update(const string& new_name) { + if(new_name != name) { + name = new_name; + auto sprite_texture = BACKEND->get_icon(name); + sprite->setTexture(*sprite_texture.texture); + sprite->setTextureRect({{0,0},sprite_texture.frame_size}); + } + } + + void Icon::init(lel::Cell &cell) { + auto sprite_texture = BACKEND->get_icon(name); + + sf::IntRect rect{{0,0},sprite_texture.frame_size}; + fmt::println("ICON SIZE: {},{}; {},{}", + rect.position.x, rect.position.y, + rect.size.x, rect.size.y); + sprite = make_shared(*sprite_texture.texture, rect); + + sprite->setPosition({ float(cell.x + padding), float(cell.y + padding)}); + } + + void Icon::render(sf::RenderWindow& window, sf::Shader *shader_ptr) { + window.draw(*sprite, shader_ptr); + } + + void Rectangle::init(lel::Cell& cell) { sf::Vector2f size{float(cell.w) - padding * 2, float(cell.h) - padding * 2}; if(shape == nullptr) shape = make_shared(size); @@ -126,11 +152,10 @@ namespace guecs { } void Background::set_sprite(const std::string& name, bool stretch) { - auto sprite_texture = BACKEND->texture_get(name); + auto sprite_texture = BACKEND->get_sprite(name); - sprite = make_shared( - *sprite_texture.texture, - sprite_texture.sprite->getTextureRect()); + sf::IntRect rect{{0,0},sprite_texture.frame_size}; + sprite = make_shared(*sprite_texture.texture, rect); sprite->setPosition({float(x), float(y)}); @@ -154,7 +179,7 @@ namespace guecs { } void Effect::init(lel::Cell &cell) { - $shader = BACKEND->shader_get(name); + $shader = BACKEND->get_shader(name); $shader->setUniform("u_resolution", sf::Vector2f({float(cell.w), float(cell.h)})); $clock = std::make_shared(); } @@ -182,7 +207,7 @@ namespace guecs { sf::Shader *shader_ptr = nullptr; if(BACKEND->shader_updated()) { - $shader = BACKEND->shader_get(name); + $shader = BACKEND->get_shader(name); } if($active) { diff --git a/src/guecs/sfml/textures.cpp b/src/guecs/sfml/textures.cpp index c4cecdc..9a90105 100644 --- a/src/guecs/sfml/textures.cpp +++ b/src/guecs/sfml/textures.cpp @@ -23,9 +23,10 @@ namespace textures { int width = settings["frame_width"]; int height = settings["frame_height"]; - sprite->setTextureRect({{0,0}, {width, height}}); - TMGR.sprite_textures.try_emplace(name, sprite, texture); + sf::Vector2i frame_size{width, height}; + sprite->setTextureRect({{0,0}, frame_size}); + TMGR.sprite_textures.try_emplace(name, sprite, texture, frame_size); } } diff --git a/src/guecs/ui.cpp b/src/guecs/ui.cpp index 620a68a..b1824c6 100644 --- a/src/guecs/ui.cpp +++ b/src/guecs/ui.cpp @@ -93,6 +93,10 @@ namespace guecs { query([&](auto, auto &cell, auto &sprite) { sprite.init(cell); }); + + query([&](auto, auto &cell, auto &icon) { + icon.init(cell); + }); } void UI::debug_layout(sf::RenderWindow& window) { @@ -138,6 +142,11 @@ namespace guecs { sprite.render(window, shader_ptr); }); + query([&](auto ent, auto& icon) { + auto shader_ptr = find_shader(ent, false); + icon.render(window, shader_ptr); + }); + query