[Bf-blender-cvs] [312e42708f8] master: Fix T103066: Cycles missing full constant foler for mix float and mix vector
Brecht Van Lommel
noreply at git.blender.org
Mon Dec 12 18:30:57 CET 2022
Commit: 312e42708f8073ef0882d11376c30dee5ac1aef8
Author: Brecht Van Lommel
Date: Mon Dec 12 17:28:59 2022 +0100
Branches: master
https://developer.blender.org/rB312e42708f8073ef0882d11376c30dee5ac1aef8
Fix T103066: Cycles missing full constant foler for mix float and mix vector
===================================================================
M intern/cycles/scene/constant_fold.cpp
M intern/cycles/scene/constant_fold.h
M intern/cycles/scene/shader_nodes.cpp
===================================================================
diff --git a/intern/cycles/scene/constant_fold.cpp b/intern/cycles/scene/constant_fold.cpp
index 1aa4515a087..224c8774cc6 100644
--- a/intern/cycles/scene/constant_fold.cpp
+++ b/intern/cycles/scene/constant_fold.cpp
@@ -386,6 +386,46 @@ void ConstantFolder::fold_mix_color(NodeMix type, bool clamp_factor, bool clamp)
}
}
+void ConstantFolder::fold_mix_float(bool clamp_factor, bool clamp) const
+{
+ ShaderInput *fac_in = node->input("Factor");
+ ShaderInput *float1_in = node->input("A");
+ ShaderInput *float2_in = node->input("B");
+
+ float fac = clamp_factor ? saturatef(node->get_float(fac_in->socket_type)) :
+ node->get_float(fac_in->socket_type);
+ bool fac_is_zero = !fac_in->link && fac == 0.0f;
+ bool fac_is_one = !fac_in->link && fac == 1.0f;
+
+ /* remove no-op node when factor is 0.0 */
+ if (fac_is_zero) {
+ if (try_bypass_or_make_constant(float1_in, clamp)) {
+ return;
+ }
+ }
+
+ /* remove useless mix floats nodes */
+ if (float1_in->link && float2_in->link) {
+ if (float1_in->link == float2_in->link) {
+ try_bypass_or_make_constant(float1_in, clamp);
+ return;
+ }
+ }
+ else if (!float1_in->link && !float2_in->link) {
+ float value1 = node->get_float(float1_in->socket_type);
+ float value2 = node->get_float(float2_in->socket_type);
+ if (value1 == value2) {
+ try_bypass_or_make_constant(float1_in, clamp);
+ return;
+ }
+ }
+ /* remove no-op mix float node when factor is 1.0 */
+ if (fac_is_one) {
+ try_bypass_or_make_constant(float2_in, clamp);
+ return;
+ }
+}
+
void ConstantFolder::fold_math(NodeMathType type) const
{
ShaderInput *value1_in = node->input("Value1");
diff --git a/intern/cycles/scene/constant_fold.h b/intern/cycles/scene/constant_fold.h
index 246ff2d31ee..14097e1a0e4 100644
--- a/intern/cycles/scene/constant_fold.h
+++ b/intern/cycles/scene/constant_fold.h
@@ -52,6 +52,7 @@ class ConstantFolder {
/* Specific nodes. */
void fold_mix(NodeMix type, bool clamp) const;
void fold_mix_color(NodeMix type, bool clamp_factor, bool clamp) const;
+ void fold_mix_float(bool clamp_factor, bool clamp) const;
void fold_math(NodeMathType type) const;
void fold_vector_math(NodeVectorMathType type) const;
void fold_mapping(NodeMappingType type) const;
diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp
index f032c52c1af..a64953c03ec 100644
--- a/intern/cycles/scene/shader_nodes.cpp
+++ b/intern/cycles/scene/shader_nodes.cpp
@@ -5132,6 +5132,9 @@ void MixFloatNode::constant_fold(const ConstantFolder &folder)
}
folder.make_constant(a * (1 - fac) + b * fac);
}
+ else {
+ folder.fold_mix_float(use_clamp, false);
+ }
}
/* Mix Vector */
@@ -5185,6 +5188,9 @@ void MixVectorNode::constant_fold(const ConstantFolder &folder)
}
folder.make_constant(a * (one_float3() - fac) + b * fac);
}
+ else {
+ folder.fold_mix_color(NODE_MIX_BLEND, use_clamp, false);
+ }
}
/* Mix Vector Non Uniform */
More information about the Bf-blender-cvs
mailing list