Keishiki/Keishiki/ShaderGraph.cpp
2024-06-22 07:19:34 -04:00

43 lines
2 KiB
C++

#include <ShaderGraph.h>
//#include "srell.hpp"
namespace {
K::String BuildNode(const K::ShaderGraph::NodeInstance& n) {
K::String r = n.node->shader_template;
// for (u32 i = 0; i < n.node->inputs.size(); i++) {
// K::String sub{};
// if (n.inputs[i] != nullptr)
// sub = BuildNode(*n.inputs[i]);
// else
// sub = K::ShaderGraph::VarToString(n.values[i]); // should be made into uniform instead !!
// r = srell::regex_replace(r, srell::regex("\\{" + std::to_string(i) + "\\}"), sub);
// }
return r;
}
}
namespace K::ShaderGraph {
T_Map<T_Count>::type ExpandVariant(u32 i) {
static T_Map<T_Count>::type table[] = { f32{}, i32{}, RGBA{}, XY{}, XYZ{} };
return table[i];
}
String VarToString(const T_Map<T_Count>::type& var) {
return std::visit([](auto&& arg) -> String {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, T_Map<T_Float>::type>)
return std::to_string(arg) + "f";
else if constexpr (std::is_same_v<T, T_Map<T_Int>::type>)
return std::to_string(arg);
else if constexpr (std::is_same_v<T, T_Map<T_RGBA>::type>)
return "vec4(" + std::to_string(arg.r) + "," + std::to_string(arg.g) + "," + std::to_string(arg.b) + "," + std::to_string(arg.a) + ")";
else if constexpr (std::is_same_v<T, T_Map<T_XY>::type>)
return "vec2(" + std::to_string(arg.x) + "," + std::to_string(arg.y) + ")";
else if constexpr (std::is_same_v<T, T_Map<T_XYZ>::type>)
return "vec3(" + std::to_string(arg.x) + "," + std::to_string(arg.y) + "," + std::to_string(arg.z) + ")";
}, var);
}
String ShaderGraph::GenerateShader() const {
if (RGBA_node->node->out_types[RGBA_node_out_index] != Type::T_RGBA) return {};
return BuildNode(*RGBA_node);
}
}