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

This commit is contained in:
Zed A. Shaw 2025-04-14 23:06:08 -04:00
parent 19b9a4affd
commit 84a5f06dac
5 changed files with 24 additions and 25 deletions

View file

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