Shaders now are managed by a manger that can do hot reloading and it also will detect a bad shader and use an ERROR shader so you know it's busted visually.

This commit is contained in:
Zed A. Shaw 2025-04-13 17:11:21 -04:00
parent a5b8e411e3
commit 35ced58cc9
14 changed files with 144 additions and 13 deletions

View file

@ -1,4 +1,5 @@
#include "guecs.hpp"
#include "shaders.hpp"
namespace guecs {
@ -66,31 +67,31 @@ namespace guecs {
}
void Shader::init(lel::Cell &cell) {
ptr = std::make_shared<sf::Shader>();
bool good = ptr->loadFromFile(name, sf::Shader::Type::Fragment);
dbc::check(good, fmt::format("failed to load shader {}", name));
ptr->setUniform("u_resolution", sf::Vector2f({float(cell.w), float(cell.h)}));
auto 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() {
auto shader = shaders::get(name);
sf::Time u_time = clock->getElapsedTime();
float current_time = u_time.asSeconds();
if(current_time < u_time_end) {
ptr->setUniform("u_time", current_time);
shader->setUniform("u_time", current_time);
} else {
active = false;
}
}
void Shader::run() {
auto shader = shaders::get(name);
active = true;
sf::Time u_time = clock->getElapsedTime();
u_time_end = u_time.asSeconds() + duration;
ptr->setUniform("u_duration", duration);
ptr->setUniform("u_time_end", u_time_end);
shader->setUniform("u_duration", duration);
shader->setUniform("u_time_end", u_time_end);
}
UI::UI() {