Merged 15170:15635 from trunk (no conflicts or even merges)
[blender.git] / source / blender / render / intern / include / render_types.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * Contributor(s): (c) 2006 Blender Foundation, full refactor
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef RENDER_TYPES_H
29 #define RENDER_TYPES_H
30
31 /* ------------------------------------------------------------------------- */
32 /* exposed internal in render module only! */
33 /* ------------------------------------------------------------------------- */
34
35 #include "DNA_color_types.h"
36 #include "DNA_scene_types.h"
37 #include "DNA_world_types.h"
38 #include "DNA_object_types.h"
39 #include "DNA_vec_types.h"
40
41 #include "BLI_threads.h"
42
43 #include "RE_pipeline.h"
44 #include "RE_shader_ext.h"      /* TexResult, ShadeResult, ShadeInput */
45 #include "sunsky.h"
46
47 struct Object;
48 struct MemArena;
49 struct VertTableNode;
50 struct VlakTableNode;
51 struct GHash;
52 struct RenderBuckets;
53 struct ObjectInstanceRen;
54
55 #define TABLEINITSIZE 1024
56 #define LAMPINITSIZE 256
57
58 typedef struct SampleTables
59 {
60         float centLut[16];
61         float *fmask1[9], *fmask2[9];
62         char cmask[256], *centmask;
63         
64 } SampleTables;
65
66 typedef struct QMCSampler
67 {
68         struct QMCSampler *next, *prev;
69         int type;
70         int tot;
71         int used;
72         double *samp2d;
73         double offs[BLENDER_MAX_THREADS][2];
74 } QMCSampler;
75
76 #define SAMP_TYPE_JITTERED              0
77 #define SAMP_TYPE_HALTON                1
78 #define SAMP_TYPE_HAMMERSLEY    2
79
80 /* this is handed over to threaded hiding/passes/shading engine */
81 typedef struct RenderPart
82 {
83         struct RenderPart *next, *prev;
84         
85         RenderResult *result;                   /* result of part rendering */
86         ListBase fullresult;                    /* optional full sample buffers */
87         
88         int *recto;                                             /* object table for objects */
89         int *rectp;                                             /* polygon index table */
90         int *rectz;                                             /* zbuffer */
91         int *rectmask;                                  /* negative zmask */
92         long *rectdaps;                                 /* delta acum buffer for pixel structs */
93         int *rectbacko;                                 /* object table for backside sss */
94         int *rectbackp;                                 /* polygon index table for backside sss */
95         int *rectbackz;                                 /* zbuffer for backside sss */
96         long *rectall;                                  /* buffer for all faces for sss */
97
98         rcti disprect;                                  /* part coordinates within total picture */
99         int rectx, recty;                               /* the size */
100         short crop, ready;                              /* crop is amount of pixels we crop, for filter */
101         short sample, nr;                               /* sample can be used by zbuffers, nr is partnr */
102         short thread;                                   /* thread id */
103         
104         char *clipflag;                                 /* clipflags for part zbuffering */
105 } RenderPart;
106
107 /* controls state of render, everything that's read-only during render stage */
108 struct Render
109 {
110         struct Render *next, *prev;
111         char name[RE_MAXNAME];
112         
113         /* state settings */
114         short flag, osa, ok, do_gamma;
115         
116         /* result of rendering */
117         RenderResult *result;
118         /* if render with single-layer option, other rendered layers are stored here */
119         RenderResult *pushedresult;
120         /* a list of RenderResults, for fullsample */
121         ListBase fullresult;    
122         
123         /* window size, display rect, viewplane */
124         int winx, winy;
125         rcti disprect;                  /* part within winx winy */
126         rctf viewplane;                 /* mapped on winx winy */
127         float viewdx, viewdy;   /* size of 1 pixel */
128         float clipcrop;                 /* 2 pixel boundary to prevent clip when filter used */
129         
130         /* final picture width and height (within disprect) */
131         int rectx, recty;
132         
133         /* real maximum amount of xparts/yparts after correction for minimum */
134         int xparts, yparts;
135         /* real maximum size of parts after correction for minimum 
136            partx*xparts can be larger than rectx, in that case last part is smaller */
137         int partx, party;
138         
139         /* values for viewing */
140         float lens, ycor, viewfac;
141         float panophi, panosi, panoco, panodxp, panodxv;
142         
143         /* Matrices */
144         float grvec[3];                 /* for world */
145         float imat[3][3];               /* copy of viewinv */
146         float viewmat[4][4], viewinv[4][4];
147         float winmat[4][4];
148         
149         /* clippping */
150         float clipsta;
151         float clipend;
152         
153         /* samples */
154         SampleTables *samples;
155         float jit[32][2];
156         ListBase *qmcsamplers;
157         
158         /* shadow counter, detect shadow-reuse for shaders */
159         int shadowsamplenr[BLENDER_MAX_THREADS];
160         
161         /* scene, and its full copy of renderdata and world */
162         Scene *scene;
163         RenderData r;
164         World wrld;
165         
166         ListBase parts;
167         
168         /* octree tables and variables for raytrace */
169         void *raytree;
170
171         /* occlusion tree */
172         void *occlusiontree;
173         ListBase strandsurface;
174         
175         /* use this instead of R.r.cfra */
176         float cfra;     
177         
178         /* render database */
179         int totvlak, totvert, tothalo, totstrand, totlamp;
180         struct HaloRen **sortedhalos;
181
182         ListBase lights;        /* GroupObject pointers */
183         ListBase lampren;       /* storage, for free */
184         
185         ListBase objecttable;
186
187         struct ObjectInstanceRen *objectinstance;
188         ListBase instancetable;
189         int totinstance;
190
191         struct Image *backbuf, *bakebuf;
192         
193         struct GHash *orco_hash;
194
195         struct GHash *sss_hash;
196         ListBase *sss_points;
197         struct Material *sss_mat;
198
199         ListBase customdata_names;
200
201         struct Object *excludeob;
202
203         /* arena for allocating data for use during render, for
204                 * example dynamic TFaces to go in the VlakRen structure.
205                 */
206         struct MemArena *memArena;
207         
208         /* callbacks */
209         void (*display_init)(RenderResult *rr);
210         void (*display_clear)(RenderResult *rr);
211         void (*display_draw)(RenderResult *rr, volatile rcti *rect);
212         
213         void (*stats_draw)(RenderStats *ri);
214         void (*timecursor)(int i);
215         
216         int (*test_break)(void);
217         int (*test_return)(void);
218         void (*error)(char *str);
219         
220         RenderStats i;
221 };
222
223 /* ------------------------------------------------------------------------- */
224
225 struct ISBData;
226
227 typedef struct ShadSampleBuf {
228         struct ShadSampleBuf *next, *prev;
229         long *zbuf;
230         char *cbuf;
231 } ShadSampleBuf;
232
233 typedef struct ShadBuf {
234         /* regular shadowbuffer */
235         short samp, shadhalostep, totbuf;
236         float persmat[4][4];
237         float viewmat[4][4];
238         float winmat[4][4];
239         float *jit, *weight;
240         float d, clipend, pixsize, soft;
241         int co[3];
242         int size, bias;
243         ListBase buffers;
244         
245         /* irregular shadowbufer, result stored per thread */
246         struct ISBData *isb_result[BLENDER_MAX_THREADS];
247 } ShadBuf;
248
249 /* ------------------------------------------------------------------------- */
250
251 typedef struct ObjectRen {
252         struct ObjectRen *next, *prev;
253         struct Object *ob, *par;
254         struct Scene *sce;
255         int index, psysindex, flag, lay;
256
257         float boundbox[2][3];
258
259         int totvert, totvlak, totstrand, tothalo;
260         int vertnodeslen, vlaknodeslen, strandnodeslen, blohalen;
261         struct VertTableNode *vertnodes;
262         struct VlakTableNode *vlaknodes;
263         struct StrandTableNode *strandnodes;
264         struct HaloRen **bloha;
265         struct StrandBuffer *strandbuf;
266
267         char (*mtface)[32];
268         char (*mcol)[32];
269         int  actmtface, actmcol, bakemtface;
270
271         float obmat[4][4];      /* only used in convertblender.c, for instancing */
272 } ObjectRen;
273
274 typedef struct ObjectInstanceRen {
275         struct ObjectInstanceRen *next, *prev;
276
277         ObjectRen *obr;
278         Object *ob, *par;
279         int index, psysindex, lay;
280
281         float mat[4][4], nmat[3][3]; /* nmat is inverse mat tranposed */
282         short flag;
283
284         float dupliorco[3], dupliuv[2];
285         float (*duplitexmat)[4];
286
287         float *vectors;
288         int totvector;
289 } ObjectInstanceRen;
290
291 /* ------------------------------------------------------------------------- */
292
293 typedef struct VertRen
294 {
295         float co[3];
296         float n[3];
297         float *orco;
298         short clip;
299         unsigned short flag;            /* in use for clipping zbuffer parts, temp setting stuff in convertblender.c */
300         float accum;            /* accum for radio weighting, and for strand texco static particles */
301         int index;                      /* index allows extending vertren with any property */
302 } VertRen;
303
304 /* ------------------------------------------------------------------------- */
305
306 struct halosort {
307         struct HaloRen *har;
308         int z;
309 };
310
311 /* ------------------------------------------------------------------------- */
312 struct Material;
313 struct MTFace;
314
315 typedef struct RadFace {
316         float unshot[3], totrad[3];
317         float norm[3], cent[3], area;
318         int flag;
319 } RadFace;
320
321 typedef struct VlakRen {
322         struct VertRen *v1, *v2, *v3, *v4;      /* keep in order for ** addressing */
323         float n[3];
324         struct Material *mat;
325         char puno;
326         char flag, ec;
327         int index;
328 } VlakRen;
329
330 typedef struct HaloRen
331 {       
332     short miny, maxy;
333     float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
334         float hard, b, g, r;
335     int zs, zd;
336     int zBufDist;       /* depth in the z-buffer coordinate system */
337     char starpoints, type, add, tex;
338     char linec, ringc, seed;
339         short flarec; /* used to be a char. why ?*/
340     float hasize;
341     int pixels;
342     unsigned int lay;
343     struct Material *mat;
344 } HaloRen;
345
346 /* ------------------------------------------------------------------------- */
347
348 typedef struct StrandVert {
349         float co[3];
350         float strandco;
351 } StrandVert;
352
353 typedef struct StrandSurface {
354         struct StrandSurface *next, *prev;
355         ObjectRen obr;
356         int (*face)[4];
357         float (*co)[3];
358         /* for occlusion caching */
359         float (*col)[3];
360         /* for speedvectors */
361         float (*prevco)[3], (*nextco)[3];
362         int totvert, totface;
363 } StrandSurface;
364
365 typedef struct StrandBound {
366         int start, end;
367         float boundbox[2][3];
368 } StrandBound;
369
370 typedef struct StrandBuffer {
371         struct StrandBuffer *next, *prev;
372         struct StrandVert *vert;
373         struct StrandBound *bound;
374         int totvert, totbound;
375
376         struct ObjectRen *obr;
377         struct Material *ma;
378         struct StrandSurface *surface;
379         unsigned int lay;
380         int overrideuv;
381         int flag, maxdepth;
382         float adaptcos, minwidth, widthfade;
383
384         float winmat[4][4];
385         int winx, winy;
386 } StrandBuffer;
387
388 typedef struct StrandRen {
389         StrandVert *vert;
390         StrandBuffer *buffer;
391         int totvert, flag;
392         int clip, index;
393         float orco[3];
394 } StrandRen;
395
396
397 struct LampRen;
398 struct MTex;
399
400 /**
401  * For each lamp in a scene, a LampRen is created. It determines the
402  * properties of a lightsource.
403  */
404
405 typedef struct LampShadowSubSample {
406         int samplenr;
407         float shadfac[4];       /* rgba shadow */
408 } LampShadowSubSample;
409
410 typedef struct LampShadowSample {
411         LampShadowSubSample s[16];      /* MAX OSA */
412 } LampShadowSample;
413
414 typedef struct LampRen {
415         struct LampRen *next, *prev;
416         
417         float xs, ys, dist;
418         float co[3];
419         short type, mode;
420         float r, g, b, k;
421         float energy, haint;
422         int lay;
423         float spotsi,spotbl;
424         float vec[3];
425         float xsp, ysp, distkw, inpr;
426         float halokw, halo;
427         
428         short falloff_type;
429         float ld1,ld2;
430         struct CurveMapping *curfalloff;
431
432         /* copied from Lamp, to decouple more rendering stuff */
433         /** Size of the shadowbuffer */
434         short bufsize;
435         /** Number of samples for the shadows */
436         short samp;
437         /** Softness factor for shadow */
438         float soft;
439         /** amount of subsample buffers and type of filter for sampling */
440         short buffers, filtertype;
441         /** shadow buffer type (regular, irregular) */
442         short buftype;
443         /** autoclip */
444         short bufflag;
445         /** shadow plus halo: detail level */
446         short shadhalostep;
447         /** Near clip of the lamp */
448         float clipsta;
449         /** Far clip of the lamp */
450         float clipend;
451         /** A small depth offset to prevent self-shadowing. */
452         float bias;
453         
454         short ray_samp, ray_sampy, ray_sampz, ray_samp_method, ray_samp_type, area_shape, ray_totsamp;
455         short xold[BLENDER_MAX_THREADS], yold[BLENDER_MAX_THREADS];     /* last jitter table for area lights */
456         float area_size, area_sizey, area_sizez;
457         float adapt_thresh;
458
459         /* sun/sky */
460         struct SunSky *sunsky;
461         
462         struct ShadBuf *shb;
463         float *jitter;
464         
465         float imat[3][3];
466         float spottexfac;
467         float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
468         
469         float mat[3][3];        /* 3x3 part from lampmat x viewmat */
470         float area[8][3], areasize;
471         
472         /* passes & node shader support: all shadow info for a pixel */
473         LampShadowSample *shadsamp;
474                 
475         /* yafray: photonlight params */
476         int YF_numphotons, YF_numsearch;
477         short YF_phdepth, YF_useqmc, YF_bufsize;
478         float YF_causticblur, YF_ltradius;
479         float YF_glowint, YF_glowofs;
480         short YF_glowtype;
481         
482         /* ray optim */
483         VlakRen *vlr_last[BLENDER_MAX_THREADS];
484         ObjectInstanceRen *obi_last[BLENDER_MAX_THREADS];
485         
486         struct MTex *mtex[MAX_MTEX];
487
488         /* threading */
489         int thread_assigned;
490         int thread_ready;
491 } LampRen;
492
493 /* **************** defines ********************* */
494
495 /* R.r.mode flag is same as for renderdata */
496
497 /* R.flag */
498 #define R_ZTRA                  1
499 #define R_HALO                  2
500 #define R_SEC_FIELD             4
501 #define R_LAMPHALO              8
502 #define R_GLOB_NOPUNOFLIP       16
503 #define R_NEED_TANGENT  32
504 #define R_SKIP_MULTIRES 64
505 #define R_BAKE_TRACE    128
506 #define R_BAKING                256
507
508 /* vlakren->flag (vlak = face in dutch) char!!! */
509 #define R_SMOOTH                1
510 #define R_HIDDEN                2
511 /* strand flag, means special handling */
512 #define R_STRAND                4
513 #define R_NOPUNOFLIP    8
514 #define R_FULL_OSA              16
515 #define R_FACE_SPLIT    32
516 /* Tells render to divide face other way. */
517 #define R_DIVIDE_24             64      
518 /* vertex normals are tangent or view-corrected vector, for hair strands */
519 #define R_TANGENT               128             
520
521 /* strandbuffer->flag */
522 #define R_STRAND_BSPLINE        1
523 #define R_STRAND_B_UNITS        2
524
525 /* objectren->flag */
526 #define R_INSTANCEABLE          1
527
528 /* objectinstance->flag */
529 #define R_DUPLI_TRANSFORMED     1
530 #define R_ENV_TRANSFORMED       2
531 #define R_TRANSFORMED           (1|2)
532 #define R_NEED_VECTORS          4
533
534 #endif /* RENDER_TYPES_H */
535