Blender V4.3
kernel/svm/geometry.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
8
9/* Geometry Node */
10
13 ccl_private float *stack,
14 uint type,
15 uint out_offset)
16{
18
19 switch (type) {
20 case NODE_GEOM_P:
21 data = sd->P;
22 break;
23 case NODE_GEOM_N:
24 data = sd->N;
25 break;
26#ifdef __DPDU__
27 case NODE_GEOM_T:
28 data = primitive_tangent(kg, sd);
29 break;
30#endif
31 case NODE_GEOM_I:
32 data = sd->wi;
33 break;
34 case NODE_GEOM_Ng:
35 data = sd->Ng;
36 break;
37 case NODE_GEOM_uv:
38 data = make_float3(1.0f - sd->u - sd->v, sd->u, 0.0f);
39 break;
40 default:
41 data = make_float3(0.0f, 0.0f, 0.0f);
42 }
43
44 stack_store_float3(stack, out_offset, data);
45}
46
49 ccl_private float *stack,
50 uint type,
51 uint out_offset)
52{
53#ifdef __RAY_DIFFERENTIALS__
55
56 switch (type) {
57 case NODE_GEOM_P:
58 data = svm_node_bump_P_dx(sd);
59 break;
60 case NODE_GEOM_uv:
61 data = make_float3(1.0f - sd->u - sd->du.dx - sd->v - sd->dv.dx, sd->u + sd->du.dx, 0.0f);
62 break;
63 default:
64 svm_node_geometry(kg, sd, stack, type, out_offset);
65 return;
66 }
67
68 stack_store_float3(stack, out_offset, data);
69#else
70 svm_node_geometry(kg, sd, stack, type, out_offset);
71#endif
72}
73
76 ccl_private float *stack,
77 uint type,
78 uint out_offset)
79{
80#ifdef __RAY_DIFFERENTIALS__
82
83 switch (type) {
84 case NODE_GEOM_P:
85 data = svm_node_bump_P_dy(sd);
86 break;
87 case NODE_GEOM_uv:
88 data = make_float3(1.0f - sd->u - sd->du.dy - sd->v - sd->dv.dy, sd->u + sd->du.dy, 0.0f);
89 break;
90 default:
91 svm_node_geometry(kg, sd, stack, type, out_offset);
92 return;
93 }
94
95 stack_store_float3(stack, out_offset, data);
96#else
97 svm_node_geometry(kg, sd, stack, type, out_offset);
98#endif
99}
100
101/* Object Info */
102
105 ccl_private float *stack,
106 uint type,
107 uint out_offset)
108{
109 float data;
110
111 switch (type) {
113 stack_store_float3(stack, out_offset, object_location(kg, sd));
114 return;
115 }
116 case NODE_INFO_OB_COLOR: {
117 stack_store_float3(stack, out_offset, object_color(kg, sd->object));
118 return;
119 }
121 data = object_alpha(kg, sd->object);
122 break;
124 data = object_pass_id(kg, sd->object);
125 break;
127 data = shader_pass_id(kg, sd);
128 break;
129 case NODE_INFO_OB_RANDOM: {
130 if (sd->lamp != LAMP_NONE) {
131 data = lamp_random_number(kg, sd->lamp);
132 }
133 else {
134 data = object_random_number(kg, sd->object);
135 }
136 break;
137 }
138 default:
139 data = 0.0f;
140 break;
141 }
142
143 stack_store_float(stack, out_offset, data);
144}
145
146/* Particle Info */
147
150 ccl_private float *stack,
151 uint type,
152 uint out_offset)
153{
154 switch (type) {
155 case NODE_INFO_PAR_INDEX: {
156 int particle_id = object_particle_id(kg, sd->object);
157 stack_store_float(stack, out_offset, particle_index(kg, particle_id));
158 break;
159 }
161 int particle_id = object_particle_id(kg, sd->object);
162 float random = hash_uint2_to_float(particle_index(kg, particle_id), 0);
163 stack_store_float(stack, out_offset, random);
164 break;
165 }
166 case NODE_INFO_PAR_AGE: {
167 int particle_id = object_particle_id(kg, sd->object);
168 stack_store_float(stack, out_offset, particle_age(kg, particle_id));
169 break;
170 }
172 int particle_id = object_particle_id(kg, sd->object);
173 stack_store_float(stack, out_offset, particle_lifetime(kg, particle_id));
174 break;
175 }
177 int particle_id = object_particle_id(kg, sd->object);
178 stack_store_float3(stack, out_offset, particle_location(kg, particle_id));
179 break;
180 }
181#if 0 /* XXX float4 currently not supported in SVM stack */
183 int particle_id = object_particle_id(kg, sd->object);
184 stack_store_float4(stack, out_offset, particle_rotation(kg, particle_id));
185 break;
186 }
187#endif
188 case NODE_INFO_PAR_SIZE: {
189 int particle_id = object_particle_id(kg, sd->object);
190 stack_store_float(stack, out_offset, particle_size(kg, particle_id));
191 break;
192 }
194 int particle_id = object_particle_id(kg, sd->object);
195 stack_store_float3(stack, out_offset, particle_velocity(kg, particle_id));
196 break;
197 }
199 int particle_id = object_particle_id(kg, sd->object);
200 stack_store_float3(stack, out_offset, particle_angular_velocity(kg, particle_id));
201 break;
202 }
203 }
204}
205
206#ifdef __HAIR__
207
208/* Hair Info */
209
210ccl_device_noinline void svm_node_hair_info(KernelGlobals kg,
212 ccl_private float *stack,
213 uint type,
214 uint out_offset)
215{
216 float data;
217 float3 data3;
218
219 switch (type) {
221 data = (sd->type & PRIMITIVE_CURVE) != 0;
222 stack_store_float(stack, out_offset, data);
223 break;
224 }
226 break; /* handled as attribute */
228 break; /* handled as attribute */
230 break; /* handled as attribute */
232 data = curve_thickness(kg, sd);
233 stack_store_float(stack, out_offset, data);
234 break;
235 }
237 data3 = curve_tangent_normal(kg, sd);
238 stack_store_float3(stack, out_offset, data3);
239 break;
240 }
241 }
242}
243#endif
244
245#ifdef __POINTCLOUD__
246
247/* Point Info */
248
249ccl_device_noinline void svm_node_point_info(KernelGlobals kg,
251 ccl_private float *stack,
252 uint type,
253 uint out_offset)
254{
255 switch (type) {
257 stack_store_float3(stack, out_offset, point_position(kg, sd));
258 break;
260 stack_store_float(stack, out_offset, point_radius(kg, sd));
261 break;
263 break; /* handled as attribute */
264 }
265}
266
267#endif
268
unsigned int uint
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#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_device_inline float hash_uint2_to_float(uint kx, uint ky)
Definition hash.h:141
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_forceinline float3 svm_node_bump_P_dx(const ccl_private ShaderData *sd)
ccl_device_forceinline float3 svm_node_bump_P_dy(const ccl_private ShaderData *sd)
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
ShaderData
#define LAMP_NONE
ccl_device float3 primitive_tangent(KernelGlobals kg, ccl_private ShaderData *sd)
Definition primitive.h:234