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