Blender V5.0
vector_rotate.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#include "kernel/svm/util.h"
8
10
11/* Vector Rotate */
12
14 const uint input_stack_offsets,
15 const uint axis_stack_offsets,
16 const uint result_stack_offset)
17{
18 uint type;
19 uint vector_stack_offset;
20 uint rotation_stack_offset;
21 uint center_stack_offset;
22 uint axis_stack_offset;
23 uint angle_stack_offset;
25
27 input_stack_offsets, &type, &vector_stack_offset, &rotation_stack_offset, &invert);
29 axis_stack_offsets, &center_stack_offset, &axis_stack_offset, &angle_stack_offset);
30
31 if (stack_valid(result_stack_offset)) {
32
33 const float3 vector = stack_load_float3(stack, vector_stack_offset);
34 const float3 center = stack_load_float3(stack, center_stack_offset);
35 float3 result = make_float3(0.0f, 0.0f, 0.0f);
36
38 const float3 rotation = stack_load_float3(stack, rotation_stack_offset); // Default XYZ.
39 const Transform rotationTransform = euler_to_transform(rotation);
40 if (invert) {
41 result = transform_direction_transposed(&rotationTransform, vector - center) + center;
42 }
43 else {
44 result = transform_direction(&rotationTransform, vector - center) + center;
45 }
46 }
47 else {
48 float3 axis;
49 float axis_length;
50 switch (type) {
52 axis = make_float3(1.0f, 0.0f, 0.0f);
53 axis_length = 1.0f;
54 break;
56 axis = make_float3(0.0f, 1.0f, 0.0f);
57 axis_length = 1.0f;
58 break;
60 axis = make_float3(0.0f, 0.0f, 1.0f);
61 axis_length = 1.0f;
62 break;
63 default:
64 axis = stack_load_float3(stack, axis_stack_offset);
65 axis_length = len(axis);
66 break;
67 }
68 float angle = stack_load_float(stack, angle_stack_offset);
69 angle = invert ? -angle : angle;
70 result = (axis_length != 0.0f) ?
71 rotate_around_axis(vector - center, axis / axis_length, angle) + center :
72 vector;
73 }
74
75 stack_store_float3(stack, result_stack_offset, result);
76 }
77}
78
unsigned int uint
@ NODE_VECTOR_ROTATE_TYPE_AXIS_Z
@ NODE_VECTOR_ROTATE_TYPE_AXIS_X
@ NODE_VECTOR_ROTATE_TYPE_EULER_XYZ
@ NODE_VECTOR_ROTATE_TYPE_AXIS_Y
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:117
ccl_device_inline float stack_load_float(const ccl_private float *stack, const uint a)
ccl_device_inline void stack_store_float3(ccl_private float *stack, const uint a, const float3 f)
ccl_device_forceinline void svm_unpack_node_uchar3(const uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z)
ccl_device_forceinline void svm_unpack_node_uchar4(const uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z, ccl_private uint *w)
ccl_device_inline bool stack_valid(const uint a)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(const ccl_private float *stack, const uint a)
#define ccl_private
#define ccl_device_noinline
#define CCL_NAMESPACE_END
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
Definition invert.h:11
ccl_device_inline float3 rotate_around_axis(const float3 p, const float3 axis, const float angle)
ccl_device_inline Transform euler_to_transform(const float3 euler)
Definition transform.h:201
ccl_device_inline float3 transform_direction(const ccl_private Transform *t, const float3 a)
Definition transform.h:127
ccl_device_inline float3 transform_direction_transposed(const ccl_private Transform *t, const float3 a)
Definition transform.h:149
uint len
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vector_rotate(ccl_private float *stack, const uint input_stack_offsets, const uint axis_stack_offsets, const uint result_stack_offset)