From d3758892987d76749fdf1211ed27ff77f39b5b3b Mon Sep 17 00:00:00 2001 From: Charlie Jolly Date: Tue, 23 Mar 2021 09:21:56 +0000 Subject: Nodes: Add Refract and Faceforward functions to Vector Maths nodes Cycles, Eevee, OSL, Geo, Attribute Based on outdated refract patch D6619 by @cubic_sloth `refract` and `faceforward` are standard functions in GLSL, OSL and Godot shader languages. Adding these functions provides Blender shader artists access to these standard functions. Reviewed By: brecht Differential Revision: https://developer.blender.org/D10622 --- intern/cycles/kernel/shaders/node_math.h | 7 +++++++ intern/cycles/kernel/shaders/node_vector_math.osl | 6 ++++++ 2 files changed, 13 insertions(+) (limited to 'intern/cycles/kernel/shaders') 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); } -- cgit v1.2.3