Orange branch: Revived hidden treasure, the Groups!
[blender.git] / source / blender / render / extern / 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  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #ifndef RENDER_TYPES_H
31 #define RENDER_TYPES_H
32
33 #include "DNA_scene_types.h"
34 #include "DNA_world_types.h"
35 #include "DNA_object_types.h"
36
37 #define TABLEINITSIZE 1024
38 #define LAMPINITSIZE 256
39
40 /* This is needed to not let VC choke on near and far... old
41  * proprietary MS extensions... */
42 #ifdef WIN32
43 #undef near
44 #undef far
45 #define near clipsta
46 #define far clipend
47 #endif
48
49 /* ------------------------------------------------------------------------- */
50
51 /* localized texture result data */
52 typedef struct TexResult {
53         float tin, tr, tg, tb, ta;
54         int talpha;
55         float *nor;
56 } TexResult;
57
58 /* localized shade result data */
59 typedef struct ShadeResult 
60 {
61         float diff[3];
62         float spec[3];
63         float alpha;
64         
65 } ShadeResult;
66
67 /* localized renderloop data */
68 typedef struct ShadeInput
69 {
70         struct Material *mat;
71         struct VlakRen *vlr;
72         float co[3];
73         
74         /* copy from material, keep synced so we can do memcopy */
75         /* current size: 23*4 */
76         float r, g, b;
77         float specr, specg, specb;
78         float mirr, mirg, mirb;
79         float ambr, ambb, ambg;
80         
81         float amb, emit, ang, spectra, ray_mirror;
82         float alpha, refl, spec, zoffs, add;
83         float translucency;
84         /* end direct copy from material */
85         
86         /* individual copies: */
87         int har;
88         float layerfac;
89         
90         /* texture coordinates */
91         float lo[3], gl[3], uv[3], ref[3], orn[3], winco[3], sticky[3], vcol[3], rad[3];
92         float vn[3], vno[3], facenor[3], view[3], refcol[4], displace[3], strand, tang[3];
93         
94         /* dx/dy OSA coordinates */
95         float dxco[3], dyco[3];
96         float dxlo[3], dylo[3], dxgl[3], dygl[3], dxuv[3], dyuv[3];
97         float dxref[3], dyref[3], dxorn[3], dyorn[3];
98         float dxno[3], dyno[3], dxview, dyview;
99         float dxlv[3], dylv[3];
100         float dxwin[3], dywin[3];
101         float dxsticky[3], dysticky[3];
102         float dxrefract[3], dyrefract[3];
103         float dxstrand, dystrand;
104         
105         float xs, ys;   /* pixel to be rendered */
106         short osatex, puno;
107         int mask;
108         int depth;
109         
110 } ShadeInput;
111
112 struct MemArena;
113
114 /* here only stuff to initalize the render itself */
115 typedef struct RE_Render
116 {
117         float grvec[3];
118         float imat[3][3];
119
120         float viewmat[4][4], viewinv[4][4];
121         float persmat[4][4], persinv[4][4];
122         float winmat[4][4];
123         
124         short flag, osa, rt, pad;
125         /**
126          * Screen sizes and positions, in pixels
127          */
128         short xstart, xend, ystart, yend, afmx, afmy;
129         short rectx;  /* Picture width - 1, normally xend - xstart. */  
130         short recty;  /* picture height - 1, normally yend - ystart. */
131
132         /**
133          * Distances and sizes in world coordinates nearvar, farvar were
134          * near and far, but VC in cpp mode chokes on it :( */
135         float near;    /* near clip distance */
136         float far;     /* far clip distance */
137         float ycor, pixsize, viewfac;
138
139
140         /* These three need to be 'handlerized'. Not an easy task... */
141 /*      RE_RenderDataHandle r; */
142         RenderData r;
143         World wrld;
144         ListBase parts;
145         
146         int totvlak, totvert, tothalo, totlamp;
147
148         /* internal, fortunately */
149         ListBase lights;
150         struct LampRen **la;
151         struct VlakRen **blovl;
152         struct VertRen **blove;
153         struct HaloRen **bloha;
154
155         /* arena for allocating data for use during render, for
156          * example dynamic TFaces to go in the VlakRen structure.
157          */
158         struct MemArena *memArena;
159
160         int *rectaccu;
161         int *rectz; /* z buffer: distance buffer */
162         unsigned int *rectf1, *rectf2;
163         unsigned int *rectot; /* z buffer: face index buffer, recycled as colour buffer! */
164         unsigned int *rectspare; /*  */
165         /* for 8 byte systems! */
166         long *rectdaps;
167         float *rectftot;        /* original full color buffer */
168         
169         short win, winpos, winx, winy, winxof, winyof;
170         short winpop, displaymode, sparex, sparey;
171
172         /* Not sure what these do... But they're pointers, so good for handlerization */
173         struct Image *backbuf, *frontbuf;
174         /* backbuf is an image that drawn as background */
175         
176 } RE_Render;
177
178 /* ------------------------------------------------------------------------- */
179
180
181 typedef struct ShadBuf {
182         short samp, shadhalostep;
183         float persmat[4][4];
184         float viewmat[4][4];
185         float winmat[4][4];
186         float *jit;
187         float d,far,pixsize,soft;
188         int co[3];
189         int size,bias;
190         long *zbuf;
191         char *cbuf;
192 } ShadBuf;
193
194 /* ------------------------------------------------------------------------- */
195
196 typedef struct VertRen
197 {
198         float co[3];
199         float n[3];
200         float ho[4];
201         float rad[3];                   /* result radio rendering */
202         float *orco;
203         float *sticky;
204         void *svert;                    /* smooth vert, only used during initrender */
205         short clip;     
206         short flag;                             /* in use for clipping ztra parts */
207         float accum;                    /* accum for radio weighting, and for strand texco static particles */
208 } VertRen;
209
210 /* ------------------------------------------------------------------------- */
211
212 struct halosort {
213         struct HaloRen *har;
214         int z;
215 };
216
217 /* ------------------------------------------------------------------------- */
218 struct Material;
219 struct TFace;
220
221 typedef struct RadFace {
222         float unshot[3], totrad[3];
223         float norm[3], cent[3], area;
224         int flag;
225 } RadFace;
226
227 typedef struct VlakRen
228 {
229         struct VertRen *v1, *v2, *v3, *v4;
230         unsigned int lay;
231         unsigned int raycount;
232         float n[3];
233         struct Material *mat;
234         struct TFace *tface;
235         unsigned int *vcol;
236         char snproj, puno;
237         char flag, ec;
238         RadFace *radface;
239         Object *ob;
240 } VlakRen;
241
242 /* vlakren->flag is in DNA_scene_types.h */
243
244 typedef struct HaloRen
245 {       
246     short miny, maxy;
247     float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
248         float hard, b, g, r;
249     int zs, zd;
250     int zBufDist;       /* depth in the z-buffer coordinate system */
251     char starpoints, type, add, tex;
252     char linec, ringc, seed;
253         short flarec; /* used to be a char. why ?*/
254     float hasize;
255     int pixels;
256     unsigned int lay;
257     struct Material *mat;
258 } HaloRen;
259
260 struct LampRen;
261 struct MTex;
262
263 /**
264  * For each lamp in a scene, a LampRen is created. It determines the
265  * properties of a lightsource.
266  */
267 typedef struct LampRen
268 {
269         float xs, ys, dist;
270         float co[3];
271         short type, mode;
272         float r, g, b, k;
273         float energy, haint;
274         int lay;
275         float spotsi,spotbl;
276         float vec[3];
277         float xsp, ysp, distkw, inpr;
278         float halokw, halo;
279         float ld1,ld2;
280
281         /* copied from Lamp, to decouple more rendering stuff */
282         /** Size of the shadowbuffer */
283         short bufsize;
284         /** Number of samples for the shadows */
285         short samp;
286         /** Softness factor for shadow */
287         float soft;
288         /** shadow plus halo: detail level */
289         short shadhalostep;
290         /** Near clip of the lamp */
291         float clipsta;
292         /** Far clip of the lamp */
293         float clipend;
294         /** A small depth offset to prevent self-shadowing. */
295         float bias;
296         
297         short ray_samp, ray_sampy, ray_sampz, ray_samp_type, area_shape, ray_totsamp;
298         short xold1, yold1, xold2, yold2;       /* last jitter table for area lights */
299         float area_size, area_sizey, area_sizez;
300         
301         struct ShadBuf *shb;
302         float *jitter;
303         
304         float imat[3][3];
305         float spottexfac;
306         float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
307         
308         float mat[3][3];        /* 3x3 part from lampmat x viewmat */
309         float area[8][3], areasize;
310         
311         /* yafray: photonlight params */
312         int YF_numphotons, YF_numsearch;
313         short YF_phdepth, YF_useqmc, YF_bufsize;
314         float YF_causticblur, YF_ltradius;
315         float YF_glowint, YF_glowofs;
316         short YF_glowtype;
317         
318         /* ray optim */
319         VlakRen *vlr_last;
320         
321         struct MTex *mtex[MAX_MTEX];
322 } LampRen;
323
324 /* **************** defines ********************* */
325
326 /* mode flag is same as for renderdata */
327 /* flag */
328 #define R_ZTRA                  1
329 #define R_HALO                  2
330 #define R_SEC_FIELD             4
331 #define R_LAMPHALO              8
332 #define R_RENDERING             16
333 #define R_ANIMRENDER    32
334 #define R_REDRAW_PRV    64
335
336 /* vlakren->flag (vlak = face in dutch) char!!! */
337 #define R_SMOOTH                1
338 #define R_VISIBLE               2
339 /* strand flag, means special handling */
340 #define R_STRAND                4
341 #define R_NOPUNOFLIP    8
342 #define R_FULL_OSA              16
343 #define R_FACE_SPLIT    32
344 /* Tells render to divide face other way. */
345 #define R_DIVIDE_24             64      
346 /* vertex normals are tangent or view-corrected vector, for hair strands */
347 #define R_TANGENT               128             
348
349
350
351
352
353 #endif /* RENDER_TYPES_H */
354