From 847c091ae838a0e5268fc327dac931c810d88d9b Mon Sep 17 00:00:00 2001 From: Charlie Jolly Date: Tue, 25 Feb 2020 14:52:01 +0000 Subject: Shading: Add invert option to Vector Rotate Node Checkbox to invert rotation angle, suggested by @simonthommes Differential Revision: https://developer.blender.org/D6932 --- .../cycles/kernel/shaders/node_vector_rotate.osl | 34 ++++++++++++---------- 1 file changed, 19 insertions(+), 15 deletions(-) (limited to 'intern/cycles/kernel/shaders') 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; + } } } -- cgit v1.2.3