Biiig commit! Thanks to 2-3 weeks of cvs freeze...
[blender.git] / source / blender / render / extern / include / render_types.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #ifndef RENDER_TYPES_H
34 #define RENDER_TYPES_H "$Id$"
35
36 #include "DNA_scene_types.h"
37 #include "DNA_world_types.h"
38 #include "DNA_object_types.h"
39
40 #define TABLEINITSIZE 1024
41 #define LAMPINITSIZE 256
42
43 /* This is needed to not let VC choke on near and far... old
44  * proprietary MS extensions... */
45 #ifdef WIN32
46 #undef near
47 #undef far
48 #define near clipsta
49 #define far clipend
50 #endif
51
52 /* ------------------------------------------------------------------------- */
53
54 /* localized texture result data */
55 typedef struct TexResult {
56         float tin, tr, tg, tb, ta;
57         int talpha;
58         float *nor;
59 } TexResult;
60
61 /* localized renderloop data */
62 typedef struct ShadeInput
63 {
64         struct Material *mat;
65         struct VlakRen *vlr;
66         float co[3];
67         
68         /* copy from material, keep synced so we can do memcopy */
69         /* current size: 23*4 */
70         float r, g, b;
71         float specr, specg, specb;
72         float mirr, mirg, mirb;
73         float ambr, ambb, ambg;
74         
75         float amb, emit, ang, spectra, ray_mirror;
76         float alpha, refl, spec, zoffs, add;
77         float translucency;
78         /* end direct copy from material */
79         
80         /* individual copies: */
81         int har;
82         
83         /* texture coordinates */
84         float lo[3], gl[3], uv[3], ref[3], orn[3], winco[3], sticky[3], vcol[3], rad[3];
85         float vn[3], view[3], refcol[4], displace[3];
86         /* dx/dy OSA coordinates */
87         float dxco[3], dyco[3];
88         float dxlo[3], dylo[3], dxgl[3], dygl[3], dxuv[3], dyuv[3];
89         float dxref[3], dyref[3], dxorn[3], dyorn[3];
90         float dxno[3], dyno[3], dxview, dyview;
91         float dxlv[3], dylv[3];
92         float dxwin[3], dywin[3];
93         float dxsticky[3], dysticky[3];
94         float dxrefract[3], dyrefract[3];
95         
96         float xs, ys;   /* pixel to be rendered */
97         short osatex;
98         int mask;
99         int depth;
100         
101 } ShadeInput;
102
103 /* here only stuff to initalize the render itself */
104 typedef struct RE_Render
105 {
106         float grvec[3];
107         float imat[3][3];
108
109         float viewmat[4][4], viewinv[4][4];
110         float persmat[4][4], persinv[4][4];
111         float winmat[4][4];
112         
113         short flag, osa, rt, pad;
114         /**
115          * Screen sizes and positions, in pixels
116          */
117         short xstart, xend, ystart, yend, afmx, afmy;
118         short rectx;  /* Picture width - 1, normally xend - xstart. */  
119         short recty;  /* picture height - 1, normally yend - ystart. */
120
121         /**
122          * Distances and sizes in world coordinates nearvar, farvar were
123          * near and far, but VC in cpp mode chokes on it :( */
124         float near;    /* near clip distance */
125         float far;     /* far clip distance */
126         float ycor, zcor, pixsize, viewfac;
127
128
129         /* These three need to be 'handlerized'. Not an easy task... */
130 /*      RE_RenderDataHandle r; */
131         RenderData r;
132         World wrld;
133         ListBase parts;
134         
135         int totvlak, totvert, tothalo, totlamp;
136
137         /* internal, fortunately */
138         struct LampRen **la;
139         struct VlakRen **blovl;
140         struct VertRen **blove;
141         struct HaloRen **bloha;
142         
143         unsigned int *rectaccu;
144         unsigned int *rectz; /* z buffer: distance buffer */
145         unsigned int *rectf1, *rectf2;
146         unsigned int *rectot; /* z buffer: face index buffer, recycled as colour buffer! */
147         unsigned int *rectspare; /*  */
148         /* for 8 byte systems! */
149         long *rectdaps;
150         float *rectftot;        /* original full color buffer */
151         
152         short win, winpos, winx, winy, winxof, winyof;
153         short winpop, displaymode, sparex, sparey;
154
155         /* Not sure what these do... But they're pointers, so good for handlerization */
156         struct Image *backbuf, *frontbuf;
157         /* backbuf is an image that drawn as background */
158         
159 } RE_Render;
160
161 /* ------------------------------------------------------------------------- */
162
163
164 typedef struct ShadBuf {
165         short samp, shadhalostep;
166         float persmat[4][4];
167         float viewmat[4][4];
168         float winmat[4][4];
169         float *jit;
170         float d,far,pixsize,soft;
171         int co[3];
172         int size,bias;
173         unsigned long *zbuf;
174         char *cbuf;
175 } ShadBuf;
176
177 /* ------------------------------------------------------------------------- */
178
179 typedef struct VertRen
180 {
181         float co[3];
182         float n[3];
183         float ho[4];
184         float rad[3];                   /* result radio rendering */
185         float *orco;
186         float *sticky;
187         void *svert;                    /* smooth vert, only used during initrender */
188         short clip, texofs;             /* texofs= flag */
189         float accum;                    /* accum for radio weighting */
190         short flag;
191 } VertRen;
192
193 /* ------------------------------------------------------------------------- */
194
195 struct halosort {
196         struct HaloRen *har;
197         unsigned int z;
198 };
199
200 /* ------------------------------------------------------------------------- */
201 struct Material;
202 struct TFace;
203
204 typedef struct RadFace {
205         float unshot[3], totrad[3];
206         float norm[3], cent[3], area;
207         int flag;
208 } RadFace;
209
210 typedef struct VlakRen
211 {
212         struct VertRen *v1, *v2, *v3, *v4;
213         unsigned int lay;
214         unsigned int raycount;
215         float n[3];
216         struct Material *mat;
217         struct TFace *tface;
218         unsigned int *vcol;
219         char snproj, puno;
220         char flag, ec;
221         RadFace *radface;
222         Object *ob;
223 } VlakRen;
224
225 /* vlakren->flag is in DNA_scene_types.h */
226
227 typedef struct HaloRen
228 {       
229     short miny, maxy;
230     float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
231         float hard, b, g, r;
232     unsigned int zs, zd;
233     unsigned int zBufDist;      /* depth in the z-buffer coordinate system */
234     char starpoints, type, add, tex;
235     char linec, ringc, seed;
236         short flarec; /* used to be a char. why ?*/
237     float hasize;
238     int pixels;
239     unsigned int lay;
240     struct Material *mat;
241 } HaloRen;
242
243 struct LampRen;
244 struct MTex;
245
246 /**
247  * For each lamp in a scene, a LampRen is created. It determines the
248  * properties of a lightsource.
249  */
250 typedef struct LampRen
251 {
252         float xs, ys, dist;
253         float co[3];
254         short type, mode;
255         float r, g, b, k;
256         float energy, haint;
257         int lay;
258         float spotsi,spotbl;
259         float vec[3];
260         float xsp, ysp, distkw, inpr;
261         float halokw, halo;
262         float ld1,ld2;
263
264         /* copied from Lamp, to decouple more rendering stuff */
265         /** Size of the shadowbuffer */
266         short bufsize;
267         /** Number of samples for the shadows */
268         short samp;
269         /** Softness factor for shadow */
270         float soft;
271         /** shadow plus halo: detail level */
272         short shadhalostep;
273         /** Near clip of the lamp */
274         float clipsta;
275         /** Far clip of the lamp */
276         float clipend;
277         /** A small depth offset to prevent self-shadowing. */
278         float bias;
279         
280         short ray_samp, ray_sampy, ray_sampz, ray_samp_type, area_shape, ray_totsamp;
281         float area_size, area_sizey, area_sizez;
282         
283         struct ShadBuf *shb;
284         float *jitter;
285         
286         float imat[3][3];
287         float spottexfac;
288         float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
289         
290         float mat[3][3];        /* 3x3 part from lampmat x viewmat */
291         float area[8][3], areasize;
292         
293         /* yafray: photonlight params */
294         int YF_numphotons, YF_numsearch;
295         short YF_phdepth, YF_useqmc, YF_bufsize;
296         float YF_causticblur, YF_ltradius;
297         
298         /* ray optim */
299         VlakRen *vlr_last;
300         
301         struct MTex *mtex[MAX_MTEX];
302 } LampRen;
303
304
305 #endif /* RENDER_TYPES_H */
306