Blender  V3.3
vector_transform.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 #pragma once
5 
7 
8 /* Vector Transform */
9 
12  ccl_private float *stack,
13  uint4 node)
14 {
15  uint itype, ifrom, ito;
16  uint vector_in, vector_out;
17 
18  svm_unpack_node_uchar3(node.y, &itype, &ifrom, &ito);
19  svm_unpack_node_uchar2(node.z, &vector_in, &vector_out);
20 
21  float3 in = stack_load_float3(stack, vector_in);
22 
26 
27  Transform tfm;
28  bool is_object = (sd->object != OBJECT_NONE);
29  bool is_direction = (type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR ||
31 
32  /* From world */
35  tfm = kernel_data.cam.worldtocamera;
36  if (is_direction)
37  in = transform_direction(&tfm, in);
38  else
39  in = transform_point(&tfm, in);
40  }
41  else if (to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT && is_object) {
42  if (is_direction)
43  object_inverse_dir_transform(kg, sd, &in);
44  else
46  }
47  }
48 
49  /* From camera */
53  tfm = kernel_data.cam.cameratoworld;
54  if (is_direction)
55  in = transform_direction(&tfm, in);
56  else
57  in = transform_point(&tfm, in);
58  }
59  if (to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT && is_object) {
60  if (is_direction)
61  object_inverse_dir_transform(kg, sd, &in);
62  else
64  }
65  }
66 
67  /* From object */
71  is_object) {
72  if (is_direction)
73  object_dir_transform(kg, sd, &in);
74  else
75  object_position_transform(kg, sd, &in);
76  }
78  tfm = kernel_data.cam.worldtocamera;
79  if (is_direction)
80  in = transform_direction(&tfm, in);
81  else
82  in = transform_point(&tfm, in);
83  }
84  }
85 
86  /* Normalize Normal */
88  in = normalize(in);
89 
90  /* Output */
91  if (stack_valid(vector_out)) {
92  stack_store_float3(stack, vector_out, in);
93  }
94 }
95 
unsigned int uint
Definition: BLI_sys_types.h:67
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
ATTR_WARN_UNUSED_RESULT BMesh const char itype
#define ccl_private
Definition: cuda/compat.h:48
#define ccl_device_noinline
Definition: cuda/compat.h:40
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
OperationNode * node
StackEntry * from
#define kernel_data
const KernelGlobalsCPU *ccl_restrict KernelGlobals
ccl_device_inline float3 transform_direction(ccl_private const Transform *t, const float3 a)
CCL_NAMESPACE_END CCL_NAMESPACE_BEGIN ccl_device_inline float3 transform_point(ccl_private const Transform *t, const float3 a)
ccl_device_inline void object_position_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *P)
ccl_device_inline void object_inverse_dir_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *D)
ccl_device_inline void object_inverse_position_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *P)
ccl_device_inline void object_dir_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *D)
ccl_device_inline void stack_store_float3(ccl_private float *stack, uint a, float3 f)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(ccl_private float *stack, uint a)
ccl_device_forceinline void svm_unpack_node_uchar3(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z)
ccl_device_forceinline void svm_unpack_node_uchar2(uint i, ccl_private uint *x, ccl_private uint *y)
ccl_device_inline bool stack_valid(uint a)
NodeVectorTransformConvertSpace
@ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT
@ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD
@ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA
NodeVectorTransformType
@ NODE_VECTOR_TRANSFORM_TYPE_NORMAL
@ NODE_VECTOR_TRANSFORM_TYPE_VECTOR
#define OBJECT_NONE
Definition: kernel/types.h:40
ShaderData
Definition: kernel/types.h:925
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_vector_transform(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)