Blender V5.0
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
7#include "kernel/geom/curve.h"
9
11#include "kernel/svm/util.h"
12
13#include "util/hash.h"
14
16
17/* Geometry Node */
18
20 ccl_private ShaderData *sd,
21 ccl_private float *stack,
22 const uint type,
23 const uint out_offset)
24{
26
27 switch (type) {
28 case NODE_GEOM_P:
29 data = sd->P;
30 break;
31 case NODE_GEOM_N:
32 data = sd->N;
33 break;
34#ifdef __DPDU__
35 case NODE_GEOM_T:
36 data = primitive_tangent(kg, sd);
37 break;
38#endif
39 case NODE_GEOM_I:
40 data = sd->wi;
41 break;
42 case NODE_GEOM_Ng:
43 data = sd->Ng;
44 break;
45 case NODE_GEOM_uv:
46 data = make_float3(1.0f - sd->u - sd->v, sd->u, 0.0f);
47 break;
48 default:
49 data = make_float3(0.0f, 0.0f, 0.0f);
50 }
51
52 stack_store_float3(stack, out_offset, data);
53}
54
56 ccl_private ShaderData *sd,
57 ccl_private float *stack,
58 const uint type,
59 const uint out_offset,
60 const float bump_filter_width)
61{
62#ifdef __RAY_DIFFERENTIALS__
64
65 switch (type) {
66 case NODE_GEOM_P:
67 data = svm_node_bump_P_dx(sd, bump_filter_width);
68 break;
69 case NODE_GEOM_uv: {
70 const float u_x = sd->u + sd->du.dx * bump_filter_width;
71 const float v_x = sd->v + sd->dv.dx * bump_filter_width;
72 data = make_float3(1.0f - u_x - v_x, u_x, 0.0f);
73 break;
74 }
75 default:
76 svm_node_geometry(kg, sd, stack, type, out_offset);
77 return;
78 }
79
80 stack_store_float3(stack, out_offset, data);
81#else
82 svm_node_geometry(kg, sd, stack, type, out_offset);
83#endif
84}
85
87 ccl_private ShaderData *sd,
88 ccl_private float *stack,
89 const uint type,
90 const uint out_offset,
91 const float bump_filter_width)
92{
93#ifdef __RAY_DIFFERENTIALS__
95
96 switch (type) {
97 case NODE_GEOM_P:
98 data = svm_node_bump_P_dy(sd, bump_filter_width);
99 break;
100 case NODE_GEOM_uv: {
101 const float u_y = sd->u + sd->du.dy * bump_filter_width;
102 const float v_y = sd->v + sd->dv.dy * bump_filter_width;
103 data = make_float3(1.0f - u_y - v_y, u_y, 0.0f);
104 break;
105 }
106 default:
107 svm_node_geometry(kg, sd, stack, type, out_offset);
108 return;
109 }
110
111 stack_store_float3(stack, out_offset, data);
112#else
113 svm_node_geometry(kg, sd, stack, type, out_offset);
114#endif
115}
116
117/* Object Info */
118
120 ccl_private ShaderData *sd,
121 ccl_private float *stack,
122 const uint type,
123 const uint out_offset)
124{
125 float data;
126
127 switch (type) {
129 stack_store_float3(stack, out_offset, object_location(kg, sd));
130 return;
131 }
132 case NODE_INFO_OB_COLOR: {
133 stack_store_float3(stack, out_offset, object_color(kg, sd->object));
134 return;
135 }
137 data = object_alpha(kg, sd->object);
138 break;
140 data = object_pass_id(kg, sd->object);
141 break;
143 data = shader_pass_id(kg, sd);
144 break;
145 case NODE_INFO_OB_RANDOM: {
146 data = object_random_number(kg, sd->object);
147 break;
148 }
149 default:
150 data = 0.0f;
151 break;
152 }
153
154 stack_store_float(stack, out_offset, data);
155}
156
157/* Particle Info */
158
160 ccl_private ShaderData *sd,
161 ccl_private float *stack,
162 const uint type,
163 const uint out_offset)
164{
165 switch ((NodeParticleInfo)type) {
166 case NODE_INFO_PAR_INDEX: {
167 const int particle_id = object_particle_id(kg, sd->object);
168 stack_store_float(stack, out_offset, particle_index(kg, particle_id));
169 break;
170 }
172 const int particle_id = object_particle_id(kg, sd->object);
173 const float random = hash_uint2_to_float(particle_index(kg, particle_id), 0);
174 stack_store_float(stack, out_offset, random);
175 break;
176 }
177 case NODE_INFO_PAR_AGE: {
178 const int particle_id = object_particle_id(kg, sd->object);
179 stack_store_float(stack, out_offset, particle_age(kg, particle_id));
180 break;
181 }
183 const int particle_id = object_particle_id(kg, sd->object);
184 stack_store_float(stack, out_offset, particle_lifetime(kg, particle_id));
185 break;
186 }
188 const int particle_id = object_particle_id(kg, sd->object);
189 stack_store_float3(stack, out_offset, particle_location(kg, particle_id));
190 break;
191 }
192#if 0 /* XXX float4 currently not supported in SVM stack */
193 case NODE_INFO_PAR_ROTATION: {
194 int particle_id = object_particle_id(kg, sd->object);
195 stack_store_float4(stack, out_offset, particle_rotation(kg, particle_id));
196 break;
197 }
198#endif
199 case NODE_INFO_PAR_SIZE: {
200 const int particle_id = object_particle_id(kg, sd->object);
201 stack_store_float(stack, out_offset, particle_size(kg, particle_id));
202 break;
203 }
205 const int particle_id = object_particle_id(kg, sd->object);
206 stack_store_float3(stack, out_offset, particle_velocity(kg, particle_id));
207 break;
208 }
210 const int particle_id = object_particle_id(kg, sd->object);
211 stack_store_float3(stack, out_offset, particle_angular_velocity(kg, particle_id));
212 break;
213 }
214 }
215}
216
217#ifdef __HAIR__
218
219/* Hair Info */
220
221ccl_device_noinline void svm_node_hair_info(KernelGlobals kg,
222 ccl_private ShaderData *sd,
223 ccl_private float *stack,
224 const uint type,
225 const uint out_offset)
226{
227 float data;
228 float3 data3;
229
230 switch ((NodeHairInfo)type) {
232 data = (sd->type & PRIMITIVE_CURVE) != 0;
233 stack_store_float(stack, out_offset, data);
234 break;
235 }
237 break; /* handled as attribute */
239 break; /* handled as attribute */
241 break; /* handled as attribute */
243 data = curve_thickness(kg, sd);
244 stack_store_float(stack, out_offset, data);
245 break;
246 }
248 data3 = curve_tangent_normal(sd);
249 stack_store_float3(stack, out_offset, data3);
250 break;
251 }
252 }
253}
254#endif
255
256#ifdef __POINTCLOUD__
257
258/* Point Info */
259
260ccl_device_noinline void svm_node_point_info(KernelGlobals kg,
261 ccl_private ShaderData *sd,
262 ccl_private float *stack,
263 const uint type,
264 const uint out_offset)
265{
266 switch ((NodePointInfo)type) {
268 stack_store_float3(stack, out_offset, point_position(kg, sd));
269 break;
271 stack_store_float(stack, out_offset, point_radius(kg, sd));
272 break;
274 break; /* handled as attribute */
275 }
276}
277
278#endif
279
unsigned int uint
BMesh const char void * data
ccl_device_inline void stack_store_float(ccl_private float *stack, const uint a, const float f)
ccl_device_inline void stack_store_float3(ccl_private float *stack, const uint a, const float3 f)
#define ccl_private
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_noinline
#define CCL_NAMESPACE_END
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
IMETHOD void random(Vector &a)
addDelta operator for displacement rotational velocity.
Definition frames.inl:1282
ccl_device_inline float hash_uint2_to_float(const uint kx, const uint ky)
Definition hash.h:197
ccl_device_inline int object_particle_id(KernelGlobals kg, const int object)
ccl_device int shader_pass_id(KernelGlobals kg, const ccl_private ShaderData *sd)
ccl_device float4 particle_rotation(KernelGlobals kg, const int particle)
ccl_device float3 particle_location(KernelGlobals kg, const int particle)
ccl_device float particle_lifetime(KernelGlobals kg, const int particle)
ccl_device float particle_age(KernelGlobals kg, const int particle)
ccl_device_inline uint particle_index(KernelGlobals kg, const int particle)
ccl_device_inline float3 object_color(KernelGlobals kg, const int object)
ccl_device float3 particle_velocity(KernelGlobals kg, const int particle)
ccl_device_inline float object_alpha(KernelGlobals kg, const int object)
ccl_device float3 particle_angular_velocity(KernelGlobals kg, const int particle)
ccl_device_inline float object_pass_id(KernelGlobals kg, const int object)
ccl_device float particle_size(KernelGlobals kg, const int particle)
ccl_device_inline float3 object_location(KernelGlobals kg, const ccl_private ShaderData *sd)
ccl_device_inline float object_random_number(KernelGlobals kg, const int object)
ccl_device_forceinline float3 svm_node_bump_P_dx(const ccl_private ShaderData *sd, const float bump_filter_width)
ccl_device_forceinline float3 svm_node_bump_P_dy(const ccl_private ShaderData *sd, const float bump_filter_width)
ccl_device_noinline void svm_node_particle_info(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset)
ccl_device_noinline void svm_node_geometry_bump_dy(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset, const float bump_filter_width)
ccl_device_noinline void svm_node_geometry_bump_dx(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset, const float bump_filter_width)
CCL_NAMESPACE_BEGIN ccl_device_noinline void svm_node_geometry(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset)
ccl_device_noinline void svm_node_object_info(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, const uint type, const uint out_offset)
@ NODE_INFO_OB_INDEX
@ NODE_INFO_MAT_INDEX
@ NODE_INFO_OB_RANDOM
@ NODE_INFO_OB_COLOR
@ NODE_INFO_OB_LOCATION
@ NODE_INFO_OB_ALPHA
NodeHairInfo
@ 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
NodeParticleInfo
@ 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
NodePointInfo
@ NODE_INFO_POINT_RADIUS
@ NODE_INFO_POINT_RANDOM
@ NODE_INFO_POINT_POSITION
@ PRIMITIVE_CURVE
ccl_device float3 primitive_tangent(KernelGlobals kg, ccl_private ShaderData *sd)
Definition primitive.h:125