8083da971ed34c2080f798e597d5e44c825f8691
[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 #define OBJECT_SIZE 16
29
30 #define __SOBOL__
31 #define __INSTANCING__
32 #define __DPDU__
33 #define __UV__
34 #define __BACKGROUND__
35 #define __CAUSTICS_TRICKS__
36 #define __VISIBILITY_FLAG__
37 #define __RAY_DIFFERENTIALS__
38 #define __CAMERA_CLIPPING__
39 #define __INTERSECTION_REFINE__
40
41 #ifndef __KERNEL_OPENCL__
42 #define __SVM__
43 #define __EMISSION__
44 #define __TEXTURES__
45 #define __HOLDOUT__
46 #endif
47
48 #ifdef __KERNEL_CPU__
49 //#define __MULTI_CLOSURE__
50 //#define __MULTI_LIGHT__
51 //#define __TRANSPARENT_SHADOWS__
52 //#define __OSL__
53 #endif
54
55 //#define __SOBOL_FULL_SCREEN__
56 //#define __MODIFY_TP__
57 //#define __QBVH__
58
59 /* Path Tracing */
60
61 enum PathTraceDimension {
62         PRNG_FILTER_U = 0,
63         PRNG_FILTER_V = 1,
64         PRNG_LENS_U = 2,
65         PRNG_LENS_V = 3,
66         PRNG_BASE_NUM = 4,
67
68         PRNG_BSDF_U = 0,
69         PRNG_BSDF_V = 1,
70         PRNG_BSDF = 2,
71         PRNG_LIGHT = 3,
72         PRNG_LIGHT_U = 4,
73         PRNG_LIGHT_V = 5,
74         PRNG_LIGHT_F = 6,
75         PRNG_TERMINATE = 7,
76         PRNG_BOUNCE_NUM = 8
77 };
78
79 /* these flag values correspond exactly to OSL defaults, so be careful not to
80  * change this, or if you do, set the "raytypes" shading system attribute with
81  * your own new ray types and bitflag values */
82 enum PathRayFlag {
83         PATH_RAY_CAMERA = 1,
84         PATH_RAY_SHADOW = 2,
85         PATH_RAY_REFLECT = 4,
86         PATH_RAY_TRANSMIT = 8,
87         PATH_RAY_DIFFUSE = 16,
88         PATH_RAY_GLOSSY = 32,
89         PATH_RAY_SINGULAR = 64,
90         PATH_RAY_TRANSPARENT = 128,
91
92         PATH_RAY_ALL = (1|2|4|8|16|32|64|128)
93 };
94
95 /* Bidirectional Path Tracing */
96
97 enum BidirTraceDimension {
98         BRNG_FILTER_U = 0,
99         BRNG_FILTER_V = 1,
100         BRNG_LENS_U = 2,
101         BRNG_LENS_V = 3,
102         BRNG_LIGHT_U = 4,
103         BRNG_LIGHT_V = 5,
104         BRNG_LIGHT = 6,
105         BRNG_LIGHT_F = 7,
106         BRNG_EMISSIVE_U = 8,
107         BRNG_EMISSIVE_V = 9,
108         BRNG_BASE_NUM = 10,
109
110         BRNG_BSDF_U = 0,
111         BRNG_BSDF_V = 1,
112         BRNG_BSDF = 2,
113         BRNG_TERMINATE = 3,
114         BRNG_BOUNCE_NUM = 4
115 };
116
117 /* Closure Label */
118
119 typedef enum ClosureLabel {
120         LABEL_NONE = 0,
121         LABEL_CAMERA = 1,
122         LABEL_LIGHT = 2,
123         LABEL_BACKGROUND = 4,
124         LABEL_TRANSMIT = 8,
125         LABEL_REFLECT = 16,
126         LABEL_VOLUME = 32,
127         LABEL_OBJECT = 64,
128         LABEL_DIFFUSE = 128,
129         LABEL_GLOSSY = 256,
130         LABEL_SINGULAR = 512,
131         LABEL_TRANSPARENT = 1024,
132         LABEL_STOP = 2048
133 } ClosureLabel;
134
135 /* Ray Type */
136
137 typedef enum RayType {
138         RayTypeCamera = 1,
139         RayTypeShadow = 2,
140         RayTypeReflection = 4,
141         RayTypeRefraction = 8,
142         RayTypeDiffuse = 16,
143         RayTypeGlossy = 32
144 } RayType;
145
146 /* Differential */
147
148 typedef struct differential3 {
149         float3 dx;
150         float3 dy;
151 } differential3;
152
153 typedef struct differential {
154         float dx;
155         float dy;
156 } differential;
157
158 /* Ray */
159
160 typedef struct Ray {
161         float3 P;
162         float3 D;
163         float t;
164
165 #ifdef __RAY_DIFFERENTIALS__
166         differential3 dP;
167         differential3 dD;
168 #endif
169 } Ray;
170
171 /* Intersection */
172
173 typedef struct Intersection {
174         float t, u, v;
175         int prim;
176         int object;
177 } Intersection;
178
179 /* Attributes */
180
181 typedef enum AttributeElement {
182         ATTR_ELEMENT_FACE,
183         ATTR_ELEMENT_VERTEX,
184         ATTR_ELEMENT_CORNER,
185         ATTR_ELEMENT_VALUE,
186         ATTR_ELEMENT_NONE
187 } AttributeElement;
188
189 /* Closure data */
190
191 #define MAX_CLOSURE 8
192
193 typedef struct ShaderClosure {
194         ClosureType type;
195         float3 weight;
196
197 #ifdef __MULTI_CLOSURE__
198         float sample_weight;
199 #endif
200
201 #ifdef __OSL__
202         void *prim;
203 #else
204         float data0;
205         float data1;
206 #endif
207
208 } ShaderClosure;
209
210 /* Shader Data
211  *
212  * Main shader state at a point on the surface or in a volume. All coordinates
213  * are in world space. */
214
215 enum ShaderDataFlag {
216         SD_BACKFACING = 1,              /* backside of surface? */
217         SD_EMISSION = 2,                /* have emissive closure? */
218         SD_BSDF = 4,                    /* have bsdf closure? */
219         SD_BSDF_HAS_EVAL = 8,   /* have non-singular bsdf closure? */
220         SD_BSDF_GLOSSY = 16,    /* have glossy bsdf */
221         SD_HOLDOUT = 32                 /* have holdout closure? */
222 };
223
224 typedef struct ShaderData {
225         /* position */
226         float3 P;
227         /* smooth normal for shading */
228         float3 N;
229         /* true geometric normal */
230         float3 Ng;
231         /* view/incoming direction */
232         float3 I;
233         /* shader id */
234         int shader;     
235         /* booleans describing shader, see ShaderDataFlag */
236         int flag;
237
238         /* primitive id if there is one, ~0 otherwise */
239         int prim;
240         /* parametric coordinates
241          * - barycentric weights for triangles */
242         float u, v;
243         /* object id if there is one, ~0 otherwise */
244         int object;
245
246 #ifdef __RAY_DIFFERENTIALS__
247         /* differential of P. these are orthogonal to Ng, not N */
248         differential3 dP;
249         /* differential of I */
250         differential3 dI;
251         /* differential of u, v */
252         differential du;
253         differential dv;
254 #endif
255 #ifdef __DPDU__
256         /* differential of P w.r.t. parametric coordinates. note that dPdu is
257          * not readily suitable as a tangent for shading on triangles. */
258         float3 dPdu, dPdv;
259 #endif
260
261 #ifdef __MULTI_CLOSURE__
262         /* Closure data, we store a fixed array of closures */
263         ShaderClosure closure[MAX_CLOSURE];
264         int num_closure;
265         float randb_closure;
266 #else
267         /* Closure data, with a single sampled closure for low memory usage */
268         ShaderClosure closure;
269 #endif
270
271 #ifdef __OSL__
272         /* OSL context */
273         void *osl_ctx;
274 #endif
275 } ShaderData;
276
277 /* Constrant Kernel Data */
278
279 typedef struct KernelCamera {
280         /* type */
281         int ortho;
282         int pad;
283
284         /* size */
285         int width, height;
286
287         /* matrices */
288         Transform cameratoworld;
289         Transform rastertocamera;
290
291         /* differentials */
292         float3 dx;
293 #ifndef WITH_OPENCL
294         float pad1;
295 #endif
296         float3 dy;
297 #ifndef WITH_OPENCL
298         float pad2;
299 #endif
300
301         /* depth of field */
302         float aperturesize;
303         float blades;
304         float bladesrotation;
305         float focaldistance;
306
307         /* motion blur */
308         float shutteropen;
309         float shutterclose;
310
311         /* clipping */
312         float nearclip;
313         float cliplength;
314
315         /* more matrices */
316         Transform screentoworld;
317         Transform rastertoworld;
318         Transform ndctoworld;
319         Transform worldtoscreen;
320         Transform worldtoraster;
321         Transform worldtondc;
322         Transform worldtocamera;
323 } KernelCamera;
324
325 typedef struct KernelFilm {
326         float exposure;
327         int pad1, pad2, pad3;
328 } KernelFilm;
329
330 typedef struct KernelBackground {
331         /* only shader index */
332         int shader;
333         int transparent;
334         int pad1, pad2;
335 } KernelBackground;
336
337 typedef struct KernelSunSky {
338         /* sun direction in spherical and cartesian */
339         float theta, phi, pad3, pad4;
340         float3 dir;
341 #ifndef WITH_OPENCL
342         float pad;
343 #endif
344
345         /* perez function parameters */
346         float zenith_Y, zenith_x, zenith_y, pad2;
347         float perez_Y[5], perez_x[5], perez_y[5];
348         float pad5;
349 } KernelSunSky;
350
351 typedef struct KernelIntegrator {
352         /* emission */
353         int use_emission;
354         int num_distribution;
355         int num_all_lights;
356         float pdf_triangles;
357         float pdf_lights;
358         float pdf_pad;
359
360         /* bounces */
361         int min_bounce;
362         int max_bounce;
363
364     int max_diffuse_bounce;
365     int max_glossy_bounce;
366     int max_transmission_bounce;
367
368         /* transparent */
369     int transparent_min_bounce;
370     int transparent_max_bounce;
371         int transparent_shadows;
372
373         /* caustics */
374         int no_caustics;
375         float blur_caustics;
376 } KernelIntegrator;
377
378 typedef struct KernelBVH {
379         /* root node */
380         int root;
381         int attributes_map_stride;
382         int pad1, pad2;
383 } KernelBVH;
384
385 typedef struct KernelData {
386         KernelCamera cam;
387         KernelFilm film;
388         KernelBackground background;
389         KernelSunSky sunsky;
390         KernelIntegrator integrator;
391         KernelBVH bvh;
392 } KernelData;
393
394 CCL_NAMESPACE_END
395
396 #endif /*  __KERNEL_TYPES_H__ */
397