svn merge ^/trunk/blender -r42778:42839
[blender.git] / intern / cycles / kernel / kernel_types.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 #ifndef __KERNEL_TYPES_H__
20 #define __KERNEL_TYPES_H__
21
22 #include "kernel_math.h"
23
24 #include "svm/svm_types.h"
25
26 CCL_NAMESPACE_BEGIN
27
28 /* constants */
29 #define OBJECT_SIZE             16
30 #define LIGHT_SIZE                      4
31 #define FILTER_TABLE_SIZE       256
32
33 /* device capabilities */
34 #ifdef __KERNEL_CPU__
35 #define __KERNEL_SHADING__
36 #define __KERNEL_ADV_SHADING__
37 #endif
38
39 #ifdef __KERNEL_CUDA__
40 #define __KERNEL_SHADING__
41 #if __CUDA_ARCH__ >= 200
42 #define __KERNEL_ADV_SHADING__
43 #endif
44 #endif
45
46 #ifdef __KERNEL_OPENCL__
47 //#define __KERNEL_SHADING__
48 //#define __KERNEL_ADV_SHADING__
49 #endif
50
51 /* kernel features */
52 #define __SOBOL__
53 #define __INSTANCING__
54 #define __DPDU__
55 #define __UV__
56 #define __BACKGROUND__
57 #define __CAUSTICS_TRICKS__
58 #define __VISIBILITY_FLAG__
59 #define __RAY_DIFFERENTIALS__
60 #define __CAMERA_CLIPPING__
61 #define __INTERSECTION_REFINE__
62
63 #ifdef __KERNEL_SHADING__
64 #define __SVM__
65 #define __EMISSION__
66 #define __TEXTURES__
67 #define __HOLDOUT__
68 #endif
69
70 #ifdef __KERNEL_ADV_SHADING__
71 #define __MULTI_CLOSURE__
72 #define __TRANSPARENT_SHADOWS__
73 #endif
74
75 //#define __MULTI_LIGHT__
76 //#define __OSL__
77 //#define __SOBOL_FULL_SCREEN__
78 //#define __MODIFY_TP__
79 //#define __QBVH__
80
81 /* Path Tracing */
82
83 enum PathTraceDimension {
84         PRNG_FILTER_U = 0,
85         PRNG_FILTER_V = 1,
86         PRNG_LENS_U = 2,
87         PRNG_LENS_V = 3,
88         PRNG_BASE_NUM = 4,
89
90         PRNG_BSDF_U = 0,
91         PRNG_BSDF_V = 1,
92         PRNG_BSDF = 2,
93         PRNG_LIGHT = 3,
94         PRNG_LIGHT_U = 4,
95         PRNG_LIGHT_V = 5,
96         PRNG_LIGHT_F = 6,
97         PRNG_TERMINATE = 7,
98         PRNG_BOUNCE_NUM = 8
99 };
100
101 /* these flag values correspond exactly to OSL defaults, so be careful not to
102  * change this, or if you do, set the "raytypes" shading system attribute with
103  * your own new ray types and bitflag values.
104  *
105  * for ray visibility tests in BVH traversal, the upper 20 bits are used for
106  * layer visibility tests. */
107
108 enum PathRayFlag {
109         PATH_RAY_CAMERA = 1,
110         PATH_RAY_REFLECT = 2,
111         PATH_RAY_TRANSMIT = 4,
112         PATH_RAY_DIFFUSE = 8,
113         PATH_RAY_GLOSSY = 16,
114         PATH_RAY_SINGULAR = 32,
115         PATH_RAY_TRANSPARENT = 64,
116
117         PATH_RAY_SHADOW_OPAQUE = 128,
118         PATH_RAY_SHADOW_TRANSPARENT = 256,
119         PATH_RAY_SHADOW = (PATH_RAY_SHADOW_OPAQUE|PATH_RAY_SHADOW_TRANSPARENT),
120
121         PATH_RAY_MIS_SKIP = 512,
122
123         PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512),
124
125         PATH_RAY_LAYER_SHIFT = (32-20)
126 };
127
128 /* Closure Label */
129
130 typedef enum ClosureLabel {
131         LABEL_NONE = 0,
132         LABEL_CAMERA = 1,
133         LABEL_LIGHT = 2,
134         LABEL_BACKGROUND = 4,
135         LABEL_TRANSMIT = 8,
136         LABEL_REFLECT = 16,
137         LABEL_VOLUME = 32,
138         LABEL_OBJECT = 64,
139         LABEL_DIFFUSE = 128,
140         LABEL_GLOSSY = 256,
141         LABEL_SINGULAR = 512,
142         LABEL_TRANSPARENT = 1024,
143         LABEL_STOP = 2048
144 } ClosureLabel;
145
146 /* Shader Flag */
147
148 typedef enum ShaderFlag {
149         SHADER_SMOOTH_NORMAL = (1 << 31),
150         SHADER_CAST_SHADOW = (1 << 30),
151         SHADER_AREA_LIGHT = (1 << 29),
152
153         SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT)
154 } ShaderFlag;
155
156 /* Light Type */
157
158 typedef enum LightType {
159         LIGHT_POINT,
160         LIGHT_DISTANT,
161         LIGHT_AREA
162 } LightType;
163
164 /* Differential */
165
166 typedef struct differential3 {
167         float3 dx;
168         float3 dy;
169 } differential3;
170
171 typedef struct differential {
172         float dx;
173         float dy;
174 } differential;
175
176 /* Ray */
177
178 typedef struct Ray {
179         float3 P;
180         float3 D;
181         float t;
182
183 #ifdef __RAY_DIFFERENTIALS__
184         differential3 dP;
185         differential3 dD;
186 #endif
187 } Ray;
188
189 /* Intersection */
190
191 typedef struct Intersection {
192         float t, u, v;
193         int prim;
194         int object;
195 } Intersection;
196
197 /* Attributes */
198
199 typedef enum AttributeElement {
200         ATTR_ELEMENT_FACE,
201         ATTR_ELEMENT_VERTEX,
202         ATTR_ELEMENT_CORNER,
203         ATTR_ELEMENT_VALUE,
204         ATTR_ELEMENT_NONE
205 } AttributeElement;
206
207 /* Closure data */
208
209 #define MAX_CLOSURE 8
210
211 typedef struct ShaderClosure {
212         ClosureType type;
213         float3 weight;
214
215 #ifdef __MULTI_CLOSURE__
216         float sample_weight;
217 #endif
218
219 #ifdef __OSL__
220         void *prim;
221 #else
222         float data0;
223         float data1;
224 #endif
225
226 } ShaderClosure;
227
228 /* Shader Data
229  *
230  * Main shader state at a point on the surface or in a volume. All coordinates
231  * are in world space. */
232
233 enum ShaderDataFlag {
234         /* runtime flags */
235         SD_BACKFACING = 1,              /* backside of surface? */
236         SD_EMISSION = 2,                /* have emissive closure? */
237         SD_BSDF = 4,                    /* have bsdf closure? */
238         SD_BSDF_HAS_EVAL = 8,   /* have non-singular bsdf closure? */
239         SD_BSDF_GLOSSY = 16,    /* have glossy bsdf */
240         SD_HOLDOUT = 32,                /* have holdout closure? */
241         SD_VOLUME = 64,                 /* have volume closure? */
242
243         /* shader flags */
244         SD_SAMPLE_AS_LIGHT = 128,                       /* direct light sample */
245         SD_HAS_SURFACE_TRANSPARENT = 256,       /* has surface transparency */
246         SD_HAS_VOLUME = 512,                            /* has volume shader */
247         SD_HOMOGENEOUS_VOLUME = 1024            /* has homogeneous volume */
248 };
249
250 typedef struct ShaderData {
251         /* position */
252         float3 P;
253         /* smooth normal for shading */
254         float3 N;
255         /* true geometric normal */
256         float3 Ng;
257         /* view/incoming direction */
258         float3 I;
259         /* shader id */
260         int shader;     
261         /* booleans describing shader, see ShaderDataFlag */
262         int flag;
263
264         /* primitive id if there is one, ~0 otherwise */
265         int prim;
266         /* parametric coordinates
267          * - barycentric weights for triangles */
268         float u, v;
269         /* object id if there is one, ~0 otherwise */
270         int object;
271
272 #ifdef __RAY_DIFFERENTIALS__
273         /* differential of P. these are orthogonal to Ng, not N */
274         differential3 dP;
275         /* differential of I */
276         differential3 dI;
277         /* differential of u, v */
278         differential du;
279         differential dv;
280 #endif
281 #ifdef __DPDU__
282         /* differential of P w.r.t. parametric coordinates. note that dPdu is
283          * not readily suitable as a tangent for shading on triangles. */
284         float3 dPdu, dPdv;
285 #endif
286
287 #ifdef __MULTI_CLOSURE__
288         /* Closure data, we store a fixed array of closures */
289         ShaderClosure closure[MAX_CLOSURE];
290         int num_closure;
291         float randb_closure;
292 #else
293         /* Closure data, with a single sampled closure for low memory usage */
294         ShaderClosure closure;
295 #endif
296
297 #ifdef __OSL__
298         /* OSL context */
299         void *osl_ctx;
300 #endif
301 } ShaderData;
302
303 /* Constrant Kernel Data
304  *
305  * These structs are passed from CPU to various devices, and the struct layout
306  * must match exactly. Structs are padded to ensure 16 byte alignment, and we
307  * do not use float3 because its size may not be the same on all devices. */
308
309 typedef struct KernelCamera {
310         /* type */
311         int ortho;
312         int pad1, pad2, pad3;
313
314         /* matrices */
315         Transform cameratoworld;
316         Transform rastertocamera;
317
318         /* differentials */
319         float4 dx;
320         float4 dy;
321
322         /* depth of field */
323         float aperturesize;
324         float blades;
325         float bladesrotation;
326         float focaldistance;
327
328         /* motion blur */
329         float shutteropen;
330         float shutterclose;
331
332         /* clipping */
333         float nearclip;
334         float cliplength;
335
336         /* more matrices */
337         Transform screentoworld;
338         Transform rastertoworld;
339         Transform ndctoworld;
340         Transform worldtoscreen;
341         Transform worldtoraster;
342         Transform worldtondc;
343         Transform worldtocamera;
344 } KernelCamera;
345
346 typedef struct KernelFilm {
347         float exposure;
348         int pad1, pad2, pad3;
349 } KernelFilm;
350
351 typedef struct KernelBackground {
352         /* only shader index */
353         int shader;
354         int transparent;
355         int pad1, pad2;
356 } KernelBackground;
357
358 typedef struct KernelSunSky {
359         /* sun direction in spherical and cartesian */
360         float theta, phi, pad3, pad4;
361
362         /* perez function parameters */
363         float zenith_Y, zenith_x, zenith_y, pad2;
364         float perez_Y[5], perez_x[5], perez_y[5];
365         float pad5;
366 } KernelSunSky;
367
368 typedef struct KernelIntegrator {
369         /* emission */
370         int use_direct_light;
371         int num_distribution;
372         int num_all_lights;
373         float pdf_triangles;
374         float pdf_lights;
375
376         /* bounces */
377         int min_bounce;
378         int max_bounce;
379
380     int max_diffuse_bounce;
381     int max_glossy_bounce;
382     int max_transmission_bounce;
383
384         /* transparent */
385     int transparent_min_bounce;
386     int transparent_max_bounce;
387         int transparent_shadows;
388
389         /* caustics */
390         int no_caustics;
391
392         /* seed */
393         int seed;
394
395         /* render layer */
396         int layer_flag;
397 } KernelIntegrator;
398
399 typedef struct KernelBVH {
400         /* root node */
401         int root;
402         int attributes_map_stride;
403         int pad1, pad2;
404 } KernelBVH;
405
406 typedef struct KernelData {
407         KernelCamera cam;
408         KernelFilm film;
409         KernelBackground background;
410         KernelSunSky sunsky;
411         KernelIntegrator integrator;
412         KernelBVH bvh;
413 } KernelData;
414
415 CCL_NAMESPACE_END
416
417 #endif /*  __KERNEL_TYPES_H__ */
418