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:
parent
31a02505aa
commit
5a7c096b52
9 changed files with 76 additions and 29 deletions
|
@ -93,8 +93,7 @@ struct ClickerUI {
|
||||||
if(name != "clicker") {
|
if(name != "clicker") {
|
||||||
$gui.set<guecs::Rectangle>(id, {});
|
$gui.set<guecs::Rectangle>(id, {});
|
||||||
$gui.set<guecs::Effect>(id, {});
|
$gui.set<guecs::Effect>(id, {});
|
||||||
$gui.set<guecs::Sprite>(id, { "clicker_treat_bone" });
|
$gui.set<guecs::Icon>(id, { "clicker_treat_bone" });
|
||||||
fmt::println("button dim: {},{}", cell.w, cell.h);
|
|
||||||
$gui.set<guecs::Clickable>(id, {
|
$gui.set<guecs::Clickable>(id, {
|
||||||
[&](auto, auto) { handle_button(Event::A_BUTTON); }
|
[&](auto, auto) { handle_button(Event::A_BUTTON); }
|
||||||
});
|
});
|
||||||
|
|
|
@ -9,10 +9,11 @@ namespace sfml {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Backend();
|
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_play(const string& name);
|
||||||
void sound_stop(const string& name);
|
void sound_stop(const string& name);
|
||||||
std::shared_ptr<sf::Shader> shader_get(const std::string& name);
|
std::shared_ptr<sf::Shader> get_shader(const std::string& name);
|
||||||
bool shader_updated();
|
bool shader_updated();
|
||||||
guecs::Theme theme();
|
guecs::Theme theme();
|
||||||
};
|
};
|
||||||
|
|
|
@ -38,12 +38,16 @@ namespace guecs {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Sprite {
|
struct Sprite {
|
||||||
// either you set a filename here,
|
string name;
|
||||||
// or some kind of config,
|
int padding = THEME.PADDING;
|
||||||
// or a callback that does the loading,
|
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
||||||
// or a virtual function and you subclass
|
|
||||||
// or there's a static config function you call once,
|
void init(lel::Cell &cell);
|
||||||
// that's passed an object with all the necessary gear
|
void update(const string& new_name);
|
||||||
|
void render(sf::RenderWindow& window, sf::Shader *shader_ptr);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Icon {
|
||||||
string name;
|
string name;
|
||||||
int padding = THEME.PADDING;
|
int padding = THEME.PADDING;
|
||||||
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
||||||
|
|
|
@ -11,6 +11,7 @@ namespace textures {
|
||||||
struct SpriteTexture {
|
struct SpriteTexture {
|
||||||
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
||||||
std::shared_ptr<sf::Texture> texture = nullptr;
|
std::shared_ptr<sf::Texture> texture = nullptr;
|
||||||
|
sf::Vector2i frame_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TextureManager {
|
struct TextureManager {
|
||||||
|
|
|
@ -35,17 +35,20 @@ namespace guecs {
|
||||||
struct SpriteTexture {
|
struct SpriteTexture {
|
||||||
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
std::shared_ptr<sf::Sprite> sprite = nullptr;
|
||||||
std::shared_ptr<sf::Texture> texture = nullptr;
|
std::shared_ptr<sf::Texture> texture = nullptr;
|
||||||
|
sf::Vector2i frame_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Backend {
|
class Backend {
|
||||||
public:
|
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_play(const string& name) = 0;
|
||||||
|
|
||||||
virtual void sound_stop(const string& name) = 0;
|
virtual void sound_stop(const string& name) = 0;
|
||||||
|
|
||||||
virtual std::shared_ptr<sf::Shader> shader_get(const std::string& name) = 0;
|
virtual std::shared_ptr<sf::Shader> get_shader(const std::string& name) = 0;
|
||||||
|
|
||||||
virtual bool shader_updated() = 0;
|
virtual bool shader_updated() = 0;
|
||||||
virtual Theme theme() = 0;
|
virtual Theme theme() = 0;
|
||||||
|
|
|
@ -4,9 +4,13 @@
|
||||||
#include "guecs/sfml/textures.hpp"
|
#include "guecs/sfml/textures.hpp"
|
||||||
|
|
||||||
namespace sfml {
|
namespace sfml {
|
||||||
guecs::SpriteTexture Backend::texture_get(const string& name) {
|
guecs::SpriteTexture Backend::get_sprite(const string& name) {
|
||||||
auto sp = textures::get(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() {
|
Backend::Backend() {
|
||||||
|
@ -23,7 +27,7 @@ namespace sfml {
|
||||||
sound::stop(name);
|
sound::stop(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<sf::Shader> Backend::shader_get(const std::string& name) {
|
std::shared_ptr<sf::Shader> Backend::get_shader(const std::string& name) {
|
||||||
return shaders::get(name);
|
return shaders::get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "guecs/sfml/backend.hpp"
|
#include "guecs/sfml/backend.hpp"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <fmt/core.h>
|
||||||
|
|
||||||
namespace guecs {
|
namespace guecs {
|
||||||
using std::make_shared;
|
using std::make_shared;
|
||||||
|
@ -36,18 +37,17 @@ namespace guecs {
|
||||||
void Sprite::update(const string& new_name) {
|
void Sprite::update(const string& new_name) {
|
||||||
if(new_name != name) {
|
if(new_name != name) {
|
||||||
name = new_name;
|
name = new_name;
|
||||||
auto sprite_texture = BACKEND->texture_get(name);
|
auto sprite_texture = BACKEND->get_sprite(name);
|
||||||
sprite->setTexture(*sprite_texture.texture);
|
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) {
|
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>(
|
sf::IntRect rect{{0,0},sprite_texture.frame_size};
|
||||||
*sprite_texture.texture,
|
sprite = make_shared<sf::Sprite>(*sprite_texture.texture, rect);
|
||||||
sprite_texture.sprite->getTextureRect());
|
|
||||||
|
|
||||||
sprite->setPosition({
|
sprite->setPosition({
|
||||||
float(cell.x + padding),
|
float(cell.x + padding),
|
||||||
|
@ -64,6 +64,32 @@ namespace guecs {
|
||||||
window.draw(*sprite, shader_ptr);
|
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) {
|
void Rectangle::init(lel::Cell& cell) {
|
||||||
sf::Vector2f size{float(cell.w) - padding * 2, float(cell.h) - padding * 2};
|
sf::Vector2f size{float(cell.w) - padding * 2, float(cell.h) - padding * 2};
|
||||||
if(shape == nullptr) shape = make_shared<sf::RectangleShape>(size);
|
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) {
|
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>(
|
sf::IntRect rect{{0,0},sprite_texture.frame_size};
|
||||||
*sprite_texture.texture,
|
sprite = make_shared<sf::Sprite>(*sprite_texture.texture, rect);
|
||||||
sprite_texture.sprite->getTextureRect());
|
|
||||||
|
|
||||||
sprite->setPosition({float(x), float(y)});
|
sprite->setPosition({float(x), float(y)});
|
||||||
|
|
||||||
|
@ -154,7 +179,7 @@ namespace guecs {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Effect::init(lel::Cell &cell) {
|
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)}));
|
$shader->setUniform("u_resolution", sf::Vector2f({float(cell.w), float(cell.h)}));
|
||||||
$clock = std::make_shared<sf::Clock>();
|
$clock = std::make_shared<sf::Clock>();
|
||||||
}
|
}
|
||||||
|
@ -182,7 +207,7 @@ namespace guecs {
|
||||||
sf::Shader *shader_ptr = nullptr;
|
sf::Shader *shader_ptr = nullptr;
|
||||||
|
|
||||||
if(BACKEND->shader_updated()) {
|
if(BACKEND->shader_updated()) {
|
||||||
$shader = BACKEND->shader_get(name);
|
$shader = BACKEND->get_shader(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($active) {
|
if($active) {
|
||||||
|
|
|
@ -23,9 +23,10 @@ namespace textures {
|
||||||
|
|
||||||
int width = settings["frame_width"];
|
int width = settings["frame_width"];
|
||||||
int height = settings["frame_height"];
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,10 @@ namespace guecs {
|
||||||
query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) {
|
query<lel::Cell, Sprite>([&](auto, auto &cell, auto &sprite) {
|
||||||
sprite.init(cell);
|
sprite.init(cell);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
query<lel::Cell, Icon>([&](auto, auto &cell, auto &icon) {
|
||||||
|
icon.init(cell);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void UI::debug_layout(sf::RenderWindow& window) {
|
void UI::debug_layout(sf::RenderWindow& window) {
|
||||||
|
@ -138,6 +142,11 @@ namespace guecs {
|
||||||
sprite.render(window, shader_ptr);
|
sprite.render(window, shader_ptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
query<Icon>([&](auto ent, auto& icon) {
|
||||||
|
auto shader_ptr = find_shader(ent, false);
|
||||||
|
icon.render(window, shader_ptr);
|
||||||
|
});
|
||||||
|
|
||||||
query<Label>([&](auto ent, auto& text) {
|
query<Label>([&](auto ent, auto& text) {
|
||||||
auto shader_ptr = find_shader(ent, false);
|
auto shader_ptr = find_shader(ent, false);
|
||||||
text.render(window, shader_ptr);
|
text.render(window, shader_ptr);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue