/* SPDX-License-Identifier: Apache-2.0 * Copyright 2011-2022 Blender Foundation */ #include "node_math.h" #include "stdcycles.h" shader node_vector_rotate(int invert = 0, string rotate_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), vector Axis = vector(0.0, 0.0, 1.0), float Angle = 0.0, output vector VectorOut = vector(0.0, 0.0, 0.0)) { if (rotate_type == "euler_xyz") { matrix rmat = (invert) ? transpose(euler_to_mat(Rotation)) : euler_to_mat(Rotation); VectorOut = transform(rmat, VectorIn - Center) + Center; } else { float a = (invert) ? -Angle : Angle; if (rotate_type == "x_axis") { VectorOut = rotate(VectorIn - Center, a, point(0.0), vector(1.0, 0.0, 0.0)) + Center; } else if (rotate_type == "y_axis") { VectorOut = rotate(VectorIn - Center, a, point(0.0), vector(0.0, 1.0, 0.0)) + Center; } else if (rotate_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; } } }