diff options
Diffstat (limited to 'intern/cycles/kernel/shaders')
-rw-r--r-- | intern/cycles/kernel/shaders/node_math.h | 7 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/node_vector_math.osl | 6 |
2 files changed, 13 insertions, 0 deletions
diff --git a/intern/cycles/kernel/shaders/node_math.h b/intern/cycles/kernel/shaders/node_math.h index 3a008721d5e..2da73b94212 100644 --- a/intern/cycles/kernel/shaders/node_math.h +++ b/intern/cycles/kernel/shaders/node_math.h @@ -88,6 +88,13 @@ point wrap(point value, point max, point min) wrap(value[2], max[2], min[2])); } +/* Built in OSL faceforward is `(dot(I, Nref) > 0) ? -N : N;` which is different to + * GLSL `dot(Nref, I) < 0 ? N : -N` for zero values. */ +point compatible_faceforward(point vec, point incident, point reference) +{ + return dot(reference, incident) < 0.0 ? vec : -vec; +} + matrix euler_to_mat(point euler) { float cx = cos(euler[0]); diff --git a/intern/cycles/kernel/shaders/node_vector_math.osl b/intern/cycles/kernel/shaders/node_vector_math.osl index 30f0b1daf4c..3963c23ea9c 100644 --- a/intern/cycles/kernel/shaders/node_vector_math.osl +++ b/intern/cycles/kernel/shaders/node_vector_math.osl @@ -46,6 +46,12 @@ shader node_vector_math(string math_type = "add", else if (math_type == "reflect") { Vector = reflect(Vector1, normalize(Vector2)); } + else if (math_type == "refract") { + Vector = refract(Vector1, normalize(Vector2), Scale); + } + else if (math_type == "faceforward") { + Vector = compatible_faceforward(Vector1, Vector2, Vector3); + } else if (math_type == "dot_product") { Value = dot(Vector1, Vector2); } |