[Bf-blender-cvs] [0b706237b09] blender-v3.4-release: Fix T103066: Cycles missing full constant foler for mix float and mix vector

Brecht Van Lommel noreply at git.blender.org
Wed Dec 14 22:45:53 CET 2022


Commit: 0b706237b09006f59a1a3b619d69d49d3c80b482
Author: Brecht Van Lommel
Date:   Mon Dec 12 17:28:59 2022 +0100
Branches: blender-v3.4-release
https://developer.blender.org/rB0b706237b09006f59a1a3b619d69d49d3c80b482

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 c1189e3795c..7d0a1117806 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