Initial revision
[blender.git] / source / blender / render / extern / include / render.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  * Interface to transform the Blender scene into renderable data.
32  */
33
34 #ifndef RENDER_H
35 #define RENDER_H "$Id$"
36
37 /* ------------------------------------------------------------------------- */
38 /* This little preamble might be moved to a separate include. It contains    */
39 /* some defines that should become functions, and some platform dependency   */
40 /* fixes. I think it is risky to always include it...                        */
41 /* ------------------------------------------------------------------------- */
42
43 /* fix for OSA and defmaterial extern */
44 #include "BKE_osa_types.h"
45 #include "DNA_material_types.h"
46
47 #ifdef __cplusplus
48 extern "C" { 
49 #endif
50
51
52 /* For #undefs of stupid windows defines */
53 #ifdef WIN32
54 #include "BLI_winstuff.h"
55 #endif
56
57 /* ------------------------------------------------------------------------- */
58 /* Types                                                                     */
59 /* Both external and internal types can be placed here. Make sure there are  */
60 /* no dirty extras in the type files so they can be included without         */
61 /* problems. If possible, make a note why the include is needed.             */
62 /* ------------------------------------------------------------------------- */
63
64 #include "render_types.h"
65
66 /* ------------------------------------------------------------------------- */
67 /* Global variables                                                          */
68 /* These variable are global to the render module, and also externally       */
69 /* visible. The file where they are defined must be added.                   */
70 /* ------------------------------------------------------------------------- */
71
72 extern RE_Render         R;           /* rendercore.c */
73 extern Osa               O;           /* rendercore.c */
74 extern Material          defmaterial; /* initrender.c */
75 extern unsigned short   *igamtab1;    /* initrender.c */
76 extern unsigned short   *gamtab;      /* initrender.c */
77
78 struct View3D;
79
80 /* ------------------------------------------------------------------------- */
81 /* Function definitions                                                      */
82 /*                                                                           */
83 /* All functions that need to be externally visible must be declared here.   */
84 /* Currently, this interface contains 29 functions and 11 callbacks.         */
85 /* ------------------------------------------------------------------------- */
86
87
88 /* ------------------------------------------------------------------------- */
89 /* Needed for the outside world referring to shadowbuffers                   */
90 /* ------------------------------------------------------------------------- */
91
92 #ifndef RE_SHADOWBUFFERHANDLE
93 #define RE_SHADOWBUFFERHANDLE
94 #define RE_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name
95         RE_DECLARE_HANDLE(RE_ShadowBufferHandle);
96 #endif
97                 
98         /**
99          * Create a new, empty shadow buffer with certain settings.
100          *
101          * @param mode 0 is a dummy buffer, 1 is the old buffer for
102          * c-based shadowing, 2 is the old buffer with c++ refit , 2 is a
103          * deep buffer
104          */
105         extern RE_ShadowBufferHandle RE_createShadowBuffer(struct LampRen *lar,
106                                                                                                            float mat[][4],
107                                                                                                            int mode);
108
109         /**
110          * Delete a shadow buffer.
111          * @param shb handle to the buffer to be released
112          */
113         extern void RE_deleteShadowBuffer(RE_ShadowBufferHandle shb);
114
115
116         
117 /* ------------------------------------------------------------------------- */
118 /* initrender (14)                                                           */
119 /* ------------------------------------------------------------------------- */
120
121 struct View3D;
122
123 /**
124  * Guarded call to frame renderer? Tests several limits and boundary
125  * conditions. 
126  * 
127  * @param ogl_render_area The View3D area to use for OpenGL rendering
128  * (can be NULL unless render R_OGL flag is set)
129  */
130 void    RE_initrender(struct View3D *ogl_render_view3d);
131
132 /**
133  *
134  */
135 void    RE_setwindowclip(int mode, int jmode);
136
137 /*
138  * @param ogl_render_area The View3D area to use for OpenGL rendering
139  * (can be NULL unless render R_OGL flag is set)
140  */
141 void    RE_animrender(struct View3D *ogl_render_view3d);
142 void    RE_free_render_data(void);
143 void    RE_free_filt_mask(void);
144 void    RE_holoview(void);
145 void    RE_init_filt_mask(void);
146 void    RE_init_render_data(void);
147 void    RE_jitterate1(float *jit1, float *jit2, int num, float rad1);
148 void    RE_jitterate2(float *jit1, float *jit2, int num, float rad2);
149 void    RE_make_existing_file(char *name);
150
151 /* ------------------------------------------------------------------------- */
152 /* zbuf (2)                                                                  */
153 /* ------------------------------------------------------------------------- */
154
155 /**
156  * Converts a world coordinate into a homogenous coordinate in view
157  * coordinates. (WCS -> HCS)
158  * Also called in: shadbuf.c render.c radfactors.c
159  *                 initrender.c envmap.c editmesh.c
160  * @param v1  [3 floats] the world coordinate
161  * @param adr [4 floats] the homogenous view coordinate
162  */
163 void    RE_projectverto(float *v1,float *adr);
164
165 /**
166  * Something about doing radiosity z buffering?
167  * (called in radfactors.c), hope the RadView is defined already... 
168  * Also called in: radfactors.c
169  * Note: Uses globals.
170  * @param radview radiosity view definition
171  */
172         struct RadView;
173         struct RNode;
174 void    RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem);
175
176
177 /* ------------------------------------------------------------------------- */
178 /* envmap (5)                                                                   */
179 /* ------------------------------------------------------------------------- */
180         struct EnvMap;
181         struct Tex;
182 void    RE_free_envmapdata(struct EnvMap *env);
183 void    RE_free_envmap(struct EnvMap *env);
184 struct EnvMap *RE_add_envmap(void);
185 /* these two maybe not external? yes, they are, for texture.c */
186 struct EnvMap *RE_copy_envmap(struct EnvMap *env);
187 /* (used in texture.c) */
188 int     RE_envmaptex(struct Tex *tex, float *texvec, float *dxt, float *dyt);
189
190         /* --------------------------------------------------------------------- */
191         /* rendercore (2)                                                        */
192         /* --------------------------------------------------------------------- */
193         float   RE_Spec(float inp, int hard);
194
195         /* maybe not external */
196         void    RE_calc_R_ref(void);
197
198         /* --------------------------------------------------------------------- */
199         /* renderdatabase (3)                                                    */
200         /* --------------------------------------------------------------------- */
201         struct VlakRen *RE_findOrAddVlak(int nr);
202         struct VertRen *RE_findOrAddVert(int nr);
203         struct HaloRen *RE_findOrAddHalo(int nr);
204         HaloRen *RE_inithalo(Material *ma, 
205                                           float *vec, 
206                                           float *vec1, 
207                                           float *orco, 
208                                           float hasize, 
209                                           float vectsize);
210   
211
212         /**
213          * callbacks (11):
214          *
215          * If the callbacks aren't set, rendering will still proceed as
216          * desired, but the concerning functionality will not be enabled.
217          *
218          * There need to be better uncoupling between the renderer and
219          * these functions still!
220          * */
221         
222         void RE_set_test_break_callback(int (*f)(void));
223
224         void RE_set_timecursor_callback(void (*f)(int));
225
226         void RE_set_renderdisplay_callback(void (*f)(int, int, int, int, unsigned int *));
227         void RE_set_initrenderdisplay_callback(void (*f)(void));
228         void RE_set_clearrenderdisplay_callback(void (*f)(short));
229         
230         void RE_set_printrenderinfo_callback(void (*f)(double,int));
231
232         void RE_set_getrenderdata_callback(void (*f)(void));
233         void RE_set_freerenderdata_callback(void (*f)(void));
234         
235
236         /*from renderhelp, should disappear!!! */ 
237         /** Recalculate all normals on renderdata. */
238         void set_normalflags(void);
239         /**
240          * On loan from zbuf.h:
241          * Tests whether the first three coordinates should be clipped
242          * wrt. the fourth component. Bits 1 and 2 test on x, 3 and 4 test on
243          * y, 5 and 6 test on z:
244          * xyz >  test => set first bit   (01),
245          * xyz < -test => set second bit  (10),
246          * xyz == test => reset both bits (00).
247          * Note: functionality is duplicated from an internal function
248          * Also called in: initrender.c, radfactors.c
249          * @param  v [4 floats] a coordinate 
250          * @return a vector of bitfields
251          */
252         int RE_testclip(float *v); 
253
254         /* patch for the external if, to support the split for the ui */
255         void RE_addalphaAddfac(char *doel, char *bron, char addfac);
256         void RE_sky(char *col); 
257         void RE_renderflare(struct HaloRen *har); 
258         /**
259          * Shade the pixel at xn, yn for halo har, and write the result to col. 
260          * Also called in: previewrender.c
261          * @param har    The halo to be rendered on this location
262          * @param col    [unsigned int 3] The destination colour vector 
263          * @param zz     Some kind of distance
264          * @param dist   Square of the distance of this coordinate to the halo's center
265          * @param x      [f] Pixel x relative to center
266          * @param y      [f] Pixel y relative to center
267          * @param flarec Flare counter? Always har->flarec...
268          */
269         void RE_shadehalo(struct HaloRen *har,
270                                    char *col,
271                                    unsigned int zz,
272                                    float dist,
273                                    float x,
274                                    float y,
275                                    short flarec); 
276
277 /***/
278
279 /* haloren->type: flags */
280
281 #define HA_ONLYSKY              1
282 #define HA_VECT                 2
283 #define HA_XALPHA               4
284 #define HA_FLARECIRC    8
285
286 #ifdef __cplusplus
287 }
288 #endif
289
290 #endif /* RENDER_H */