From 33b7a7a0fd0e3b58f40092f1ed5584314cf51321 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 11:03:54 +0300 Subject: [PATCH 1/6] Node Texture Gradient. --- .../shader/nodes/node_shader_tex_gradient.cc | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc index dc1b8046e084..aefc703ac27a 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc @@ -147,6 +147,52 @@ static void sh_node_gradient_tex_build_multi_function(NodeMultiFunctionBuilder & builder.construct_and_set_matching_fn(tex->gradient_type); } +NODE_SHADER_MATERIALX_BEGIN +#ifdef WITH_MATERIALX +{ + NodeTexGradient *tex = (NodeTexGradient *)node_->storage; + const int gradient_type = tex->gradient_type; + NodeItem vector = get_input_link("Vector", NodeItem::Type::Vector2); + if (!vector) { + vector = texcoord_node(); + } + NodeItem res = empty(); + NodeItem res_1 = empty(); + + switch (gradient_type) { + case SHD_BLEND_LINEAR: + res = vector.extract(0); + break; + case SHD_BLEND_QUADRATIC: + res = vector.extract(0); + res = res * res; + break; + case SHD_BLEND_EASING: + res = vector.extract(0).clamp(val(0.0f), val(1.0f)); + res_1 = res * res; + res = (val(3.0f) * res_1 - val(2.0f) * res_1 * res); + break; + case SHD_BLEND_DIAGONAL: + res = (vector.extract(0) + vector.extract(1)) * val(0.5f); + break; + case SHD_BLEND_RADIAL: + res = vector.extract(1).atan2(vector.extract(0)) / (val(float(M_PI * 2.0f))) + val(0.5f); + break; + case SHD_BLEND_QUADRATIC_SPHERE: + res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}); + res = (val(0.999999f) - res).max(val(0.0f)); + res = res * res; + break; + case SHD_BLEND_SPHERICAL: + res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}); + res = (val(0.999999f) - res).max(val(0.0f)); + break; + } + return res; +} +#endif +NODE_SHADER_MATERIALX_END + } // namespace blender::nodes::node_shader_tex_gradient_cc void register_node_type_sh_tex_gradient() @@ -163,6 +209,7 @@ void register_node_type_sh_tex_gradient() &ntype, "NodeTexGradient", node_free_standard_storage, node_copy_standard_storage); ntype.gpu_fn = file_ns::node_shader_gpu_tex_gradient; ntype.build_multi_function = file_ns::sh_node_gradient_tex_build_multi_function; + ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); } -- 2.30.2 From f9c66e2c640367990e91da3e9a4330d0b548b013 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 13:04:09 +0300 Subject: [PATCH 2/6] Fixed missed sqrt. --- source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc index aefc703ac27a..3c87f4a97355 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc @@ -179,12 +179,12 @@ NODE_SHADER_MATERIALX_BEGIN res = vector.extract(1).atan2(vector.extract(0)) / (val(float(M_PI * 2.0f))) + val(0.5f); break; case SHD_BLEND_QUADRATIC_SPHERE: - res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}); + res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}).sqrt(); res = (val(0.999999f) - res).max(val(0.0f)); res = res * res; break; case SHD_BLEND_SPHERICAL: - res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}); + res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}).sqrt(); res = (val(0.999999f) - res).max(val(0.0f)); break; } -- 2.30.2 From 7ce7d7058b136d77e95ba018953ffff7ad0d85bb Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 17:46:49 +0300 Subject: [PATCH 3/6] Review comments. --- .../blender/nodes/shader/nodes/node_shader_tex_gradient.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc index 3c87f4a97355..0734f20cfa67 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc @@ -157,7 +157,6 @@ NODE_SHADER_MATERIALX_BEGIN vector = texcoord_node(); } NodeItem res = empty(); - NodeItem res_1 = empty(); switch (gradient_type) { case SHD_BLEND_LINEAR: @@ -169,8 +168,7 @@ NODE_SHADER_MATERIALX_BEGIN break; case SHD_BLEND_EASING: res = vector.extract(0).clamp(val(0.0f), val(1.0f)); - res_1 = res * res; - res = (val(3.0f) * res_1 - val(2.0f) * res_1 * res); + res = res * res * (val(3.0f) - val(2.0f) * res); break; case SHD_BLEND_DIAGONAL: res = (vector.extract(0) + vector.extract(1)) * val(0.5f); @@ -187,6 +185,8 @@ NODE_SHADER_MATERIALX_BEGIN res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}).sqrt(); res = (val(0.999999f) - res).max(val(0.0f)); break; + default: + BLI_assert_unreachable(); } return res; } -- 2.30.2 From a9e919f44c69d6fee7ecebc7bf46bc9980ec93cb Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 18:09:14 +0300 Subject: [PATCH 4/6] Review comments - utilized `dotproduct` method. Fixed dotproduct, added `to_type` argument to be able to specify output type of node while using `arithmetic` method. --- source/blender/nodes/shader/materialx/node_item.cc | 8 +++++--- source/blender/nodes/shader/materialx/node_item.h | 3 ++- .../nodes/shader/nodes/node_shader_tex_gradient.cc | 6 ++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/source/blender/nodes/shader/materialx/node_item.cc b/source/blender/nodes/shader/materialx/node_item.cc index 8fa84213de7a..c1fa1d64bf67 100644 --- a/source/blender/nodes/shader/materialx/node_item.cc +++ b/source/blender/nodes/shader/materialx/node_item.cc @@ -233,7 +233,8 @@ NodeItem NodeItem::max(const NodeItem &other) const NodeItem NodeItem::dotproduct(const NodeItem &other) const { - NodeItem d = arithmetic(other, "dotproduct", [](float a, float b) { return a * b; }); + NodeItem d = arithmetic( + other, "dotproduct", [](float a, float b) { return a * b; }, Type::Float); if (d.value) { float f = 0.0f; switch (d.type()) { @@ -830,12 +831,13 @@ NodeItem NodeItem::arithmetic(const std::string &category, std::function func) const + std::function func, + Type to_type) const { NodeItem res = empty(); NodeItem item1 = *this; NodeItem item2 = other; - Type to_type = cast_types(item1, item2); + to_type = (to_type == Type::Any) ? cast_types(item1, item2) : to_type; if (to_type == Type::Empty) { return res; } diff --git a/source/blender/nodes/shader/materialx/node_item.h b/source/blender/nodes/shader/materialx/node_item.h index 40be1153031b..7cdf8cc59ee1 100644 --- a/source/blender/nodes/shader/materialx/node_item.h +++ b/source/blender/nodes/shader/materialx/node_item.h @@ -127,7 +127,8 @@ class NodeItem { NodeItem arithmetic(const std::string &category, std::function func) const; NodeItem arithmetic(const NodeItem &other, const std::string &category, - std::function func) const; + std::function func, + Type to_type = Type::Any) const; }; template NodeItem NodeItem::val(const T &data) const diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc index 0734f20cfa67..64af6155966c 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc @@ -177,13 +177,11 @@ NODE_SHADER_MATERIALX_BEGIN res = vector.extract(1).atan2(vector.extract(0)) / (val(float(M_PI * 2.0f))) + val(0.5f); break; case SHD_BLEND_QUADRATIC_SPHERE: - res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}).sqrt(); - res = (val(0.999999f) - res).max(val(0.0f)); + res = (val(0.999999f) - vector.dotproduct(vector).sqrt()).max(val(0.0f)); res = res * res; break; case SHD_BLEND_SPHERICAL: - res = create_node("dotproduct", NodeItem::Type::Float, {{"in1", vector}, {"in2", vector}}).sqrt(); - res = (val(0.999999f) - res).max(val(0.0f)); + res = (val(0.999999f) - vector.dotproduct(vector).sqrt()).max(val(0.0f)); break; default: BLI_assert_unreachable(); -- 2.30.2 From b74cc377a1024ac675139634eda056091f14c819 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Wed, 20 Sep 2023 18:52:28 +0300 Subject: [PATCH 5/6] Added comment. --- .../blender/nodes/shader/nodes/node_shader_tex_gradient.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc index 64af6155966c..7d6975e499b4 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc @@ -177,10 +177,16 @@ NODE_SHADER_MATERIALX_BEGIN res = vector.extract(1).atan2(vector.extract(0)) / (val(float(M_PI * 2.0f))) + val(0.5f); break; case SHD_BLEND_QUADRATIC_SPHERE: + /* Bias a little bit for the case where input is a unit length vector, + * to get exactly zero instead of a small random value depending + * on float precision. */ res = (val(0.999999f) - vector.dotproduct(vector).sqrt()).max(val(0.0f)); res = res * res; break; case SHD_BLEND_SPHERICAL: + /* Bias a little bit for the case where input is a unit length vector, + * to get exactly zero instead of a small random value depending + * on float precision. */ res = (val(0.999999f) - vector.dotproduct(vector).sqrt()).max(val(0.0f)); break; default: -- 2.30.2 From 9ccafcfe67462eded55c05a5137e7c3e1f2a6309 Mon Sep 17 00:00:00 2001 From: Vasyl-Pidhirskyi Date: Thu, 21 Sep 2023 09:02:14 +0300 Subject: [PATCH 6/6] Simplified formula. Removed comments. --- .../nodes/shader/nodes/node_shader_tex_gradient.cc | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc index 7d6975e499b4..989a1e527ec5 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc @@ -177,17 +177,11 @@ NODE_SHADER_MATERIALX_BEGIN res = vector.extract(1).atan2(vector.extract(0)) / (val(float(M_PI * 2.0f))) + val(0.5f); break; case SHD_BLEND_QUADRATIC_SPHERE: - /* Bias a little bit for the case where input is a unit length vector, - * to get exactly zero instead of a small random value depending - * on float precision. */ - res = (val(0.999999f) - vector.dotproduct(vector).sqrt()).max(val(0.0f)); + res = (val(1.0f) - vector.dotproduct(vector).sqrt()).max(val(0.0f)); res = res * res; break; case SHD_BLEND_SPHERICAL: - /* Bias a little bit for the case where input is a unit length vector, - * to get exactly zero instead of a small random value depending - * on float precision. */ - res = (val(0.999999f) - vector.dotproduct(vector).sqrt()).max(val(0.0f)); + res = (val(1.0f) - vector.dotproduct(vector).sqrt()).max(val(0.0f)); break; default: BLI_assert_unreachable(); -- 2.30.2