diff --git a/src/ShaderNode/DataModels/VecBinOp.cpp b/src/ShaderNode/DataModels/VecBinOp.cpp index 8f63c2642..3ea2838f3 100644 --- a/src/ShaderNode/DataModels/VecBinOp.cpp +++ b/src/ShaderNode/DataModels/VecBinOp.cpp @@ -71,3 +71,35 @@ void VecSub::ApplyOp(const std::uint8_t* left, const std::uint8_t* right, std::u output[i] = static_cast(sub); } } + +QString VecDiv::caption() const +{ + static QString caption = "Vector divide"; + return caption; +} + + +QString VecDiv::name() const +{ + static QString name = "vec_div"; + return name; +} + +void VecDiv::ApplyOp(const std::uint8_t* left, const std::uint8_t* right, std::uint8_t* output, std::size_t pixelCount) +{ + for (std::size_t i = 0; i < pixelCount; ++i) + { + unsigned int lValue = left[i]; + unsigned int rValue = right[i]; + + unsigned res; + if (rValue != 0) + res = lValue / rValue; + else if (lValue != 0) + res = 0xFF; //< positive / 0 = +inf, which we clamp to 0xFF + else + res = 0; //< 0 / 0 = NaN, which we set to zero + + output[i] = static_cast(res); + } +} diff --git a/src/ShaderNode/DataModels/VecBinOp.hpp b/src/ShaderNode/DataModels/VecBinOp.hpp index f8bebc667..0fbb93f9c 100644 --- a/src/ShaderNode/DataModels/VecBinOp.hpp +++ b/src/ShaderNode/DataModels/VecBinOp.hpp @@ -67,6 +67,17 @@ class VecSub : public VecBinOp void ApplyOp(const std::uint8_t* left, const std::uint8_t* right, std::uint8_t* output, std::size_t pixelCount) override; }; +class VecDiv : public VecBinOp +{ + public: + using VecBinOp::VecBinOp; + + QString caption() const override; + QString name() const override; + + void ApplyOp(const std::uint8_t* left, const std::uint8_t* right, std::uint8_t* output, std::size_t pixelCount) override; +}; + #include #endif diff --git a/src/ShaderNode/ShaderGraph.cpp b/src/ShaderNode/ShaderGraph.cpp index fd530e504..38d1a8dcb 100644 --- a/src/ShaderNode/ShaderGraph.cpp +++ b/src/ShaderNode/ShaderGraph.cpp @@ -268,6 +268,7 @@ std::shared_ptr ShaderGraph::BuildRegistry() RegisterShaderNode(*this, registry, "Texture"); RegisterShaderNode(*this, registry, "Texture"); RegisterShaderNode(*this, registry, "Vector operations"); + RegisterShaderNode(*this, registry, "Vector operations"); RegisterShaderNode(*this, registry, "Vector operations"); RegisterShaderNode(*this, registry, "Vector operations"); RegisterShaderNode(*this, registry, "Constants");