ea3463f96aeaba49dbcc85527f9a082c31aa3735
[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         struct LampRen **la;
150         struct VlakRen **blovl;
151         struct VertRen **blove;
152         struct HaloRen **bloha;
153
154         /* arena for allocating data for use during render, for
155          * example dynamic TFaces to go in the VlakRen structure.
156          */
157         struct MemArena *memArena;
158
159         int *rectaccu;
160         int *rectz; /* z buffer: distance buffer */
161         unsigned int *rectf1, *rectf2;
162         unsigned int *rectot; /* z buffer: face index buffer, recycled as colour buffer! */
163         unsigned int *rectspare; /*  */
164         /* for 8 byte systems! */
165         long *rectdaps;
166         float *rectftot;        /* original full color buffer */
167         
168         short win, winpos, winx, winy, winxof, winyof;
169         short winpop, displaymode, sparex, sparey;
170
171         /* Not sure what these do... But they're pointers, so good for handlerization */
172         struct Image *backbuf, *frontbuf;
173         /* backbuf is an image that drawn as background */
174         
175 } RE_Render;
176
177 /* ------------------------------------------------------------------------- */
178
179
180 typedef struct ShadBuf {
181         short samp, shadhalostep;
182         float persmat[4][4];
183         float viewmat[4][4];
184         float winmat[4][4];
185         float *jit;
186         float d,far,pixsize,soft;
187         int co[3];
188         int size,bias;
189         long *zbuf;
190         char *cbuf;
191 } ShadBuf;
192
193 /* ------------------------------------------------------------------------- */
194
195 typedef struct VertRen
196 {
197         float co[3];
198         float n[3];
199         float ho[4];
200         float rad[3];                   /* result radio rendering */
201         float *orco;
202         float *sticky;
203         void *svert;                    /* smooth vert, only used during initrender */
204         short clip;     
205         short flag;                             /* in use for clipping ztra parts */
206         float accum;                    /* accum for radio weighting, and for strand texco static particles */
207 } VertRen;
208
209 /* ------------------------------------------------------------------------- */
210
211 struct halosort {
212         struct HaloRen *har;
213         int z;
214 };
215
216 /* ------------------------------------------------------------------------- */
217 struct Material;
218 struct TFace;
219
220 typedef struct RadFace {
221         float unshot[3], totrad[3];
222         float norm[3], cent[3], area;
223         int flag;
224 } RadFace;
225
226 typedef struct VlakRen
227 {
228         struct VertRen *v1, *v2, *v3, *v4;
229         unsigned int lay;
230         unsigned int raycount;
231         float n[3];
232         struct Material *mat;
233         struct TFace *tface;
234         unsigned int *vcol;
235         char snproj, puno;
236         char flag, ec;
237         RadFace *radface;
238         Object *ob;
239 } VlakRen;
240
241 /* vlakren->flag is in DNA_scene_types.h */
242
243 typedef struct HaloRen
244 {       
245     short miny, maxy;
246     float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
247         float hard, b, g, r;
248     int zs, zd;
249     int zBufDist;       /* depth in the z-buffer coordinate system */
250     char starpoints, type, add, tex;
251     char linec, ringc, seed;
252         short flarec; /* used to be a char. why ?*/
253     float hasize;
254     int pixels;
255     unsigned int lay;
256     struct Material *mat;
257 } HaloRen;
258
259 struct LampRen;
260 struct MTex;
261
262 /**
263  * For each lamp in a scene, a LampRen is created. It determines the
264  * properties of a lightsource.
265  */
266 typedef struct LampRen
267 {
268         float xs, ys, dist;
269         float co[3];
270         short type, mode;
271         float r, g, b, k;
272         float energy, haint;
273         int lay;
274         float spotsi,spotbl;
275         float vec[3];
276         float xsp, ysp, distkw, inpr;
277         float halokw, halo;
278         float ld1,ld2;
279
280         /* copied from Lamp, to decouple more rendering stuff */
281         /** Size of the shadowbuffer */
282         short bufsize;
283         /** Number of samples for the shadows */
284         short samp;
285         /** Softness factor for shadow */
286         float soft;
287         /** shadow plus halo: detail level */
288         short shadhalostep;
289         /** Near clip of the lamp */
290         float clipsta;
291         /** Far clip of the lamp */
292         float clipend;
293         /** A small depth offset to prevent self-shadowing. */
294         float bias;
295         
296         short ray_samp, ray_sampy, ray_sampz, ray_samp_type, area_shape, ray_totsamp;
297         short xold1, yold1, xold2, yold2;       /* last jitter table for area lights */
298         float area_size, area_sizey, area_sizez;
299         
300         struct ShadBuf *shb;
301         float *jitter;
302         
303         float imat[3][3];
304         float spottexfac;
305         float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
306         
307         float mat[3][3];        /* 3x3 part from lampmat x viewmat */
308         float area[8][3], areasize;
309         
310         /* yafray: photonlight params */
311         int YF_numphotons, YF_numsearch;
312         short YF_phdepth, YF_useqmc, YF_bufsize;
313         float YF_causticblur, YF_ltradius;
314         float YF_glowint, YF_glowofs;
315         short YF_glowtype;
316         
317         /* ray optim */
318         VlakRen *vlr_last;
319         
320         struct MTex *mtex[MAX_MTEX];
321 } LampRen;
322
323 /* **************** defines ********************* */
324
325 /* mode flag is same as for renderdata */
326 /* flag */
327 #define R_ZTRA                  1
328 #define R_HALO                  2
329 #define R_SEC_FIELD             4
330 #define R_LAMPHALO              8
331 #define R_RENDERING             16
332 #define R_ANIMRENDER    32
333 #define R_REDRAW_PRV    64
334
335 /* vlakren->flag (vlak = face in dutch) char!!! */
336 #define R_SMOOTH                1
337 #define R_VISIBLE               2
338 /* strand flag, means special handling */
339 #define R_STRAND                4
340 #define R_NOPUNOFLIP    8
341 #define R_FULL_OSA              16
342 #define R_FACE_SPLIT    32
343 /* Tells render to divide face other way. */
344 #define R_DIVIDE_24             64      
345 /* vertex normals are tangent or view-corrected vector, for hair strands */
346 #define R_TANGENT               128             
347
348
349
350
351
352 #endif /* RENDER_TYPES_H */
353