feat: post-effects array parameters & add gfx.posteffects.set_array & make shadows opacity depending on clouds opacity

This commit is contained in:
MihailRis 2025-06-14 20:06:05 +03:00
parent 02a91e0b72
commit 436a89b066
14 changed files with 223 additions and 78 deletions

View file

@ -2,11 +2,14 @@
#include "Shader.hpp"
#include "data/dv_util.hpp"
#include "debug/Logger.hpp"
static debug::Logger logger("post-effect");
PostEffect::Param::Param() : type(Type::FLOAT) {}
PostEffect::Param::Param(Type type, Value defValue)
: type(type), defValue(defValue), value(defValue) {
PostEffect::Param::Param(Type type, Value defValue, bool array)
: type(type), defValue(defValue), value(defValue), array(array) {
}
PostEffect::PostEffect(
@ -24,21 +27,53 @@ Shader& PostEffect::use() {
if (!param.dirty) {
continue;
}
switch (param.type) {
case Param::Type::FLOAT:
shader->uniform1f(name, std::get<float>(param.value));
break;
case Param::Type::VEC2:
shader->uniform2f(name, std::get<glm::vec2>(param.value));
break;
case Param::Type::VEC3:
shader->uniform3f(name, std::get<glm::vec3>(param.value));
break;
case Param::Type::VEC4:
shader->uniform4f(name, std::get<glm::vec4>(param.value));
break;
default:
assert(false);
if (param.array) {
const auto& found = arrayValues.find(name);
if (found == arrayValues.end()) {
continue;
}
size_t size = found->second.size();
auto ibuffer = reinterpret_cast<const int*>(found->second.data());
auto fbuffer = reinterpret_cast<const float*>(found->second.data());
switch (param.type) {
case Param::Type::INT:
shader->uniform1v(name, size / sizeof(int), ibuffer);
break;
case Param::Type::FLOAT:
shader->uniform1v(name, size / sizeof(float), fbuffer);
break;
case Param::Type::VEC2:
shader->uniform2v(name, size / sizeof(glm::vec2), fbuffer);
break;
case Param::Type::VEC3:
shader->uniform3v(name, size / sizeof(glm::vec3), fbuffer);
break;
case Param::Type::VEC4:
shader->uniform4v(name, size / sizeof(glm::vec4), fbuffer);
break;
default:
assert(false);
}
} else {
switch (param.type) {
case Param::Type::INT:
shader->uniform1i(name, std::get<int>(param.value));
break;
case Param::Type::FLOAT:
shader->uniform1f(name, std::get<float>(param.value));
break;
case Param::Type::VEC2:
shader->uniform2f(name, std::get<glm::vec2>(param.value));
break;
case Param::Type::VEC3:
shader->uniform3f(name, std::get<glm::vec3>(param.value));
break;
case Param::Type::VEC4:
shader->uniform4f(name, std::get<glm::vec4>(param.value));
break;
default:
assert(false);
}
}
param.dirty = false;
}
@ -67,6 +102,9 @@ void PostEffect::setParam(const std::string& name, const dv::value& value) {
}
auto& param = found->second;
switch (param.type) {
case Param::Type::INT:
param.value = static_cast<int>(value.asInteger());
break;
case Param::Type::FLOAT:
param.value = static_cast<float>(value.asNumber());
break;
@ -82,3 +120,20 @@ void PostEffect::setParam(const std::string& name, const dv::value& value) {
}
param.dirty = true;
}
void PostEffect::setArray(const std::string& name, std::vector<ubyte>&& values) {
const auto& found = params.find(name);
if (found == params.end()) {
return;
}
auto& param = found->second;
if (!param.array) {
logger.warning() << "set_array is used on non-array effect parameter";
if (!values.empty()) {
setParam(name, values[0]);
}
return;
}
param.dirty = true;
arrayValues[name] = std::move(values);
}