-First port of Displacement mapping from tuhopuu. Image textures not working
[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         short flag;
163 } VertRen;
164
165 /* ------------------------------------------------------------------------- */
166
167 struct halosort {
168         struct HaloRen *har;
169         unsigned int z;
170 };
171
172 /* ------------------------------------------------------------------------- */
173 struct Material;
174 struct MFace;
175 struct TFace;
176
177 typedef struct RadFace {
178         float unshot[3], totrad[3];
179         float norm[3], cent[3], area;
180         int flag;
181 } RadFace;
182
183 typedef struct VlakRen
184 {
185         struct VertRen *v1, *v2, *v3, *v4;
186         float n[3], len;
187         struct Material *mat;
188         struct MFace *mface;
189         struct TFace *tface;
190         unsigned int *vcol;
191         char snproj, puno;
192         char flag, ec;
193         unsigned int lay;
194         unsigned int raycount;
195         RadFace *radface;
196         Object *ob;
197 } VlakRen;
198
199
200 typedef struct HaloRen
201 {       
202     float alfa, xs, ys, rad, radsq, sin, cos, co[3], no[3];
203     unsigned int zs, zd;
204     unsigned int zBufDist;/* depth in the z-buffer coordinate system */
205     short miny, maxy;
206     short hard, b, g, r;
207     char starpoints, add, type, tex;
208     char linec, ringc, seed;
209         short flarec; /* used to be a char. why ?*/
210     float hasize;
211     int pixels;
212     unsigned int lay;
213     struct Material *mat;
214 } HaloRen;
215
216 struct LampRen;
217 struct MTex;
218
219 /**
220  * For each lamp in a scene, a LampRen is created. It determines the
221  * properties of a lightsource.
222  */
223 typedef struct LampRen
224 {
225         float xs, ys, dist;
226         float co[3];
227         short type, mode;
228         float r, g, b, k;
229         float energy, haint;
230         int lay;
231         float spotsi,spotbl;
232         float vec[3];
233         float xsp, ysp, distkw, inpr;
234         float halokw, halo;
235         float ld1,ld2;
236
237         /* copied from Lamp, to decouple more rendering stuff */
238         /** Size of the shadowbuffer */
239         short bufsize;
240         /** Number of samples for the shadows */
241         short samp;
242         /** Softness factor for shadow */
243         float soft;
244         /** shadow plus halo: detail level */
245         short shadhalostep;
246         /** Near clip of the lamp */
247         float clipsta;
248         /** Far clip of the lamp */
249         float clipend;
250         /** A small depth offset to prevent self-shadowing. */
251         float bias;
252         
253         short ray_samp, ray_sampy, ray_sampz, ray_samp_type, area_shape, ray_totsamp;
254         float area_size, area_sizey, area_sizez;
255         
256         struct ShadBuf *shb;
257         float *jitter;
258         
259         float imat[3][3];
260         float spottexfac;
261         float sh_invcampos[3], sh_zfac; /* sh_= spothalo */
262         
263         float mat[3][3];        /* 3x3 part from lampmat x viewmat */
264         float area[8][3], areasize;
265         
266         struct LampRen *org;
267         struct MTex *mtex[8];
268 } LampRen;
269
270 #endif /* RENDER_TYPES_H */
271