Reworked the way shaders are configured to reduce the amount of times clicks on buttons cause the shared shaders to reset.

master
Zed A. Shaw 10 months ago
parent 19b9a4affd
commit 84a5f06dac
  1. 2
      combat_ui.cpp
  2. 21
      guecs.cpp
  3. 6
      guecs.hpp
  4. 4
      ritual_ui.cpp
  5. 16
      shaders.cpp

@ -18,7 +18,7 @@ namespace gui {
$gui.set<Sprite>(button, {"leather_pouch-128"}); $gui.set<Sprite>(button, {"leather_pouch-128"});
// $gui.set<Rectangle>(button, {}); // $gui.set<Rectangle>(button, {});
$gui.set<Label>(button, {label}); $gui.set<Label>(button, {label});
$gui.set<Shader>(button, {.duration=10.0f}); $gui.set<Effect>(button, {.duration=0.1f});
$gui.set<Clickable>(button, $gui.set<Clickable>(button,
guecs::make_action(*$level.world, event)); guecs::make_action(*$level.world, event));
} }

@ -66,34 +66,33 @@ namespace guecs {
shape->setFillColor(color); shape->setFillColor(color);
} }
void Shader::init(lel::Cell &cell) { void Effect::init(lel::Cell &cell) {
$shader_version = shaders::version(); $shader_version = shaders::version();
$shader = shaders::get(name); $shader = shaders::get(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>();
} }
void Shader::step() { void Effect::step() {
sf::Time cur_time = $clock->getElapsedTime(); sf::Time cur_time = $clock->getElapsedTime();
float u_time = cur_time.asSeconds(); float u_time = cur_time.asSeconds();
if(u_time < $u_time_end) { if(u_time < $u_time_end) {
$shader->setUniform("u_duration", duration);
$shader->setUniform("u_time_end", $u_time_end);
$shader->setUniform("u_time", u_time); $shader->setUniform("u_time", u_time);
} else { } else {
$active = false; $active = false;
} }
} }
void Shader::run() { void Effect::run() {
$shader = checkout_ptr();
$active = true; $active = true;
sf::Time u_time = $clock->getElapsedTime(); sf::Time u_time = $clock->getElapsedTime();
$u_time_end = u_time.asSeconds() + duration; $u_time_end = u_time.asSeconds() + duration;
$shader->setUniform("u_duration", duration);
$shader->setUniform("u_time_end", $u_time_end);
} }
shared_ptr<sf::Shader> Shader::checkout_ptr() { shared_ptr<sf::Shader> Effect::checkout_ptr() {
if(shaders::updated($shader_version)) { if(shaders::updated($shader_version)) {
$shader = shaders::get(name); $shader = shaders::get(name);
$shader_version = shaders::version(); $shader_version = shaders::version();
@ -150,7 +149,7 @@ namespace guecs {
rect.init(cell); rect.init(cell);
}); });
$world.query<lel::Cell, Shader>([](auto, auto& cell, auto& shader) { $world.query<lel::Cell, Effect>([](auto, auto& cell, auto& shader) {
shader.init(cell); shader.init(cell);
}); });
@ -192,7 +191,7 @@ namespace guecs {
window.draw(*bg.shape); window.draw(*bg.shape);
} }
$world.query<Shader>([&](auto, auto& shader) { $world.query<Effect>([&](auto, auto& shader) {
if(shader.$active) shader.step(); if(shader.$active) shader.step();
}); });
@ -227,8 +226,8 @@ namespace guecs {
if((x >= cell.x && x <= cell.x + cell.w) && if((x >= cell.x && x <= cell.x + cell.w) &&
(y >= cell.y && y <= cell.y + cell.h)) (y >= cell.y && y <= cell.y + cell.h))
{ {
if($world.has<Shader>(ent)) { if($world.has<Effect>(ent)) {
auto& shader = $world.get<Shader>(ent); auto& shader = $world.get<Effect>(ent);
shader.run(); shader.run();
} }

@ -82,7 +82,7 @@ namespace guecs {
std::string name; std::string name;
}; };
struct Shader { struct Effect {
float duration = 0.1f; float duration = 0.1f;
std::string name{"ui_shader"}; std::string name{"ui_shader"};
float $u_time_end = 0.0; float $u_time_end = 0.0;
@ -198,8 +198,8 @@ namespace guecs {
void render_helper(sf::RenderWindow& window, DinkyECS::Entity ent, bool is_shape, T& target) { void render_helper(sf::RenderWindow& window, DinkyECS::Entity ent, bool is_shape, T& target) {
sf::Shader *shader_ptr = nullptr; sf::Shader *shader_ptr = nullptr;
if($world.has<Shader>(ent)) { if($world.has<Effect>(ent)) {
auto& shader = $world.get<Shader>(ent); auto& shader = $world.get<Effect>(ent);
if(shader.$active) { if(shader.$active) {
auto ptr = shader.checkout_ptr(); auto ptr = shader.checkout_ptr();

@ -42,7 +42,7 @@ namespace gui {
auto button = $gui.entity(name); auto button = $gui.entity(name);
if(name == "circle_area") { if(name == "circle_area") {
$gui.set<Shader>(button, {0.4f}); $gui.set<Effect>(button, {0.4f});
$gui.set<Sprite>(button, {"the_ritual_circle"}); $gui.set<Sprite>(button, {"the_ritual_circle"});
$gui.set<Clickable>(button, { $gui.set<Clickable>(button, {
[&](auto ent, auto){ ritual_circle_clicked(ent); } [&](auto ent, auto){ ritual_circle_clicked(ent); }
@ -50,7 +50,7 @@ namespace gui {
} else if(name.starts_with("inv_slot")) { } else if(name.starts_with("inv_slot")) {
$gui.set<Sprite>(button, { $gui.set<Sprite>(button, {
fmt::format("{}-64", junk_list[button % junk_list.size()])}); fmt::format("{}-64", junk_list[button % junk_list.size()])});
$gui.set<Shader>(button, {0.4f}); $gui.set<Effect>(button, {0.4f});
$gui.set<Clickable>(button, { $gui.set<Clickable>(button, {
[&](auto ent, auto){ inv_slot_clicked(ent); } [&](auto ent, auto){ inv_slot_clicked(ent); }
}); });

@ -7,16 +7,16 @@
#include <memory> #include <memory>
namespace shaders { namespace shaders {
using std::shared_ptr, std::make_shared; using std::shared_ptr, std::make_shared;
static ShaderManager SMGR; static ShaderManager SMGR;
static bool INITIALIZED = false; static bool INITIALIZED = false;
static int VERSION = 0; static int VERSION = 0;
bool load_shader(std::string name, nlohmann::json& settings) { bool load_shader(std::string name, nlohmann::json& settings) {
std::string file_name = settings["file_name"]; std::string file_name = settings["file_name"];
auto ptr = std::make_shared<sf::Shader>(); auto ptr = std::make_shared<sf::Shader>();
bool good = ptr->loadFromFile(file_name, sf::Shader::Type::Fragment); bool good = ptr->loadFromFile(file_name, sf::Shader::Type::Fragment);
if(good) SMGR.shaders.try_emplace(name, name, file_name, ptr); if(good) SMGR.shaders.try_emplace(name, name, file_name, ptr);
return good; return good;
} }