[Bf-blender-cvs] [d3670823b37] master: Fix T73469: OSL: Vector Math Node modulo uses wrong function

Charlie Jolly noreply at git.blender.org
Wed Jan 29 13:38:42 CET 2020


Commit: d3670823b37750e4d993ca28dbd094fee8519c1b
Author: Charlie Jolly
Date:   Wed Jan 29 12:17:58 2020 +0000
Branches: master
https://developer.blender.org/rBd3670823b37750e4d993ca28dbd094fee8519c1b

Fix T73469: OSL: Vector Math Node modulo uses wrong function

This also fixes glsl version of fmod when both inputs are negative.

Differential Revision: https://developer.blender.org/D6704

===================================================================

M	intern/cycles/kernel/shaders/node_vector_math.osl
M	source/blender/gpu/shaders/material/gpu_shader_material_math.glsl
M	source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl
M	source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl

===================================================================

diff --git a/intern/cycles/kernel/shaders/node_vector_math.osl b/intern/cycles/kernel/shaders/node_vector_math.osl
index fd5e27aa144..4fa9b3bb57b 100644
--- a/intern/cycles/kernel/shaders/node_vector_math.osl
+++ b/intern/cycles/kernel/shaders/node_vector_math.osl
@@ -92,7 +92,7 @@ shader node_vector_math(string type = "add",
     Vector = ceil(Vector1);
   }
   else if (type == "modulo") {
-    Vector = mod(Vector1, Vector2);
+    Vector = fmod(Vector1, Vector2);
   }
   else if (type == "fraction") {
     Vector = Vector1 - floor(Vector1);
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_math.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_math.glsl
index de3be98b715..94f69d35b7e 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_math.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_math.glsl
@@ -106,7 +106,7 @@ void math_fraction(float a, float b, float c, out float result)
 
 void math_modulo(float a, float b, float c, out float result)
 {
-  result = c_mod(a, b);
+  result = compatible_fmod(a, b);
 }
 
 void math_trunc(float a, float b, float c, out float result)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl
index e8487fb5d42..df1c0479159 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl
@@ -5,10 +5,11 @@ float safe_divide(float a, float b)
   return (b != 0.0) ? a / b : 0.0;
 }
 
-/* Modulo with C sign convention. mod in GLSL will take absolute for negative numbers. */
-float c_mod(float a, float b)
+/* fmod function compatible with OSL using nvidia reference example. */
+float compatible_fmod(float a, float b)
 {
-  return (b != 0.0 && a != b) ? sign(a) * mod(abs(a), b) : 0.0;
+  float c = (b != 0.0) ? fract(abs(a / b)) * abs(b) : 0.0;
+  return (a < 0.0) ? -c : c;
 }
 
 float compatible_pow(float x, float y)
@@ -88,9 +89,9 @@ vec4 safe_divide(vec4 a, float b)
   return (b != 0.0) ? a / b : vec4(0.0);
 }
 
-vec3 c_mod(vec3 a, vec3 b)
+vec3 compatible_fmod(vec3 a, vec3 b)
 {
-  return vec3(c_mod(a.x, b.x), c_mod(a.y, b.y), c_mod(a.z, b.z));
+  return vec3(compatible_fmod(a.x, b.x), compatible_fmod(a.y, b.y), compatible_fmod(a.z, b.z));
 }
 
 void invert_z(vec3 v, out vec3 outv)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl
index 93132b6044f..420f177e146 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_vector_math.glsl
@@ -76,7 +76,7 @@ void vector_math_ceil(vec3 a, vec3 b, float scale, out vec3 outVector, out float
 
 void vector_math_modulo(vec3 a, vec3 b, float scale, out vec3 outVector, out float outValue)
 {
-  outVector = c_mod(a, b);
+  outVector = compatible_fmod(a, b);
 }
 
 void vector_math_fraction(vec3 a, vec3 b, float scale, out vec3 outVector, out float outValue)



More information about the Bf-blender-cvs mailing list