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