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