Blender  V3.3
shader_data.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0
2  * Copyright 2011-2022 Blender Foundation */
3 
4 /* Functions to initialize ShaderData given.
5  *
6  * Could be from an incoming ray, intersection or sampled position. */
7 
8 #pragma once
9 
11 
12 /* ShaderData setup from incoming ray */
13 
14 #ifdef __OBJECT_MOTION__
15 ccl_device void shader_setup_object_transforms(KernelGlobals kg,
17  float time)
18 {
19  if (sd->object_flag & SD_OBJECT_MOTION) {
20  sd->ob_tfm_motion = object_fetch_transform_motion(kg, sd->object, time);
21  sd->ob_itfm_motion = transform_inverse(sd->ob_tfm_motion);
22  }
23 }
24 #endif
25 
26 /* TODO: break this up if it helps reduce register pressure to load data from
27  * global memory as we write it to shader-data. */
30  ccl_private const Ray *ccl_restrict ray,
32 {
33  /* Read intersection data into shader globals.
34  *
35  * TODO: this is redundant, could potentially remove some of this from
36  * ShaderData but would need to ensure that it also works for shadow
37  * shader evaluation. */
38  sd->u = isect->u;
39  sd->v = isect->v;
40  sd->ray_length = isect->t;
41  sd->type = isect->type;
42  sd->object = isect->object;
43  sd->object_flag = kernel_data_fetch(object_flag, sd->object);
44  sd->prim = isect->prim;
45  sd->lamp = LAMP_NONE;
46  sd->flag = 0;
47 
48  /* Read matrices and time. */
49  sd->time = ray->time;
50 
51 #ifdef __OBJECT_MOTION__
52  shader_setup_object_transforms(kg, sd, ray->time);
53 #endif
54 
55  /* Read ray data into shader globals. */
56  sd->I = -ray->D;
57 
58 #ifdef __HAIR__
59  if (sd->type & PRIMITIVE_CURVE) {
60  /* curve */
61  curve_shader_setup(kg, sd, ray->P, ray->D, isect->t, isect->object, isect->prim);
62  }
63  else
64 #endif
65 #ifdef __POINTCLOUD__
66  if (sd->type & PRIMITIVE_POINT) {
67  /* point */
68  point_shader_setup(kg, sd, isect, ray);
69  }
70  else
71 #endif
72  {
73  if (sd->type == PRIMITIVE_TRIANGLE) {
74  /* static triangle */
75  float3 Ng = triangle_normal(kg, sd);
76  sd->shader = kernel_data_fetch(tri_shader, sd->prim);
77 
78  /* vectors */
79  sd->P = triangle_point_from_uv(kg, sd, isect->object, isect->prim, isect->u, isect->v);
80  sd->Ng = Ng;
81  sd->N = Ng;
82 
83  /* smooth normal */
84  if (sd->shader & SHADER_SMOOTH_NORMAL)
85  sd->N = triangle_smooth_normal(kg, Ng, sd->prim, sd->u, sd->v);
86 
87 #ifdef __DPDU__
88  /* dPdu/dPdv */
89  triangle_dPdudv(kg, sd->prim, &sd->dPdu, &sd->dPdv);
90 #endif
91  }
92  else {
93  /* motion triangle */
95  kg, sd, ray->P, ray->D, isect->t, isect->object, isect->prim, false);
96  }
97 
98  if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
99  /* instance transform */
100  object_normal_transform_auto(kg, sd, &sd->N);
101  object_normal_transform_auto(kg, sd, &sd->Ng);
102 #ifdef __DPDU__
103  object_dir_transform_auto(kg, sd, &sd->dPdu);
104  object_dir_transform_auto(kg, sd, &sd->dPdv);
105 #endif
106  }
107  }
108 
109  sd->flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
110 
111  /* backfacing test */
112  bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
113 
114  if (backfacing) {
115  sd->flag |= SD_BACKFACING;
116  sd->Ng = -sd->Ng;
117  sd->N = -sd->N;
118 #ifdef __DPDU__
119  sd->dPdu = -sd->dPdu;
120  sd->dPdv = -sd->dPdv;
121 #endif
122  }
123 
124 #ifdef __RAY_DIFFERENTIALS__
125  /* differentials */
126  differential_transfer_compact(&sd->dP, ray->dP, ray->D, ray->dD, sd->Ng, sd->ray_length);
127  differential_incoming_compact(&sd->dI, ray->D, ray->dD);
128  differential_dudv(&sd->du, &sd->dv, sd->dPdu, sd->dPdv, sd->dP, sd->Ng);
129 #endif
130 }
131 
132 /* ShaderData setup from position sampled on mesh */
133 
136  const float3 P,
137  const float3 Ng,
138  const float3 I,
139  int shader,
140  int object,
141  int prim,
142  float u,
143  float v,
144  float t,
145  float time,
146  bool object_space,
147  int lamp)
148 {
149  /* vectors */
150  sd->P = P;
151  sd->N = Ng;
152  sd->Ng = Ng;
153  sd->I = I;
154  sd->shader = shader;
155  if (prim != PRIM_NONE)
156  sd->type = PRIMITIVE_TRIANGLE;
157  else if (lamp != LAMP_NONE)
158  sd->type = PRIMITIVE_LAMP;
159  else
160  sd->type = PRIMITIVE_NONE;
161 
162  /* primitive */
163  sd->object = object;
164  sd->lamp = LAMP_NONE;
165  /* Currently no access to bvh prim index for strand sd->prim. */
166  sd->prim = prim;
167  sd->u = u;
168  sd->v = v;
169  sd->time = time;
170  sd->ray_length = t;
171 
172  sd->flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
173  sd->object_flag = 0;
174  if (sd->object != OBJECT_NONE) {
175  sd->object_flag |= kernel_data_fetch(object_flag, sd->object);
176 
177 #ifdef __OBJECT_MOTION__
178  shader_setup_object_transforms(kg, sd, time);
179 #endif
180 
181  /* transform into world space */
182  if (object_space) {
183  object_position_transform_auto(kg, sd, &sd->P);
184  object_normal_transform_auto(kg, sd, &sd->Ng);
185  sd->N = sd->Ng;
186  object_dir_transform_auto(kg, sd, &sd->I);
187  }
188 
189  if (sd->type == PRIMITIVE_TRIANGLE) {
190  /* smooth normal */
191  if (sd->shader & SHADER_SMOOTH_NORMAL) {
192  sd->N = triangle_smooth_normal(kg, Ng, sd->prim, sd->u, sd->v);
193 
194  if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
195  object_normal_transform_auto(kg, sd, &sd->N);
196  }
197  }
198 
199  /* dPdu/dPdv */
200 #ifdef __DPDU__
201  triangle_dPdudv(kg, sd->prim, &sd->dPdu, &sd->dPdv);
202 
203  if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
204  object_dir_transform_auto(kg, sd, &sd->dPdu);
205  object_dir_transform_auto(kg, sd, &sd->dPdv);
206  }
207 #endif
208  }
209  else {
210 #ifdef __DPDU__
211  sd->dPdu = zero_float3();
212  sd->dPdv = zero_float3();
213 #endif
214  }
215  }
216  else {
217  if (lamp != LAMP_NONE) {
218  sd->lamp = lamp;
219  }
220 #ifdef __DPDU__
221  sd->dPdu = zero_float3();
222  sd->dPdv = zero_float3();
223 #endif
224  }
225 
226  /* backfacing test */
227  if (sd->prim != PRIM_NONE) {
228  bool backfacing = (dot(sd->Ng, sd->I) < 0.0f);
229 
230  if (backfacing) {
231  sd->flag |= SD_BACKFACING;
232  sd->Ng = -sd->Ng;
233  sd->N = -sd->N;
234 #ifdef __DPDU__
235  sd->dPdu = -sd->dPdu;
236  sd->dPdv = -sd->dPdv;
237 #endif
238  }
239  }
240 
241 #ifdef __RAY_DIFFERENTIALS__
242  /* no ray differentials here yet */
243  sd->dP = differential3_zero();
244  sd->dI = differential3_zero();
245  sd->du = differential_zero();
246  sd->dv = differential_zero();
247 #endif
248 }
249 
250 /* ShaderData setup for displacement */
251 
254  int object,
255  int prim,
256  float u,
257  float v)
258 {
259  float3 P, Ng, I = zero_float3();
260  int shader;
261 
262  triangle_point_normal(kg, object, prim, u, v, &P, &Ng, &shader);
263 
264  /* force smooth shading for displacement */
265  shader |= SHADER_SMOOTH_NORMAL;
266 
268  sd,
269  P,
270  Ng,
271  I,
272  shader,
273  object,
274  prim,
275  u,
276  v,
277  0.0f,
278  0.5f,
279  !(kernel_data_fetch(object_flag, object) & SD_OBJECT_TRANSFORM_APPLIED),
280  LAMP_NONE);
281 }
282 
283 /* ShaderData setup for point on curve. */
284 
287  int object,
288  int prim,
289  int segment,
290  float u)
291 {
292  /* Primitive */
294  sd->lamp = LAMP_NONE;
295  sd->prim = prim;
296  sd->u = u;
297  sd->v = 0.0f;
298  sd->time = 0.5f;
299  sd->ray_length = 0.0f;
300 
301  /* Shader */
302  sd->shader = kernel_data_fetch(curves, prim).shader_id;
303  sd->flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
304 
305  /* Object */
306  sd->object = object;
307  sd->object_flag = kernel_data_fetch(object_flag, sd->object);
308 #ifdef __OBJECT_MOTION__
309  shader_setup_object_transforms(kg, sd, sd->time);
310 #endif
311 
312  /* Get control points. */
313  KernelCurve kcurve = kernel_data_fetch(curves, prim);
314 
315  int k0 = kcurve.first_key + PRIMITIVE_UNPACK_SEGMENT(sd->type);
316  int k1 = k0 + 1;
317  int ka = max(k0 - 1, kcurve.first_key);
318  int kb = min(k1 + 1, kcurve.first_key + kcurve.num_keys - 1);
319 
320  float4 P_curve[4];
321 
322  P_curve[0] = kernel_data_fetch(curve_keys, ka);
323  P_curve[1] = kernel_data_fetch(curve_keys, k0);
324  P_curve[2] = kernel_data_fetch(curve_keys, k1);
325  P_curve[3] = kernel_data_fetch(curve_keys, kb);
326 
327  /* Interpolate position and tangent. */
328  sd->P = float4_to_float3(catmull_rom_basis_derivative(P_curve, sd->u));
329 #ifdef __DPDU__
330  sd->dPdu = float4_to_float3(catmull_rom_basis_derivative(P_curve, sd->u));
331 #endif
332 
333  /* Transform into world space */
334  if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
335  object_position_transform_auto(kg, sd, &sd->P);
336 #ifdef __DPDU__
337  object_dir_transform_auto(kg, sd, &sd->dPdu);
338 #endif
339  }
340 
341  /* No view direction, normals or bitangent. */
342  sd->I = zero_float3();
343  sd->N = zero_float3();
344  sd->Ng = zero_float3();
345 #ifdef __DPDU__
346  sd->dPdv = zero_float3();
347 #endif
348 
349  /* No ray differentials currently. */
350 #ifdef __RAY_DIFFERENTIALS__
351  sd->dP = differential3_zero();
352  sd->dI = differential3_zero();
353  sd->du = differential_zero();
354  sd->dv = differential_zero();
355 #endif
356 }
357 
358 /* ShaderData setup from ray into background */
359 
362  const float3 ray_P,
363  const float3 ray_D,
364  const float ray_time)
365 {
366  /* for NDC coordinates */
367  sd->ray_P = ray_P;
368 
369  /* vectors */
370  sd->P = ray_D;
371  sd->N = -ray_D;
372  sd->Ng = -ray_D;
373  sd->I = -ray_D;
374  sd->shader = kernel_data.background.surface_shader;
375  sd->flag = kernel_data_fetch(shaders, (sd->shader & SHADER_MASK)).flags;
376  sd->object_flag = 0;
377  sd->time = ray_time;
378  sd->ray_length = 0.0f;
379 
380  sd->object = OBJECT_NONE;
381  sd->lamp = LAMP_NONE;
382  sd->prim = PRIM_NONE;
383  sd->u = 0.0f;
384  sd->v = 0.0f;
385 
386 #ifdef __DPDU__
387  /* dPdu/dPdv */
388  sd->dPdu = zero_float3();
389  sd->dPdv = zero_float3();
390 #endif
391 
392 #ifdef __RAY_DIFFERENTIALS__
393  /* differentials */
394  sd->dP = differential3_zero(); /* TODO: ray->dP */
395  differential_incoming(&sd->dI, sd->dP);
396  sd->du = differential_zero();
397  sd->dv = differential_zero();
398 #endif
399 }
400 
401 /* ShaderData setup from point inside volume */
402 
403 #ifdef __VOLUME__
404 ccl_device_inline void shader_setup_from_volume(KernelGlobals kg,
406  ccl_private const Ray *ccl_restrict ray)
407 {
408 
409  /* vectors */
410  sd->P = ray->P + ray->D * ray->tmin;
411  sd->N = -ray->D;
412  sd->Ng = -ray->D;
413  sd->I = -ray->D;
414  sd->shader = SHADER_NONE;
415  sd->flag = 0;
416  sd->object_flag = 0;
417  sd->time = ray->time;
418  sd->ray_length = 0.0f; /* todo: can we set this to some useful value? */
419 
420  sd->object = OBJECT_NONE; /* todo: fill this for texture coordinates */
421  sd->lamp = LAMP_NONE;
422  sd->prim = PRIM_NONE;
423  sd->type = PRIMITIVE_VOLUME;
424 
425  sd->u = 0.0f;
426  sd->v = 0.0f;
427 
428 # ifdef __DPDU__
429  /* dPdu/dPdv */
430  sd->dPdu = zero_float3();
431  sd->dPdv = zero_float3();
432 # endif
433 
434 # ifdef __RAY_DIFFERENTIALS__
435  /* differentials */
436  sd->dP = differential3_zero(); /* TODO ray->dD */
437  differential_incoming(&sd->dI, sd->dP);
438  sd->du = differential_zero();
439  sd->dv = differential_zero();
440 # endif
441 
442  /* for NDC coordinates */
443  sd->ray_P = ray->P;
444 }
445 #endif /* __VOLUME__ */
446 
_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 const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
float float4[4]
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to curves
ATTR_WARN_UNUSED_RESULT const BMVert * v
#define ccl_restrict
Definition: cuda/compat.h:50
#define ccl_device
Definition: cuda/compat.h:32
#define ccl_private
Definition: cuda/compat.h:48
#define ccl_device_inline
Definition: cuda/compat.h:34
#define CCL_NAMESPACE_END
Definition: cuda/compat.h:9
double time
Light lamp
#define kernel_data
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
ccl_device void differential_dudv(ccl_private differential *du, ccl_private differential *dv, float3 dPdu, float3 dPdv, differential3 dP, float3 Ng)
Definition: differential.h:37
ccl_device_forceinline void differential_incoming_compact(ccl_private differential3 *dI, const float3 D, const float dD)
Definition: differential.h:139
ccl_device_forceinline void differential_transfer_compact(ccl_private differential3 *surface_dP, const float ray_dP, const float3, const float ray_dD, const float3 surface_Ng, const float ray_t)
Definition: differential.h:122
ccl_device differential differential_zero()
Definition: differential.h:86
ccl_device differential3 differential3_zero()
Definition: differential.h:95
ccl_device void differential_incoming(ccl_private differential3 *dI, const differential3 dD)
Definition: differential.h:28
ccl_device_inline Transform transform_inverse(const Transform tfm)
#define object_normal_transform_auto
#define object_position_transform_auto
#define object_dir_transform_auto
#define PRIMITIVE_PACK_SEGMENT(type, segment)
Definition: kernel/types.h:578
@ SD_BACKFACING
Definition: kernel/types.h:738
@ PRIMITIVE_LAMP
Definition: kernel/types.h:556
@ PRIMITIVE_NONE
Definition: kernel/types.h:550
@ PRIMITIVE_VOLUME
Definition: kernel/types.h:555
@ PRIMITIVE_CURVE
Definition: kernel/types.h:564
@ PRIMITIVE_CURVE_THICK
Definition: kernel/types.h:552
@ PRIMITIVE_TRIANGLE
Definition: kernel/types.h:551
@ PRIMITIVE_POINT
Definition: kernel/types.h:554
#define SHADER_NONE
Definition: kernel/types.h:39
#define PRIM_NONE
Definition: kernel/types.h:41
#define PRIMITIVE_UNPACK_SEGMENT(type)
Definition: kernel/types.h:579
#define OBJECT_NONE
Definition: kernel/types.h:40
ShaderData
Definition: kernel/types.h:925
@ SHADER_SMOOTH_NORMAL
Definition: kernel/types.h:435
@ SHADER_MASK
Definition: kernel/types.h:449
@ SD_OBJECT_MOTION
Definition: kernel/types.h:806
@ SD_OBJECT_TRANSFORM_APPLIED
Definition: kernel/types.h:808
#define LAMP_NONE
Definition: kernel/types.h:42
ccl_device_inline float3 zero_float3()
Definition: math_float3.h:80
static float P(float k)
Definition: math_interp.c:25
CCL_NAMESPACE_BEGIN ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals kg, ccl_private ShaderData *sd, const float3 P, const float3 D, const float ray_t, const int isect_object, const int isect_prim, bool is_local)
Segment< FEdge *, Vec3r > segment
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
#define I
ccl_device void shader_setup_from_displace(KernelGlobals kg, ccl_private ShaderData *ccl_restrict sd, int object, int prim, float u, float v)
Definition: shader_data.h:252
ccl_device_inline void shader_setup_from_sample(KernelGlobals kg, ccl_private ShaderData *ccl_restrict sd, const float3 P, const float3 Ng, const float3 I, int shader, int object, int prim, float u, float v, float t, float time, bool object_space, int lamp)
Definition: shader_data.h:134
ccl_device void shader_setup_from_curve(KernelGlobals kg, ccl_private ShaderData *ccl_restrict sd, int object, int prim, int segment, float u)
Definition: shader_data.h:285
ccl_device_inline void shader_setup_from_background(KernelGlobals kg, ccl_private ShaderData *ccl_restrict sd, const float3 ray_P, const float3 ray_D, const float ray_time)
Definition: shader_data.h:360
CCL_NAMESPACE_BEGIN ccl_device_inline void shader_setup_from_ray(KernelGlobals kg, ccl_private ShaderData *ccl_restrict sd, ccl_private const Ray *ccl_restrict ray, ccl_private const Intersection *ccl_restrict isect)
Definition: shader_data.h:28
#define min(a, b)
Definition: sort.c:35
float max
CCL_NAMESPACE_BEGIN ccl_device_inline float3 triangle_normal(KernelGlobals kg, ccl_private ShaderData *sd)
Definition: triangle.h:15
ccl_device_inline float3 triangle_smooth_normal(KernelGlobals kg, float3 Ng, int prim, float u, float v)
Definition: triangle.h:92
ccl_device_inline void triangle_point_normal(KernelGlobals kg, int object, int prim, float u, float v, ccl_private float3 *P, ccl_private float3 *Ng, ccl_private int *shader)
Definition: triangle.h:33
ccl_device_inline void triangle_dPdudv(KernelGlobals kg, int prim, ccl_private float3 *dPdu, ccl_private float3 *dPdv)
Definition: triangle.h:128
ccl_device_inline float3 triangle_point_from_uv(KernelGlobals kg, ccl_private ShaderData *sd, const int isect_object, const int isect_prim, const float u, const float v)
ccl_device_inline float3 float4_to_float3(const float4 a)
Definition: util/math.h:500