Blender V4.5
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 ccl_private float *stack,
15 const uint input_stack_offsets,
16 const uint axis_stack_offsets,
17 const uint result_stack_offset)
18{
19 uint type;
20 uint vector_stack_offset;
21 uint rotation_stack_offset;
22 uint center_stack_offset;
23 uint axis_stack_offset;
24 uint angle_stack_offset;
26
28 input_stack_offsets, &type, &vector_stack_offset, &rotation_stack_offset, &invert);
30 axis_stack_offsets, &center_stack_offset, &axis_stack_offset, &angle_stack_offset);
31
32 if (stack_valid(result_stack_offset)) {
33
34 const float3 vector = stack_load_float3(stack, vector_stack_offset);
35 const float3 center = stack_load_float3(stack, center_stack_offset);
36 float3 result = make_float3(0.0f, 0.0f, 0.0f);
37
39 const float3 rotation = stack_load_float3(stack, rotation_stack_offset); // Default XYZ.
40 const Transform rotationTransform = euler_to_transform(rotation);
41 if (invert) {
42 result = transform_direction_transposed(&rotationTransform, vector - center) + center;
43 }
44 else {
45 result = transform_direction(&rotationTransform, vector - center) + center;
46 }
47 }
48 else {
49 float3 axis;
50 float axis_length;
51 switch (type) {
53 axis = make_float3(1.0f, 0.0f, 0.0f);
54 axis_length = 1.0f;
55 break;
57 axis = make_float3(0.0f, 1.0f, 0.0f);
58 axis_length = 1.0f;
59 break;
61 axis = make_float3(0.0f, 0.0f, 1.0f);
62 axis_length = 1.0f;
63 break;
64 default:
65 axis = stack_load_float3(stack, axis_stack_offset);
66 axis_length = len(axis);
67 break;
68 }
69 float angle = stack_load_float(stack, angle_stack_offset);
70 angle = invert ? -angle : angle;
71 result = (axis_length != 0.0f) ?
72 rotate_around_axis(vector - center, axis / axis_length, angle) + center :
73 vector;
74 }
75
76 stack_store_float3(stack, result_stack_offset, result);
77 }
78}
79
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:168
ccl_device_inline float3 transform_direction(const ccl_private Transform *t, const float3 a)
Definition transform.h:87
ccl_device_inline float3 transform_direction_transposed(const ccl_private Transform *t, const float3 a)
Definition transform.h:116
uint len
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vector_rotate(ccl_private ShaderData *sd, ccl_private float *stack, const uint input_stack_offsets, const uint axis_stack_offsets, const uint result_stack_offset)