Blender  V3.3
kernel/svm/geometry.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 /* Geometry Node */
9 
12  ccl_private float *stack,
13  uint type,
14  uint out_offset)
15 {
16  float3 data;
17 
18  switch (type) {
19  case NODE_GEOM_P:
20  data = sd->P;
21  break;
22  case NODE_GEOM_N:
23  data = sd->N;
24  break;
25 #ifdef __DPDU__
26  case NODE_GEOM_T:
27  data = primitive_tangent(kg, sd);
28  break;
29 #endif
30  case NODE_GEOM_I:
31  data = sd->I;
32  break;
33  case NODE_GEOM_Ng:
34  data = sd->Ng;
35  break;
36  case NODE_GEOM_uv:
37  data = make_float3(1.0f - sd->u - sd->v, sd->u, 0.0f);
38  break;
39  default:
40  data = make_float3(0.0f, 0.0f, 0.0f);
41  }
42 
43  stack_store_float3(stack, out_offset, data);
44 }
45 
48  ccl_private float *stack,
49  uint type,
50  uint out_offset)
51 {
52 #ifdef __RAY_DIFFERENTIALS__
53  float3 data;
54 
55  switch (type) {
56  case NODE_GEOM_P:
57  data = sd->P + sd->dP.dx;
58  break;
59  case NODE_GEOM_uv:
60  data = make_float3(1.0f - sd->u - sd->du.dx - sd->v - sd->dv.dx, sd->u + sd->du.dx, 0.0f);
61  break;
62  default:
63  svm_node_geometry(kg, sd, stack, type, out_offset);
64  return;
65  }
66 
67  stack_store_float3(stack, out_offset, data);
68 #else
69  svm_node_geometry(kg, sd, stack, type, out_offset);
70 #endif
71 }
72 
75  ccl_private float *stack,
76  uint type,
77  uint out_offset)
78 {
79 #ifdef __RAY_DIFFERENTIALS__
80  float3 data;
81 
82  switch (type) {
83  case NODE_GEOM_P:
84  data = sd->P + sd->dP.dy;
85  break;
86  case NODE_GEOM_uv:
87  data = make_float3(1.0f - sd->u - sd->du.dy - sd->v - sd->dv.dy, sd->u + sd->du.dy, 0.0f);
88  break;
89  default:
90  svm_node_geometry(kg, sd, stack, type, out_offset);
91  return;
92  }
93 
94  stack_store_float3(stack, out_offset, data);
95 #else
96  svm_node_geometry(kg, sd, stack, type, out_offset);
97 #endif
98 }
99 
100 /* Object Info */
101 
104  ccl_private float *stack,
105  uint type,
106  uint out_offset)
107 {
108  float data;
109 
110  switch (type) {
111  case NODE_INFO_OB_LOCATION: {
112  stack_store_float3(stack, out_offset, object_location(kg, sd));
113  return;
114  }
115  case NODE_INFO_OB_COLOR: {
116  stack_store_float3(stack, out_offset, object_color(kg, sd->object));
117  return;
118  }
119  case NODE_INFO_OB_ALPHA:
120  data = object_alpha(kg, sd->object);
121  break;
122  case NODE_INFO_OB_INDEX:
123  data = object_pass_id(kg, sd->object);
124  break;
125  case NODE_INFO_MAT_INDEX:
126  data = shader_pass_id(kg, sd);
127  break;
128  case NODE_INFO_OB_RANDOM: {
129  if (sd->lamp != LAMP_NONE) {
130  data = lamp_random_number(kg, sd->lamp);
131  }
132  else {
133  data = object_random_number(kg, sd->object);
134  }
135  break;
136  }
137  default:
138  data = 0.0f;
139  break;
140  }
141 
142  stack_store_float(stack, out_offset, data);
143 }
144 
145 /* Particle Info */
146 
149  ccl_private float *stack,
150  uint type,
151  uint out_offset)
152 {
153  switch (type) {
154  case NODE_INFO_PAR_INDEX: {
155  int particle_id = object_particle_id(kg, sd->object);
156  stack_store_float(stack, out_offset, particle_index(kg, particle_id));
157  break;
158  }
159  case NODE_INFO_PAR_RANDOM: {
160  int particle_id = object_particle_id(kg, sd->object);
161  float random = hash_uint2_to_float(particle_index(kg, particle_id), 0);
162  stack_store_float(stack, out_offset, random);
163  break;
164  }
165  case NODE_INFO_PAR_AGE: {
166  int particle_id = object_particle_id(kg, sd->object);
167  stack_store_float(stack, out_offset, particle_age(kg, particle_id));
168  break;
169  }
170  case NODE_INFO_PAR_LIFETIME: {
171  int particle_id = object_particle_id(kg, sd->object);
172  stack_store_float(stack, out_offset, particle_lifetime(kg, particle_id));
173  break;
174  }
175  case NODE_INFO_PAR_LOCATION: {
176  int particle_id = object_particle_id(kg, sd->object);
177  stack_store_float3(stack, out_offset, particle_location(kg, particle_id));
178  break;
179  }
180 #if 0 /* XXX float4 currently not supported in SVM stack */
181  case NODE_INFO_PAR_ROTATION: {
182  int particle_id = object_particle_id(kg, sd->object);
183  stack_store_float4(stack, out_offset, particle_rotation(kg, particle_id));
184  break;
185  }
186 #endif
187  case NODE_INFO_PAR_SIZE: {
188  int particle_id = object_particle_id(kg, sd->object);
189  stack_store_float(stack, out_offset, particle_size(kg, particle_id));
190  break;
191  }
192  case NODE_INFO_PAR_VELOCITY: {
193  int particle_id = object_particle_id(kg, sd->object);
194  stack_store_float3(stack, out_offset, particle_velocity(kg, particle_id));
195  break;
196  }
198  int particle_id = object_particle_id(kg, sd->object);
199  stack_store_float3(stack, out_offset, particle_angular_velocity(kg, particle_id));
200  break;
201  }
202  }
203 }
204 
205 #ifdef __HAIR__
206 
207 /* Hair Info */
208 
209 ccl_device_noinline void svm_node_hair_info(KernelGlobals kg,
211  ccl_private float *stack,
212  uint type,
213  uint out_offset)
214 {
215  float data;
216  float3 data3;
217 
218  switch (type) {
220  data = (sd->type & PRIMITIVE_CURVE) != 0;
221  stack_store_float(stack, out_offset, data);
222  break;
223  }
225  break; /* handled as attribute */
227  break; /* handled as attribute */
229  break; /* handled as attribute */
231  data = curve_thickness(kg, sd);
232  stack_store_float(stack, out_offset, data);
233  break;
234  }
236  data3 = curve_tangent_normal(kg, sd);
237  stack_store_float3(stack, out_offset, data3);
238  break;
239  }
240  }
241 }
242 #endif
243 
244 #ifdef __POINTCLOUD__
245 
246 /* Point Info */
247 
248 ccl_device_noinline void svm_node_point_info(KernelGlobals kg,
250  ccl_private float *stack,
251  uint type,
252  uint out_offset)
253 {
254  switch (type) {
256  stack_store_float3(stack, out_offset, point_position(kg, sd));
257  break;
259  stack_store_float(stack, out_offset, point_radius(kg, sd));
260  break;
262  break; /* handled as attribute */
263  }
264 }
265 
266 #endif
267 
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
#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
const KernelGlobalsCPU *ccl_restrict KernelGlobals
IMETHOD void random(Vector &a)
addDelta operator for displacement rotational velocity.
Definition: frames.inl:1282
static const float data3[64 *GP_PRIM_DATABUF_SIZE]
ccl_device_inline float hash_uint2_to_float(uint kx, uint ky)
Definition: hash.h:122
ccl_device_inline float object_pass_id(KernelGlobals kg, int object)
ccl_device_inline float object_alpha(KernelGlobals kg, int object)
ccl_device float particle_age(KernelGlobals kg, int particle)
ccl_device float4 particle_rotation(KernelGlobals kg, int particle)
ccl_device_inline uint particle_index(KernelGlobals kg, int particle)
ccl_device_inline float3 object_location(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device_inline float object_random_number(KernelGlobals kg, int object)
ccl_device float particle_lifetime(KernelGlobals kg, int particle)
ccl_device float3 particle_angular_velocity(KernelGlobals kg, int particle)
ccl_device_inline int object_particle_id(KernelGlobals kg, int object)
ccl_device_inline float3 object_color(KernelGlobals kg, int object)
ccl_device_inline float lamp_random_number(KernelGlobals kg, int lamp)
ccl_device int shader_pass_id(KernelGlobals kg, ccl_private const ShaderData *sd)
ccl_device float3 particle_velocity(KernelGlobals kg, int particle)
ccl_device float3 particle_location(KernelGlobals kg, int particle)
ccl_device float particle_size(KernelGlobals kg, int particle)
ccl_device_noinline void svm_node_particle_info(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
ccl_device_noinline void svm_node_geometry_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
ccl_device_noinline void svm_node_geometry_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_geometry(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
ccl_device_noinline void svm_node_object_info(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint type, uint out_offset)
ccl_device_inline void stack_store_float3(ccl_private float *stack, uint a, float3 f)
ccl_device_inline void stack_store_float(ccl_private float *stack, uint a, float f)
@ NODE_INFO_OB_INDEX
@ NODE_INFO_MAT_INDEX
@ NODE_INFO_OB_RANDOM
@ NODE_INFO_OB_COLOR
@ NODE_INFO_OB_LOCATION
@ NODE_INFO_OB_ALPHA
@ NODE_INFO_CURVE_IS_STRAND
@ NODE_INFO_CURVE_LENGTH
@ NODE_INFO_CURVE_TANGENT_NORMAL
@ NODE_INFO_CURVE_THICKNESS
@ NODE_INFO_CURVE_INTERCEPT
@ NODE_INFO_CURVE_RANDOM
@ NODE_GEOM_N
@ NODE_GEOM_T
@ NODE_GEOM_uv
@ NODE_GEOM_P
@ NODE_GEOM_Ng
@ NODE_GEOM_I
@ NODE_INFO_PAR_SIZE
@ NODE_INFO_PAR_LOCATION
@ NODE_INFO_PAR_RANDOM
@ NODE_INFO_PAR_VELOCITY
@ NODE_INFO_PAR_INDEX
@ NODE_INFO_PAR_ANGULAR_VELOCITY
@ NODE_INFO_PAR_AGE
@ NODE_INFO_PAR_LIFETIME
@ NODE_INFO_PAR_ROTATION
@ NODE_INFO_POINT_RADIUS
@ NODE_INFO_POINT_RANDOM
@ NODE_INFO_POINT_POSITION
@ PRIMITIVE_CURVE
Definition: kernel/types.h:564
ShaderData
Definition: kernel/types.h:925
#define LAMP_NONE
Definition: kernel/types.h:42
#define make_float3(x, y, z)
Definition: metal/compat.h:204
ccl_device float3 primitive_tangent(KernelGlobals kg, ccl_private ShaderData *sd)
Definition: primitive.h:233