df438fe8d901366c41ec641b431efa8482fd9790
[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 #define LIGHT_SIZE      4
30
31 #define __SOBOL__
32 #define __INSTANCING__
33 #define __DPDU__
34 #define __UV__
35 #define __BACKGROUND__
36 #define __CAUSTICS_TRICKS__
37 #define __VISIBILITY_FLAG__
38 #define __RAY_DIFFERENTIALS__
39 #define __CAMERA_CLIPPING__
40 #define __INTERSECTION_REFINE__
41
42 #ifndef __KERNEL_OPENCL__
43 #define __SVM__
44 #define __EMISSION__
45 #define __TEXTURES__
46 #define __HOLDOUT__
47 #define __MULTI_CLOSURE__
48 #define __TRANSPARENT_SHADOWS__
49 //#define __MULTI_LIGHT__
50 #endif
51
52 #ifdef __KERNEL_CPU__
53 //#define __OSL__
54 #endif
55
56 //#define __SOBOL_FULL_SCREEN__
57 //#define __MODIFY_TP__
58 //#define __QBVH__
59
60 /* Path Tracing */
61
62 enum PathTraceDimension {
63         PRNG_FILTER_U = 0,
64         PRNG_FILTER_V = 1,
65         PRNG_LENS_U = 2,
66         PRNG_LENS_V = 3,
67         PRNG_BASE_NUM = 4,
68
69         PRNG_BSDF_U = 0,
70         PRNG_BSDF_V = 1,
71         PRNG_BSDF = 2,
72         PRNG_LIGHT = 3,
73         PRNG_LIGHT_U = 4,
74         PRNG_LIGHT_V = 5,
75         PRNG_LIGHT_F = 6,
76         PRNG_TERMINATE = 7,
77         PRNG_BOUNCE_NUM = 8
78 };
79
80 /* these flag values correspond exactly to OSL defaults, so be careful not to
81  * change this, or if you do, set the "raytypes" shading system attribute with
82  * your own new ray types and bitflag values */
83
84 enum PathRayFlag {
85         PATH_RAY_CAMERA = 1,
86         PATH_RAY_REFLECT = 2,
87         PATH_RAY_TRANSMIT = 4,
88         PATH_RAY_DIFFUSE = 8,
89         PATH_RAY_GLOSSY = 16,
90         PATH_RAY_SINGULAR = 32,
91         PATH_RAY_TRANSPARENT = 64,
92
93         PATH_RAY_SHADOW_OPAQUE = 128,
94         PATH_RAY_SHADOW_TRANSPARENT = 256,
95         PATH_RAY_SHADOW = (PATH_RAY_SHADOW_OPAQUE|PATH_RAY_SHADOW_TRANSPARENT),
96
97         PATH_RAY_MIS_SKIP = 512,
98
99         PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512)
100 };
101
102 /* Closure Label */
103
104 typedef enum ClosureLabel {
105         LABEL_NONE = 0,
106         LABEL_CAMERA = 1,
107         LABEL_LIGHT = 2,
108         LABEL_BACKGROUND = 4,
109         LABEL_TRANSMIT = 8,
110         LABEL_REFLECT = 16,
111         LABEL_VOLUME = 32,
112         LABEL_OBJECT = 64,
113         LABEL_DIFFUSE = 128,
114         LABEL_GLOSSY = 256,
115         LABEL_SINGULAR = 512,
116         LABEL_TRANSPARENT = 1024,
117         LABEL_STOP = 2048
118 } ClosureLabel;
119
120 /* Shader Flag */
121
122 typedef enum ShaderFlag {
123         SHADER_SMOOTH_NORMAL = (1 << 31),
124         SHADER_CAST_SHADOW = (1 << 30),
125         SHADER_AREA_LIGHT = (1 << 29),
126
127         SHADER_MASK = ~(SHADER_SMOOTH_NORMAL|SHADER_CAST_SHADOW|SHADER_AREA_LIGHT)
128 } ShaderFlag;
129
130 /* Light Type */
131
132 typedef enum LightType {
133         LIGHT_POINT,
134         LIGHT_DISTANT,
135         LIGHT_AREA
136 } LightType;
137
138 /* Differential */
139
140 typedef struct differential3 {
141         float3 dx;
142         float3 dy;
143 } differential3;
144
145 typedef struct differential {
146         float dx;
147         float dy;
148 } differential;
149
150 /* Ray */
151
152 typedef struct Ray {
153         float3 P;
154         float3 D;
155         float t;
156
157 #ifdef __RAY_DIFFERENTIALS__
158         differential3 dP;
159         differential3 dD;
160 #endif
161 } Ray;
162
163 /* Intersection */
164
165 typedef struct Intersection {
166         float t, u, v;
167         int prim;
168         int object;
169 } Intersection;
170
171 /* Attributes */
172
173 typedef enum AttributeElement {
174         ATTR_ELEMENT_FACE,
175         ATTR_ELEMENT_VERTEX,
176         ATTR_ELEMENT_CORNER,
177         ATTR_ELEMENT_VALUE,
178         ATTR_ELEMENT_NONE
179 } AttributeElement;
180
181 /* Closure data */
182
183 #define MAX_CLOSURE 8
184
185 typedef struct ShaderClosure {
186         ClosureType type;
187         float3 weight;
188
189 #ifdef __MULTI_CLOSURE__
190         float sample_weight;
191 #endif
192
193 #ifdef __OSL__
194         void *prim;
195 #else
196         float data0;
197         float data1;
198 #endif
199
200 } ShaderClosure;
201
202 /* Shader Data
203  *
204  * Main shader state at a point on the surface or in a volume. All coordinates
205  * are in world space. */
206
207 enum ShaderDataFlag {
208         /* runtime flags */
209         SD_BACKFACING = 1,              /* backside of surface? */
210         SD_EMISSION = 2,                /* have emissive closure? */
211         SD_BSDF = 4,                    /* have bsdf closure? */
212         SD_BSDF_HAS_EVAL = 8,   /* have non-singular bsdf closure? */
213         SD_BSDF_GLOSSY = 16,    /* have glossy bsdf */
214         SD_HOLDOUT = 32,                /* have holdout closure? */
215         SD_VOLUME = 64,                 /* have volume closure? */
216
217         /* shader flags */
218         SD_SAMPLE_AS_LIGHT = 128,                       /* direct light sample */
219         SD_HAS_SURFACE_TRANSPARENT = 256,       /* has surface transparency */
220         SD_HAS_VOLUME = 512,                            /* has volume shader */
221         SD_HOMOGENEOUS_VOLUME = 1024            /* has homogeneous volume */
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_direct_light;
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