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 */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs