mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-06 11:31:49 +00:00
feat: post-effects array parameters & add gfx.posteffects.set_array & make shadows opacity depending on clouds opacity
This commit is contained in:
parent
02a91e0b72
commit
436a89b066
14 changed files with 223 additions and 78 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue