feat: post-processing effects

This commit is contained in:
MihailRis
2025-04-05 00:41:25 +03:00
parent 22e97b1766
commit ba170035ef
19 changed files with 216 additions and 84 deletions
+54 -9
View File
@@ -60,13 +60,7 @@ assetload::postfunc assetload::texture(
}
}
assetload::postfunc assetload::shader(
AssetsLoader*,
const ResPaths& paths,
const std::string& filename,
const std::string& name,
const std::shared_ptr<AssetCfg>&
) {
static auto process_program(const ResPaths& paths, const std::string& filename) {
io::path vertexFile = paths.find(filename + ".glslv");
io::path fragmentFile = paths.find(filename + ".glslf");
@@ -75,8 +69,25 @@ assetload::postfunc assetload::shader(
auto& preprocessor = *Shader::preprocessor;
vertexSource = preprocessor.process(vertexFile, vertexSource).code;
fragmentSource = preprocessor.process(fragmentFile, fragmentSource).code;
auto vertex = preprocessor.process(vertexFile, vertexSource);
auto fragment = preprocessor.process(fragmentFile, fragmentSource);
return std::make_pair(vertex, fragment);
}
assetload::postfunc assetload::shader(
AssetsLoader*,
const ResPaths& paths,
const std::string& filename,
const std::string& name,
const std::shared_ptr<AssetCfg>&
) {
auto [vertex, fragment] = process_program(paths, filename);
io::path vertexFile = paths.find(filename + ".glslv");
io::path fragmentFile = paths.find(filename + ".glslf");
std::string vertexSource = std::move(vertex.code);
std::string fragmentSource = std::move(fragment.code);
return [=](auto assets) {
assets->store(
@@ -91,6 +102,40 @@ assetload::postfunc assetload::shader(
};
}
assetload::postfunc assetload::posteffect(
AssetsLoader*,
const ResPaths& paths,
const std::string& file,
const std::string& name,
const std::shared_ptr<AssetCfg>& settings
) {
io::path effectFile = paths.find(file + ".glsl");
std::string effectSource = io::read_string(effectFile);
auto& preprocessor = *Shader::preprocessor;
preprocessor.addHeader(
"__effect__", preprocessor.process(effectFile, effectSource, true)
);
auto [vertex, fragment] = process_program(paths, SHADERS_FOLDER + "/effect");
auto params = std::move(fragment.params);
std::string vertexSource = std::move(vertex.code);
std::string fragmentSource = std::move(fragment.code);
return [=](auto assets) {
auto program = Shader::create(
effectFile.string(),
effectFile.string(),
vertexSource,
fragmentSource
);
assets->store(
std::make_shared<PostEffect>(std::move(program), params), name
);
};
}
static bool append_atlas(AtlasBuilder& atlas, const io::path& file) {
std::string name = file.stem();
// skip duplicates