lel-guecs/src/guecs/sfml/shaders.cpp

77 lines
2.1 KiB
C++

#include "guecs/sfml/shaders.hpp"
#include "guecs/sfml/config.hpp"
#include <SFML/Graphics/Image.hpp>
#include <fmt/core.h>
#include <memory>
namespace shaders {
using std::shared_ptr, std::make_shared;
static ShaderManager SMGR;
static bool INITIALIZED = false;
static int VERSION = 0;
inline void configure_shader_defaults(std::shared_ptr<sf::Shader> ptr) {
ptr->setUniform("source", sf::Shader::CurrentTexture);
}
bool load_shader(std::string name, nlohmann::json& settings) {
auto file_name = settings["file_name"];
auto file_path = Config::path_to(file_name);
auto ptr = std::make_shared<sf::Shader>();
bool good = ptr->loadFromFile(file_path, sf::Shader::Type::Fragment);
if(good) {
configure_shader_defaults(ptr);
SMGR.shaders.try_emplace(name, name, file_name, ptr);
}
return good;
}
void init() {
if(!INITIALIZED) {
assert(sf::Shader::isAvailable() && "no shaders?!");
INITIALIZED = true;
Config config("assets/shaders.json");
bool good = load_shader("ERROR", config["ERROR"]);
assert(good && "Failed to load ERROR shader. Look in assets/shaders.json");
for(auto& [name, settings] : config.json().items()) {
if(name == "ERROR") continue;
assert(!SMGR.shaders.contains(name) &&
"shader name duplicated in assets/shaders.json");
good = load_shader(name, settings);
if(!good) {
fmt::println("[SOUND] failed to load shader {}", name);
SMGR.shaders.insert_or_assign(name, SMGR.shaders.at("ERROR"));
}
}
}
}
std::shared_ptr<sf::Shader> get(const std::string& name) {
assert(INITIALIZED && "you forgot to shaders::init()");
assert(SMGR.shaders.contains(name) &&
"shader name not in assets/shaders.json");
auto& rec = SMGR.shaders.at(name);
return rec.ptr;
}
int reload() {
VERSION++;
INITIALIZED = false;
SMGR.shaders.clear();
init();
return VERSION;
}
bool updated(int my_version) {
return my_version != VERSION;
}
int version() {
return VERSION;
}
};