diff options
Diffstat (limited to 'intern/cycles/kernel/shaders/node_vector_rotate.osl')
-rw-r--r-- | intern/cycles/kernel/shaders/node_vector_rotate.osl | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/intern/cycles/kernel/shaders/node_vector_rotate.osl b/intern/cycles/kernel/shaders/node_vector_rotate.osl index 533aa7bbe13..d32733b0966 100644 --- a/intern/cycles/kernel/shaders/node_vector_rotate.osl +++ b/intern/cycles/kernel/shaders/node_vector_rotate.osl @@ -17,7 +17,8 @@ #include "stdcycles.h" #include "node_math.h" -shader node_vector_rotate(string type = "axis", +shader node_vector_rotate(int invert = 0, + string type = "axis", vector VectorIn = vector(0.0, 0.0, 0.0), point Center = point(0.0, 0.0, 0.0), point Rotation = point(0.0, 0.0, 0.0), @@ -26,20 +27,23 @@ shader node_vector_rotate(string type = "axis", output vector VectorOut = vector(0.0, 0.0, 0.0)) { if (type == "euler_xyz") { - VectorOut = transform(euler_to_mat(Rotation), VectorIn - Center) + Center; + matrix rmat = (invert) ? transpose(euler_to_mat(Rotation)) : euler_to_mat(Rotation); + VectorOut = transform(rmat, VectorIn - Center) + Center; } - else if (type == "x_axis") { - VectorOut = rotate(VectorIn - Center, Angle, point(0.0), vector(1.0, 0.0, 0.0)) + Center; - } - else if (type == "y_axis") { - VectorOut = rotate(VectorIn - Center, Angle, point(0.0), vector(0.0, 1.0, 0.0)) + Center; - } - else if (type == "z_axis") { - VectorOut = rotate(VectorIn - Center, Angle, point(0.0), vector(0.0, 0.0, 1.0)) + Center; - } - else { // axis - VectorOut = (length(Axis) != 0.0) ? - rotate(VectorIn - Center, Angle, point(0.0), Axis) + Center : - VectorIn; + else { + float a = (invert) ? -Angle : Angle; + if (type == "x_axis") { + VectorOut = rotate(VectorIn - Center, a, point(0.0), vector(1.0, 0.0, 0.0)) + Center; + } + else if (type == "y_axis") { + VectorOut = rotate(VectorIn - Center, a, point(0.0), vector(0.0, 1.0, 0.0)) + Center; + } + else if (type == "z_axis") { + VectorOut = rotate(VectorIn - Center, a, point(0.0), vector(0.0, 0.0, 1.0)) + Center; + } + else { // axis + VectorOut = (length(Axis) != 0.0) ? rotate(VectorIn - Center, a, point(0.0), Axis) + Center : + VectorIn; + } } } |