Subsurface scattering:
[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_scene_types.h"
36 #include "DNA_world_types.h"
37 #include "DNA_object_types.h"
38 #include "DNA_vec_types.h"
39
40 #include "BLI_threads.h"
41
42 #include "RE_pipeline.h"
43 #include "RE_shader_ext.h"      /* TexResult, ShadeResult, ShadeInput */
44
45 struct Object;
46 struct MemArena;
47 struct VertTableNode;
48 struct VlakTableNode;
49 struct Octree;
50 struct GHash;
51
52 #define TABLEINITSIZE 1024
53 #define LAMPINITSIZE 256
54
55 typedef struct SampleTables
56 {
57         float centLut[16];
58         float *fmask1[9], *fmask2[9];
59         char cmask[256], *centmask;
60         
61 } SampleTables;
62
63 /* this is handed over to threaded hiding/passes/shading engine */
64 typedef struct RenderPart
65 {
66         struct RenderPart *next, *prev;
67         
68         /* result of part rendering */
69         RenderResult *result;
70         
71         int *rectp;                                             /* polygon index table */
72         int *rectz;                                             /* zbuffer */
73         long *rectdaps;                                 /* delta acum buffer for pixel structs */
74         int *rectbackp;                                 /* polygon index table for backside sss */
75         int *rectbackz;                                 /* zbuffer for backside sss */
76         long *rectall;                                  /* buffer for all faces for sss */
77         
78         rcti disprect;                                  /* part coordinates within total picture */
79         int rectx, recty;                               /* the size */
80         short crop, ready;                              /* crop is amount of pixels we crop, for filter */
81         short sample, nr;                               /* sample can be used by zbuffers, nr is partnr */
82         short thread;                                   /* thread id */
83         
84         char *clipflag;                                 /* clipflags for part zbuffering */
85 } RenderPart;
86
87 typedef struct Octree {
88         struct Branch **adrbranch;
89         struct Node **adrnode;
90         float ocsize;   /* ocsize: mult factor,  max size octree */
91         float ocfacx,ocfacy,ocfacz;
92         float min[3], max[3];
93         int ocres;
94         int branchcount, nodecount;
95 } Octree;
96
97 /* controls state of render, everything that's read-only during render stage */
98 struct Render
99 {
100         struct Render *next, *prev;
101         char name[RE_MAXNAME];
102         
103         /* state settings */
104         short flag, osa, ok, do_gamma;
105         
106         /* result of rendering */
107         RenderResult *result;
108         /* if render with single-layer option, other rendered layers are stored here */
109         RenderResult *pushedresult;
110         
111         /* window size, display rect, viewplane */
112         int winx, winy;
113         rcti disprect;                  /* part within winx winy */
114         rctf viewplane;                 /* mapped on winx winy */
115         float viewdx, viewdy;   /* size of 1 pixel */
116         float clipcrop;                 /* 2 pixel boundary to prevent clip when filter used */
117         
118         /* final picture width and height (within disprect) */
119         int rectx, recty;
120         
121         /* real maximum amount of xparts/yparts after correction for minimum */
122         int xparts, yparts;
123         /* real maximum size of parts after correction for minimum 
124            partx*xparts can be larger than rectx, in that case last part is smaller */
125         int partx, party;
126         
127         /* values for viewing */
128         float lens, ycor, viewfac;
129         float panophi, panosi, panoco, panodxp, panodxv;
130         
131         /* Matrices */
132         float grvec[3];                 /* for world */
133         float imat[3][3];               /* copy of viewinv */
134         float viewmat[4][4], viewinv[4][4];
135         float winmat[4][4];
136         
137         /* clippping */
138         float clipsta;
139         float clipend;
140         
141         /* samples */
142         SampleTables *samples;
143         float jit[32][2];
144         
145         /* scene, and its full copy of renderdata and world */
146         Scene *scene;
147         RenderData r;
148         World wrld;
149         
150         ListBase parts;
151         
152         /* octree tables and variables for raytrace */
153         Octree oc;
154         
155         /* use this instead of R.r.cfra */
156         float cfra;     
157         
158         /* render database */
159         int totvlak, totvert, tothalo, totlamp;
160         ListBase lights;        /* GroupObject pointers */
161         ListBase lampren;       /* storage, for free */
162         
163         int vertnodeslen;
164         struct VertTableNode *vertnodes;
165         int vlaknodeslen;
166         struct VlakTableNode *vlaknodes;
167         int blohalen;
168         struct HaloRen **bloha;
169         ListBase objecttable;
170
171         struct Image *backbuf, *bakebuf;
172         
173         struct GHash *orco_hash;
174
175         struct GHash *sss_hash;
176         ListBase *sss_points;
177         struct Material *sss_mat;
178
179         ListBase customdata_names;
180
181         /* arena for allocating data for use during render, for
182                 * example dynamic TFaces to go in the VlakRen structure.
183                 */
184         struct MemArena *memArena;
185         
186         /* callbacks */
187         void (*display_init)(RenderResult *rr);
188         void (*display_clear)(RenderResult *rr);
189         void (*display_draw)(RenderResult *rr, volatile rcti *rect);
190         
191         void (*stats_draw)(RenderStats *ri);
192         void (*timecursor)(int i);
193         
194         int (*test_break)(void);
195         int (*test_return)(void);
196         void (*error)(char *str);
197         
198         RenderStats i;
199 };
200
201 /* ------------------------------------------------------------------------- */
202
203 struct ISBData;
204
205 typedef struct ShadSampleBuf {
206         struct ShadSampleBuf *next, *prev;
207         long *zbuf;
208         char *cbuf;
209 } ShadSampleBuf;
210
211 typedef struct ShadBuf {
212         /* regular shadowbuffer */
213         short samp, shadhalostep, totbuf;
214         float persmat[4][4];
215         float viewmat[4][4];
216         float winmat[4][4];
217         float *jit, *weight;
218         float d, clipend, pixsize, soft;
219         int co[3];
220         int size, bias;
221         ListBase buffers;
222         
223         /* irregular shadowbufer, result stored per thread */
224         struct ISBData *isb_result[BLENDER_MAX_THREADS];
225 } ShadBuf;
226
227 /* ------------------------------------------------------------------------- */
228 /* lookup of objects in database */
229 typedef struct ObjectRen {
230         struct ObjectRen *next, *prev;
231         struct Object *ob, *par;
232         int index, startvert, endvert, startface, endface;
233         float *vectors;
234 } ObjectRen;
235
236 /* ------------------------------------------------------------------------- */
237
238 typedef struct VertRen
239 {
240         float co[3];
241         float n[3];
242         float ho[4];
243         float *orco;
244         short clip;     
245         unsigned short flag;            /* in use for clipping zbuffer parts, temp setting stuff in convertblender.c */
246         float accum;            /* accum for radio weighting, and for strand texco static particles */
247         int index;                      /* index allows extending vertren with any property */
248 } VertRen;
249
250 /* ------------------------------------------------------------------------- */
251
252 struct halosort {
253         struct HaloRen *har;
254         int z;
255 };
256
257 /* ------------------------------------------------------------------------- */
258 struct Material;
259 struct MTFace;
260
261 typedef struct RadFace {
262         float unshot[3], totrad[3];
263         float norm[3], cent[3], area;
264         int flag;
265 } RadFace;
266
267 typedef struct VlakRen {
268         struct VertRen *v1, *v2, *v3, *v4;      /* keep in order for ** addressing */
269         unsigned int lay;
270         float n[3];
271         struct Material *mat;
272         char noflag, puno;
273         char flag, ec;
274         RadFace *radface;
275         Object *ob;
276         int index;
277 } VlakRen;
278
279 typedef struct HaloRen
280 {       
281     short miny, maxy;
282     float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
283         float hard, b, g, r;
284     int zs, zd;
285     int zBufDist;       /* depth in the z-buffer coordinate system */
286     char starpoints, type, add, tex;
287     char linec, ringc, seed;
288         short flarec; /* used to be a char. why ?*/
289     float hasize;
290     int pixels;
291     unsigned int lay;
292     struct Material *mat;
293 } HaloRen;
294
295 struct LampRen;
296 struct MTex;
297
298 /**
299  * For each lamp in a scene, a LampRen is created. It determines the
300  * properties of a lightsource.
301  */
302
303 typedef struct LampShadowSubSample {
304         int samplenr;
305         float shadfac[4];       /* rgba shadow */
306 } LampShadowSubSample;
307
308 typedef struct LampShadowSample {
309         LampShadowSubSample s[16];      /* MAX OSA */
310 } LampShadowSample;
311
312 typedef struct LampRen {
313         struct LampRen *next, *prev;
314         
315         float xs, ys, dist;
316         float co[3];
317         short type, mode;
318         float r, g, b, k;
319         float energy, haint;
320         int lay;
321         float spotsi,spotbl;
322         float vec[3];
323         float xsp, ysp, distkw, inpr;
324         float halokw, halo;
325         float ld1,ld2;
326
327         /* copied from Lamp, to decouple more rendering stuff */
328         /** Size of the shadowbuffer */
329         short bufsize;
330         /** Number of samples for the shadows */
331         short samp;
332         /** Softness factor for shadow */
333         float soft;
334         /** amount of subsample buffers and type of filter for sampling */
335         short buffers, filtertype;
336         /** shadow buffer type (regular, irregular) */
337         short buftype;
338         /** autoclip */
339         short bufflag;
340         /** shadow plus halo: detail level */
341         short shadhalostep;
342         /** Near clip of the lamp */
343         float clipsta;
344         /** Far clip of the lamp */
345         float clipend;
346         /** A small depth offset to prevent self-shadowing. */
347         float bias;
348         
349         short ray_samp, ray_sampy, ray_sampz, ray_samp_type, area_shape, ray_totsamp;
350         short xold[BLENDER_MAX_THREADS], yold[BLENDER_MAX_THREADS];     /* last jitter table for area lights */
351         float area_size, area_sizey, area_sizez;
352         
353         struct ShadBuf *shb;
354         float *jitter;
355         
356         float imat[3][3];
357         float spottexfac;
358         float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
359         
360         float mat[3][3];        /* 3x3 part from lampmat x viewmat */
361         float area[8][3], areasize;
362         
363         /* passes & node shader support: all shadow info for a pixel */
364         LampShadowSample *shadsamp;
365         
366         /* yafray: photonlight params */
367         int YF_numphotons, YF_numsearch;
368         short YF_phdepth, YF_useqmc, YF_bufsize;
369         float YF_causticblur, YF_ltradius;
370         float YF_glowint, YF_glowofs;
371         short YF_glowtype;
372         
373         /* ray optim */
374         VlakRen *vlr_last[BLENDER_MAX_THREADS];
375         
376         struct MTex *mtex[MAX_MTEX];
377 } LampRen;
378
379 /* **************** defines ********************* */
380
381 /* R.r.mode flag is same as for renderdata */
382
383 /* R.flag */
384 #define R_ZTRA                  1
385 #define R_HALO                  2
386 #define R_SEC_FIELD             4
387 #define R_LAMPHALO              8
388 #define R_GLOB_NOPUNOFLIP       16
389
390 /* vlakren->flag (vlak = face in dutch) char!!! */
391 #define R_SMOOTH                1
392 #define R_VISIBLE               2
393 /* strand flag, means special handling */
394 #define R_STRAND                4
395 #define R_NOPUNOFLIP    8
396 #define R_FULL_OSA              16
397 #define R_FACE_SPLIT    32
398 /* Tells render to divide face other way. */
399 #define R_DIVIDE_24             64      
400 /* vertex normals are tangent or view-corrected vector, for hair strands */
401 #define R_TANGENT               128             
402
403 /* vlakren->noflag (char) */
404 #define R_SNPROJ_X              1
405 #define R_SNPROJ_Y              2
406 #define R_SNPROJ_Z              4
407 #define R_FLIPPED_NO    8
408
409
410
411 #endif /* RENDER_TYPES_H */
412