Fix T61470: incorrect saturation clamping in recent bugfix.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 14 Feb 2019 18:03:59 +0000 (19:03 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 14 Feb 2019 18:28:44 +0000 (19:28 +0100)
We should clamp the result after multiplication.

intern/cycles/kernel/shaders/node_hsv.osl
intern/cycles/kernel/svm/svm_hsv.h
source/blender/gpu/shaders/gpu_shader_material.glsl
source/blender/nodes/shader/nodes/node_shader_hueSatVal.c

index 9d7b7cde23a099886bf13e356bee8b39f1e1248c..d72a87a951fd20a10006742e4805a19d1dc1689d 100644 (file)
@@ -29,7 +29,7 @@ shader node_hsv(
 
        // remember: fmod doesn't work for negative numbers
        Color[0] = fmod(Color[0] + Hue + 0.5, 1.0);
-       Color[1] *= clamp(Saturation, 0.0, 1.0);
+       Color[1] = clamp(Color[1] * Saturation, 0.0, 1.0);
        Color[2] *= Value;
 
        Color = hsv_to_rgb(Color);
index e69a4ee9154ca3c34c0822bb6f356093a1028a6c..6f3efa639e237a84a7b6e8f3aa91a5d498e8383f 100644 (file)
@@ -38,7 +38,7 @@ ccl_device void svm_node_hsv(KernelGlobals *kg, ShaderData *sd, float *stack, ui
 
        /* remember: fmod doesn't work for negative numbers here */
        color.x = fmodf(color.x + hue + 0.5f, 1.0f);
-       color.y *= saturate(sat);
+       color.y = saturate(color.y * sat);
        color.z *= val;
 
        color = hsv_to_rgb(color);
index 970bbe641d472fa338cb1a0c6dc8179edd1ab78e..c269185eb0f779bf1e5f49369cb4e2201aa54c4a 100644 (file)
@@ -882,7 +882,7 @@ void hue_sat(float hue, float sat, float value, float fac, vec4 col, out vec4 ou
        rgb_to_hsv(col, hsv);
 
        hsv[0] = fract(hsv[0] + hue + 0.5);
-       hsv[1] = hsv[1] * clamp(sat, 0.0, 1.0);
+       hsv[1] = clamp(hsv[1] * sat, 0.0, 1.0);
        hsv[2] = hsv[2] * value;
 
        hsv_to_rgb(hsv, outcol);
index b52681190b4227607d130a388cb8cea2b63558e5..33e80ce2ab0c7071eb034e65b20d00cfc77bed0f 100644 (file)
@@ -47,7 +47,7 @@ static void do_hue_sat_fac(bNode *UNUSED(node), float *out, float hue, float sat
 
                rgb_to_hsv(in[0], in[1], in[2], hsv, hsv + 1, hsv + 2);
                hsv[0] = fmodf(hsv[0] + hue + 0.5f, 1.0f);
-               hsv[1] *= clamp_f(sat, 0.0f, 1.0f);
+               hsv[1] = clamp_f(hsv[1] * sat, 0.0f, 1.0f);
                hsv[2] *= val;
                hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col + 1, col + 2);