Initial revision
[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 /* ------------------------------------------------------------------------- */
39
40 /* Definitely weird: this equals 1<<21... so wtf?*/
41 #define MAXVERT (2<<20)
42 #define MAXVLAK (2<<20)
43
44
45 /* This is needed to not let VC choke on near and far... old
46  * proprietary MS extensions... */
47 #ifdef WIN32
48 #undef near
49 #undef far
50 #define near clipsta
51 #define far clipend
52 #endif
53
54 /* ------------------------------------------------------------------------- */
55
56 typedef struct RE_Render
57 {
58         float co[3];
59         float lo[3], gl[3], uv[3], ref[3], orn[3], winco[3], sticky[3], vcol[3];
60         float itot, i, ic, rgb, norm;
61         float vn[3], view[3], *vno, refcol[4];
62
63         float grvec[3], inprz, inprh;
64         float imat[3][3];
65
66         float viewmat[4][4], viewinv[4][4];
67         float persmat[4][4], persinv[4][4];
68         float winmat[4][4];
69         
70         short flag, osatex, osa, rt;
71         /**
72          * Screen sizes and positions, in pixels
73          */
74         short xstart, xend, ystart, yend, afmx, afmy;
75         short rectx;  /* Picture width - 1, normally xend - xstart. */  
76         short recty;  /* picture height - 1, normally yend - ystart. */
77
78         /**
79          * Distances and sizes in world coordinates nearvar, farvar were
80          * near and far, but VC in cpp mode chokes on it :( */
81         float near;    /* near clip distance */
82         float far;     /* far clip distance */
83         float ycor, zcor, pixsize, viewfac;
84
85
86         /* These three need to be 'handlerized'. Not an easy task... */
87 /*      RE_RenderDataHandle r; */
88         RenderData r;
89         World wrld;
90         ListBase parts;
91         
92         int totvlak, totvert, tothalo, totlamp;
93
94         /* internal: these two are a sort of cache for the render pipe */
95         struct VlakRen *vlr;
96         int vlaknr;
97         
98         /* external */
99         struct Material *mat, *matren;
100         /* internal, fortunately */
101         struct LampRen **la;
102         struct VlakRen **blovl;
103         struct VertRen **blove;
104         struct HaloRen **bloha;
105         
106         unsigned int *rectaccu;
107         unsigned int *rectz; /* z buffer: distance buffer */
108         unsigned int *rectf1, *rectf2;
109         unsigned int *rectot; /* z buffer: face index buffer, recycled as colour buffer! */
110         unsigned int *rectspare; /*  */
111         /* for 8 byte systems! */
112         long *rectdaps;
113         
114         short win, winpos, winx, winy, winxof, winyof;
115         short winpop, displaymode, sparex, sparey;
116
117         /* Not sure what these do... But they're pointers, so good for handlerization */
118         struct Image *backbuf, *frontbuf;
119         /* backbuf is an image that drawn as background */
120         
121 } RE_Render;
122
123 /* ------------------------------------------------------------------------- */
124
125 /** 
126  * Part as in part-rendering. An image rendered in parts is rendered
127  * to a list of parts, with x,y size, and a pointer to the render
128  * output stored per part. Internal!
129  */
130 typedef struct Part
131 {
132         struct Part *next, *prev;
133         unsigned int *rect;
134         short x, y;
135 } Part;
136
137 typedef struct ShadBuf {
138         short samp, shadhalostep;
139         float persmat[4][4];
140         float viewmat[4][4];
141         float winmat[4][4];
142         float *jit;
143         float d,far,pixsize,soft;
144         int co[3];
145         int size,bias;
146         unsigned long *zbuf;
147         char *cbuf;
148 } ShadBuf;
149
150 /* ------------------------------------------------------------------------- */
151
152 typedef struct VertRen
153 {
154         float co[3];
155         float n[3];
156         float ho[4];
157         float *orco;
158         float *sticky;
159         void *svert;                    /* smooth vert, only used during initrender */
160         short clip, texofs;             /* texofs= flag */
161 } VertRen;
162
163 /* ------------------------------------------------------------------------- */
164
165 struct halosort {
166         struct HaloRen *har;
167         unsigned int z;
168 };
169
170 /* ------------------------------------------------------------------------- */
171 struct Material;
172 struct MFace;
173 struct TFace;
174
175 typedef struct VlakRen
176 {
177         struct VertRen *v1, *v2, *v3, *v4;
178         float n[3], len;
179         struct Material *mat;
180         struct MFace *mface;
181         struct TFace *tface;
182         unsigned int *vcol;
183         char snproj, puno;
184         char flag, ec;
185         unsigned int lay;
186 } VlakRen;
187
188
189 typedef struct HaloRen
190 {       
191     float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
192     unsigned int zs, zd;
193     unsigned int zBufDist;/* depth in the z-buffer coordinate system */
194     short miny, maxy;
195     short hard, b, g, r;
196     char starpoints, add, type, tex;
197     char linec, ringc, seed;
198         short flarec; /* used to be a char. why ?*/
199     float hasize;
200     int pixels;
201     unsigned int lay;
202     struct Material *mat;
203 } HaloRen;
204
205 struct LampRen;
206 struct MTex;
207
208 /**
209  * For each lamp in a scene, a LampRen is created. It determines the
210  * properties of a lightsource.
211  */
212 typedef struct LampRen
213 {
214         float xs, ys, dist;
215         float co[3];
216         short type, mode;
217         float r, g, b;
218         float energy, haint;
219         int lay;
220         float spotsi,spotbl;
221         float vec[3];
222         float xsp, ysp, distkw, inpr;
223         float halokw, halo;
224         float ld1,ld2;
225
226         /* copied from Lamp, to decouple more rendering stuff */
227         /** Size of the shadowbuffer */
228         short bufsize;
229         /** Number of samples for the shadows */
230         short samp;
231         /** Softness factor for shadow */
232         float soft;
233         /** shadow plus halo: detail level */
234         short shadhalostep;
235         /** Near clip of the lamp */
236         float clipsta;
237         /** Far clip of the lamp */
238         float clipend;
239         /** A small depth offset to prevent self-shadowing. */
240         float bias;
241         
242         /** If the lamp casts shadows, one of these is filled. For the old
243      * renderer, shb is used, for the new pipeline the shadowBufOb,
244      * which should be a shadowbuffer handle. */
245         struct ShadBuf *shb;
246         void* shadowBufOb;
247
248         float imat[3][3];
249         float spottexfac;
250         float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
251         
252         struct LampRen *org;
253         struct MTex *mtex[8];
254 } LampRen;
255
256 #endif /* RENDER_TYPES_H */