1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
|
/**
* $Id$
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
* Interface to transform the Blender scene into renderable data.
*/
#ifndef RENDER_H
#define RENDER_H
/* ------------------------------------------------------------------------- */
/* This little preamble might be moved to a separate include. It contains */
/* some defines that should become functions, and some platform dependency */
/* fixes. I think it is risky to always include it... */
/* ------------------------------------------------------------------------- */
#ifdef __cplusplus
extern "C" {
#endif
/* ------------------------------------------------------------------------- */
/* Types */
/* Both external and internal types can be placed here. Make sure there are */
/* no dirty extras in the type files so they can be included without */
/* problems. If possible, make a note why the include is needed. */
/* ------------------------------------------------------------------------- */
#include "render_types.h"
/* ------------------------------------------------------------------------- */
/* Global variables */
/* These variable are global to the render module, and also externally */
/* visible. The file where they are defined must be added. */
/* ------------------------------------------------------------------------- */
extern RE_Render R; /* rendercore.c */
extern unsigned short *igamtab1; /* initrender.c */
extern unsigned short *gamtab; /* initrender.c */
struct View3D;
/* ------------------------------------------------------------------------- */
/* Function definitions */
/* */
/* All functions that need to be externally visible must be declared here. */
/* Currently, this interface contains 38 functions and 11 callbacks. */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* shadbuf.c (1) */
/* ------------------------------------------------------------------------- */
/* only for renderconvertor */
void RE_initshadowbuf(struct LampRen *lar, float mat[][4]);
/* ------------------------------------------------------------------------- */
/* initrender (9) */
/* ------------------------------------------------------------------------- */
struct View3D;
/**
* Guarded call to frame renderer? Tests several limits and boundary
* conditions.
*
* @param ogl_render_area The View3D area to use for OpenGL rendering
* (can be NULL unless render R_OGL flag is set)
*/
void RE_initrender(struct View3D *ogl_render_view3d);
/**
* only for renderconvertor
*/
void RE_setwindowclip(int mode, int jmode);
/*
* @param ogl_render_area The View3D area to use for OpenGL rendering
* (can be NULL unless render R_OGL flag is set)
*/
void RE_animrender(struct View3D *ogl_render_view3d);
void RE_free_render_data(void);
void RE_init_render_data(void);
/* jitterate is used by blenkernel effect */
void RE_jitterate1(float *jit1, float *jit2, int num, float rad1);
void RE_jitterate2(float *jit1, float *jit2, int num, float rad2);
void RE_make_existing_file(char *name);
void RE_floatbuffer_to_output(void);
/* ------------------------------------------------------------------------- */
/* zbuf (2) */
/* ------------------------------------------------------------------------- */
/**
* Converts a world coordinate into a homogenous coordinate in view
* coordinates. (WCS -> HCS)
* Also called in: shadbuf.c render.c radfactors.c
* initrender.c envmap.c editmesh.c
* @param v1 [3 floats] the world coordinate
* @param adr [4 floats] the homogenous view coordinate
*/
void RE_projectverto(float *v1,float *adr);
/**
* Something about doing radiosity z buffering?
* (called in radfactors.c), hope the RadView is defined already...
* Also called in: radfactors.c
* Note: Uses globals.
* @param radview radiosity view definition
*/
struct RadView;
struct RNode;
void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem);
/* ------------------------------------------------------------------------- */
/* texture (9) */
/* ------------------------------------------------------------------------- */
struct MTex;
struct Tex;
void init_render_textures(void);
void end_render_textures(void);
void init_render_texture(struct Tex *tex);
void end_render_texture(struct Tex *tex);
void do_material_tex(ShadeInput *shi);
void do_lamp_tex(struct LampRen *la, float *lavec, ShadeInput *shi, float *fcol);
int multitex_ext(struct Tex *tex, float *texvec, float *tin, float *tr, float *tg, float *tb, float *ta);
void externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta);
/* ------------------------------------------------------------------------- */
/* envmap (4) */
/* ------------------------------------------------------------------------- */
struct EnvMap;
struct Tex;
void RE_free_envmapdata(struct EnvMap *env);
void RE_free_envmap(struct EnvMap *env);
struct EnvMap *RE_add_envmap(void);
/* these two maybe not external? yes, they are, for texture.c */
struct EnvMap *RE_copy_envmap(struct EnvMap *env);
/* --------------------------------------------------------------------- */
/* rendercore (12) */
/* --------------------------------------------------------------------- */
float Phong_Spec(float *n, float *l, float *v, int hard);
float CookTorr_Spec(float *n, float *l, float *v, int hard);
float Blinn_Spec(float *n, float *l, float *v, float refrac, float spec_power);
float Toon_Spec( float *n, float *l, float *v, float size, float smooth);
float WardIso_Spec(float *n, float *l, float *v, float rms);
float OrenNayar_Diff(float *n, float *l, float *v, float rough);
float Toon_Diff( float *n, float *l, float *v, float size, float smooth);
float Minnaert_Diff( float nl, float *n, float *v, float darkness);
void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, float g, float b);
void ramp_diffuse_result(float *diff, ShadeInput *shi);
void do_specular_ramp(ShadeInput *shi, float is, float t, float *spec);
void ramp_spec_result(float *specr, float *specg, float *specb, ShadeInput *shi);
/* --------------------------------------------------------------------- */
/* renderdatabase (3) */
/* --------------------------------------------------------------------- */
struct VlakRen *RE_findOrAddVlak(int nr);
struct VertRen *RE_findOrAddVert(int nr);
struct HaloRen *RE_findOrAddHalo(int nr);
HaloRen *RE_inithalo(struct Material *ma, float *vec, float *vec1, float *orco, float hasize,
float vectsize, int seed);
/**
* callbacks (11):
*
* If the callbacks aren't set, rendering will still proceed as
* desired, but the concerning functionality will not be enabled.
*
* There need to be better uncoupling between the renderer and
* these functions still!
* */
void RE_set_test_break_callback(int (*f)(void));
void RE_set_timecursor_callback(void (*f)(int));
void RE_set_renderdisplay_callback(void (*f)(int, int, int, int, unsigned int *));
void RE_set_initrenderdisplay_callback(void (*f)(void));
void RE_set_clearrenderdisplay_callback(void (*f)(short));
void RE_set_printrenderinfo_callback(void (*f)(double,int));
void RE_set_getrenderdata_callback(void (*f)(void));
void RE_set_freerenderdata_callback(void (*f)(void));
/*from renderhelp, should disappear!!! */
/** Recalculate all normals on renderdata. */
void set_normalflags(void);
/**
* On loan from zbuf.h:
* Tests whether the first three coordinates should be clipped
* wrt. the fourth component. Bits 1 and 2 test on x, 3 and 4 test on
* y, 5 and 6 test on z:
* xyz > test => set first bit (01),
* xyz < -test => set second bit (10),
* xyz == test => reset both bits (00).
* Note: functionality is duplicated from an internal function
* Also called in: initrender.c, radfactors.c
* @param v [4 floats] a coordinate
* @return a vector of bitfields
*/
int RE_testclip(float *v);
/* patch for the external if, to support the split for the ui */
void RE_addalphaAddfac(char *doel, char *bron, char addfac);
void RE_sky_char(float *view, char *col);
void RE_renderflare(struct HaloRen *har);
/**
* Shade the pixel at xn, yn for halo har, and write the result to col.
* Also called in: previewrender.c
* @param har The halo to be rendered on this location
* @param col [char 4] The destination colour vector
* @param colf [float 4] destination colour vector (need both)
* @param zz Some kind of distance
* @param dist Square of the distance of this coordinate to the halo's center
* @param x [f] Pixel x relative to center
* @param y [f] Pixel y relative to center
* @param flarec Flare counter? Always har->flarec...
*/
void RE_shadehalo(struct HaloRen *har,
char *col, float *colf,
int zz,
float dist,
float x,
float y,
short flarec);
/***/
/* haloren->type: flags */
#define HA_ONLYSKY 1
#define HA_VECT 2
#define HA_XALPHA 4
#define HA_FLARECIRC 8
#ifdef __cplusplus
}
#endif
#endif /* RENDER_H */
|