Blender  V2.93
svm_geometry.h
Go to the documentation of this file.
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
18 
19 /* Geometry Node */
20 
22  KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
23 {
24  float3 data;
25 
26  switch (type) {
27  case NODE_GEOM_P:
28  data = sd->P;
29  break;
30  case NODE_GEOM_N:
31  data = sd->N;
32  break;
33 #ifdef __DPDU__
34  case NODE_GEOM_T:
35  data = primitive_tangent(kg, sd);
36  break;
37 #endif
38  case NODE_GEOM_I:
39  data = sd->I;
40  break;
41  case NODE_GEOM_Ng:
42  data = sd->Ng;
43  break;
44  case NODE_GEOM_uv:
45  data = make_float3(sd->u, sd->v, 0.0f);
46  break;
47  default:
48  data = make_float3(0.0f, 0.0f, 0.0f);
49  }
50 
51  stack_store_float3(stack, out_offset, data);
52 }
53 
55  KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
56 {
57 #ifdef __RAY_DIFFERENTIALS__
58  float3 data;
59 
60  switch (type) {
61  case NODE_GEOM_P:
62  data = sd->P + sd->dP.dx;
63  break;
64  case NODE_GEOM_uv:
65  data = make_float3(sd->u + sd->du.dx, sd->v + sd->dv.dx, 0.0f);
66  break;
67  default:
68  svm_node_geometry(kg, sd, stack, type, out_offset);
69  return;
70  }
71 
72  stack_store_float3(stack, out_offset, data);
73 #else
74  svm_node_geometry(kg, sd, stack, type, out_offset);
75 #endif
76 }
77 
79  KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
80 {
81 #ifdef __RAY_DIFFERENTIALS__
82  float3 data;
83 
84  switch (type) {
85  case NODE_GEOM_P:
86  data = sd->P + sd->dP.dy;
87  break;
88  case NODE_GEOM_uv:
89  data = make_float3(sd->u + sd->du.dy, sd->v + sd->dv.dy, 0.0f);
90  break;
91  default:
92  svm_node_geometry(kg, sd, stack, type, out_offset);
93  return;
94  }
95 
96  stack_store_float3(stack, out_offset, data);
97 #else
98  svm_node_geometry(kg, sd, stack, type, out_offset);
99 #endif
100 }
101 
102 /* Object Info */
103 
105  KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
106 {
107  float data;
108 
109  switch (type) {
110  case NODE_INFO_OB_LOCATION: {
111  stack_store_float3(stack, out_offset, object_location(kg, sd));
112  return;
113  }
114  case NODE_INFO_OB_COLOR: {
115  stack_store_float3(stack, out_offset, object_color(kg, sd->object));
116  return;
117  }
118  case NODE_INFO_OB_INDEX:
119  data = object_pass_id(kg, sd->object);
120  break;
121  case NODE_INFO_MAT_INDEX:
122  data = shader_pass_id(kg, sd);
123  break;
124  case NODE_INFO_OB_RANDOM: {
125  if (sd->lamp != LAMP_NONE) {
126  data = lamp_random_number(kg, sd->lamp);
127  }
128  else {
129  data = object_random_number(kg, sd->object);
130  }
131  break;
132  }
133  default:
134  data = 0.0f;
135  break;
136  }
137 
138  stack_store_float(stack, out_offset, data);
139 }
140 
141 /* Particle Info */
142 
144  KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
145 {
146  switch (type) {
147  case NODE_INFO_PAR_INDEX: {
148  int particle_id = object_particle_id(kg, sd->object);
149  stack_store_float(stack, out_offset, particle_index(kg, particle_id));
150  break;
151  }
152  case NODE_INFO_PAR_RANDOM: {
153  int particle_id = object_particle_id(kg, sd->object);
154  float random = hash_uint2_to_float(particle_index(kg, particle_id), 0);
155  stack_store_float(stack, out_offset, random);
156  break;
157  }
158  case NODE_INFO_PAR_AGE: {
159  int particle_id = object_particle_id(kg, sd->object);
160  stack_store_float(stack, out_offset, particle_age(kg, particle_id));
161  break;
162  }
163  case NODE_INFO_PAR_LIFETIME: {
164  int particle_id = object_particle_id(kg, sd->object);
165  stack_store_float(stack, out_offset, particle_lifetime(kg, particle_id));
166  break;
167  }
168  case NODE_INFO_PAR_LOCATION: {
169  int particle_id = object_particle_id(kg, sd->object);
170  stack_store_float3(stack, out_offset, particle_location(kg, particle_id));
171  break;
172  }
173 #if 0 /* XXX float4 currently not supported in SVM stack */
174  case NODE_INFO_PAR_ROTATION: {
175  int particle_id = object_particle_id(kg, sd->object);
176  stack_store_float4(stack, out_offset, particle_rotation(kg, particle_id));
177  break;
178  }
179 #endif
180  case NODE_INFO_PAR_SIZE: {
181  int particle_id = object_particle_id(kg, sd->object);
182  stack_store_float(stack, out_offset, particle_size(kg, particle_id));
183  break;
184  }
185  case NODE_INFO_PAR_VELOCITY: {
186  int particle_id = object_particle_id(kg, sd->object);
187  stack_store_float3(stack, out_offset, particle_velocity(kg, particle_id));
188  break;
189  }
191  int particle_id = object_particle_id(kg, sd->object);
192  stack_store_float3(stack, out_offset, particle_angular_velocity(kg, particle_id));
193  break;
194  }
195  }
196 }
197 
198 #ifdef __HAIR__
199 
200 /* Hair Info */
201 
202 ccl_device void svm_node_hair_info(
203  KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
204 {
205  float data;
206  float3 data3;
207 
208  switch (type) {
210  data = (sd->type & PRIMITIVE_ALL_CURVE) != 0;
211  stack_store_float(stack, out_offset, data);
212  break;
213  }
215  break; /* handled as attribute */
217  break; /* handled as attribute */
219  data = curve_thickness(kg, sd);
220  stack_store_float(stack, out_offset, data);
221  break;
222  }
223  /*case NODE_INFO_CURVE_FADE: {
224  data = sd->curve_transparency;
225  stack_store_float(stack, out_offset, data);
226  break;
227  }*/
229  data3 = curve_tangent_normal(kg, sd);
230  stack_store_float3(stack, out_offset, data3);
231  break;
232  }
233  }
234 }
235 #endif
236 
unsigned int uint
Definition: BLI_sys_types.h:83
_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
IMETHOD void random(Vector &a)
addDelta operator for displacement rotational velocity.
Definition: frames.inl:1282
ccl_device_inline float3 object_location(KernelGlobals *kg, const ShaderData *sd)
Definition: geom_object.h:204
ccl_device float4 particle_rotation(KernelGlobals *kg, int particle)
Definition: geom_object.h:383
ccl_device_inline float object_random_number(KernelGlobals *kg, int object)
Definition: geom_object.h:250
ccl_device_inline uint particle_index(KernelGlobals *kg, int particle)
Definition: geom_object.h:363
ccl_device_inline float lamp_random_number(KernelGlobals *kg, int lamp)
Definition: geom_object.h:240
ccl_device float3 particle_location(KernelGlobals *kg, int particle)
Definition: geom_object.h:388
ccl_device float particle_lifetime(KernelGlobals *kg, int particle)
Definition: geom_object.h:373
ccl_device float3 particle_velocity(KernelGlobals *kg, int particle)
Definition: geom_object.h:393
ccl_device_inline float object_pass_id(KernelGlobals *kg, int object)
Definition: geom_object.h:230
ccl_device int shader_pass_id(KernelGlobals *kg, const ShaderData *sd)
Definition: geom_object.h:338
ccl_device_inline float3 object_color(KernelGlobals *kg, int object)
Definition: geom_object.h:219
ccl_device float3 particle_angular_velocity(KernelGlobals *kg, int particle)
Definition: geom_object.h:398
ccl_device float particle_size(KernelGlobals *kg, int particle)
Definition: geom_object.h:378
ccl_device float particle_age(KernelGlobals *kg, int particle)
Definition: geom_object.h:368
ccl_device_inline int object_particle_id(KernelGlobals *kg, int object)
Definition: geom_object.h:260
ccl_device float3 primitive_tangent(KernelGlobals *kg, ShaderData *sd)
static const float data3[64 *GP_PRIM_DATABUF_SIZE]
ccl_device_inline void stack_store_float3(float *stack, uint a, float3 f)
ccl_device_inline void stack_store_float(float *stack, uint a, float f)
#define ccl_device
#define ccl_device_inline
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
@ PRIMITIVE_ALL_CURVE
Definition: kernel_types.h:698
ShaderData
#define LAMP_NONE
Definition: kernel_types.h:61
ccl_device void svm_node_object_info(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
Definition: svm_geometry.h:104
ccl_device void svm_node_particle_info(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
Definition: svm_geometry.h:143
CCL_NAMESPACE_BEGIN ccl_device_inline void svm_node_geometry(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
Definition: svm_geometry.h:21
ccl_device void svm_node_geometry_bump_dy(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
Definition: svm_geometry.h:78
ccl_device void svm_node_geometry_bump_dx(KernelGlobals *kg, ShaderData *sd, float *stack, uint type, uint out_offset)
Definition: svm_geometry.h:54
@ NODE_INFO_OB_INDEX
Definition: svm_types.h:187
@ NODE_INFO_MAT_INDEX
Definition: svm_types.h:188
@ NODE_INFO_OB_RANDOM
Definition: svm_types.h:189
@ NODE_INFO_OB_COLOR
Definition: svm_types.h:186
@ NODE_INFO_OB_LOCATION
Definition: svm_types.h:185
@ NODE_INFO_CURVE_IS_STRAND
Definition: svm_types.h:205
@ NODE_INFO_CURVE_TANGENT_NORMAL
Definition: svm_types.h:210
@ NODE_INFO_CURVE_THICKNESS
Definition: svm_types.h:207
@ NODE_INFO_CURVE_INTERCEPT
Definition: svm_types.h:206
@ NODE_INFO_CURVE_RANDOM
Definition: svm_types.h:211
@ NODE_GEOM_N
Definition: svm_types.h:177
@ NODE_GEOM_T
Definition: svm_types.h:178
@ NODE_GEOM_uv
Definition: svm_types.h:181
@ NODE_GEOM_P
Definition: svm_types.h:176
@ NODE_GEOM_Ng
Definition: svm_types.h:180
@ NODE_GEOM_I
Definition: svm_types.h:179
@ NODE_INFO_PAR_SIZE
Definition: svm_types.h:199
@ NODE_INFO_PAR_LOCATION
Definition: svm_types.h:197
@ NODE_INFO_PAR_RANDOM
Definition: svm_types.h:194
@ NODE_INFO_PAR_VELOCITY
Definition: svm_types.h:200
@ NODE_INFO_PAR_INDEX
Definition: svm_types.h:193
@ NODE_INFO_PAR_ANGULAR_VELOCITY
Definition: svm_types.h:201
@ NODE_INFO_PAR_AGE
Definition: svm_types.h:195
@ NODE_INFO_PAR_LIFETIME
Definition: svm_types.h:196
@ NODE_INFO_PAR_ROTATION
Definition: svm_types.h:198
ccl_device_inline float hash_uint2_to_float(uint kx, uint ky)
Definition: util_hash.h:135