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.

This commit is contained in:
Zed A. Shaw 2025-07-22 12:59:10 -04:00
parent 31a02505aa
commit 5a7c096b52
9 changed files with 76 additions and 29 deletions

View file

@ -2,6 +2,7 @@
#include "guecs/sfml/backend.hpp"
#include <cassert>
#include <iostream>
#include <fmt/core.h>
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<sf::Sprite>(
*sprite_texture.texture,
sprite_texture.sprite->getTextureRect());
sf::IntRect rect{{0,0},sprite_texture.frame_size};
sprite = make_shared<sf::Sprite>(*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<sf::Sprite>(*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<sf::RectangleShape>(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<sf::Sprite>(
*sprite_texture.texture,
sprite_texture.sprite->getTextureRect());
sf::IntRect rect{{0,0},sprite_texture.frame_size};
sprite = make_shared<sf::Sprite>(*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<sf::Clock>();
}
@ -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) {