Cycles: add some volume nodes, they don't actually do anything, this is just
[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         SD_VOLUME = 64                  /* have volume closure? */
223 };
224
225 typedef struct ShaderData {
226         /* position */
227         float3 P;
228         /* smooth normal for shading */
229         float3 N;
230         /* true geometric normal */
231         float3 Ng;
232         /* view/incoming direction */
233         float3 I;
234         /* shader id */
235         int shader;     
236         /* booleans describing shader, see ShaderDataFlag */
237         int flag;
238
239         /* primitive id if there is one, ~0 otherwise */
240         int prim;
241         /* parametric coordinates
242          * - barycentric weights for triangles */
243         float u, v;
244         /* object id if there is one, ~0 otherwise */
245         int object;
246
247 #ifdef __RAY_DIFFERENTIALS__
248         /* differential of P. these are orthogonal to Ng, not N */
249         differential3 dP;
250         /* differential of I */
251         differential3 dI;
252         /* differential of u, v */
253         differential du;
254         differential dv;
255 #endif
256 #ifdef __DPDU__
257         /* differential of P w.r.t. parametric coordinates. note that dPdu is
258          * not readily suitable as a tangent for shading on triangles. */
259         float3 dPdu, dPdv;
260 #endif
261
262 #ifdef __MULTI_CLOSURE__
263         /* Closure data, we store a fixed array of closures */
264         ShaderClosure closure[MAX_CLOSURE];
265         int num_closure;
266         float randb_closure;
267 #else
268         /* Closure data, with a single sampled closure for low memory usage */
269         ShaderClosure closure;
270 #endif
271
272 #ifdef __OSL__
273         /* OSL context */
274         void *osl_ctx;
275 #endif
276 } ShaderData;
277
278 /* Constrant Kernel Data */
279
280 typedef struct KernelCamera {
281         /* type */
282         int ortho;
283         int pad;
284
285         /* size */
286         int width, height;
287
288         /* matrices */
289         Transform cameratoworld;
290         Transform rastertocamera;
291
292         /* differentials */
293         float3 dx;
294 #ifndef WITH_OPENCL
295         float pad1;
296 #endif
297         float3 dy;
298 #ifndef WITH_OPENCL
299         float pad2;
300 #endif
301
302         /* depth of field */
303         float aperturesize;
304         float blades;
305         float bladesrotation;
306         float focaldistance;
307
308         /* motion blur */
309         float shutteropen;
310         float shutterclose;
311
312         /* clipping */
313         float nearclip;
314         float cliplength;
315
316         /* more matrices */
317         Transform screentoworld;
318         Transform rastertoworld;
319         Transform ndctoworld;
320         Transform worldtoscreen;
321         Transform worldtoraster;
322         Transform worldtondc;
323         Transform worldtocamera;
324 } KernelCamera;
325
326 typedef struct KernelFilm {
327         float exposure;
328         int pad1, pad2, pad3;
329 } KernelFilm;
330
331 typedef struct KernelBackground {
332         /* only shader index */
333         int shader;
334         int transparent;
335         int pad1, pad2;
336 } KernelBackground;
337
338 typedef struct KernelSunSky {
339         /* sun direction in spherical and cartesian */
340         float theta, phi, pad3, pad4;
341         float3 dir;
342 #ifndef WITH_OPENCL
343         float pad;
344 #endif
345
346         /* perez function parameters */
347         float zenith_Y, zenith_x, zenith_y, pad2;
348         float perez_Y[5], perez_x[5], perez_y[5];
349         float pad5;
350 } KernelSunSky;
351
352 typedef struct KernelIntegrator {
353         /* emission */
354         int use_emission;
355         int num_distribution;
356         int num_all_lights;
357         float pdf_triangles;
358         float pdf_lights;
359         float pdf_pad;
360
361         /* bounces */
362         int min_bounce;
363         int max_bounce;
364
365     int max_diffuse_bounce;
366     int max_glossy_bounce;
367     int max_transmission_bounce;
368
369         /* transparent */
370     int transparent_min_bounce;
371     int transparent_max_bounce;
372         int transparent_shadows;
373
374         /* caustics */
375         int no_caustics;
376         float blur_caustics;
377 } KernelIntegrator;
378
379 typedef struct KernelBVH {
380         /* root node */
381         int root;
382         int attributes_map_stride;
383         int pad1, pad2;
384 } KernelBVH;
385
386 typedef struct KernelData {
387         KernelCamera cam;
388         KernelFilm film;
389         KernelBackground background;
390         KernelSunSky sunsky;
391         KernelIntegrator integrator;
392         KernelBVH bvh;
393 } KernelData;
394
395 CCL_NAMESPACE_END
396
397 #endif /*  __KERNEL_TYPES_H__ */
398