Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5098 | clevermous | 1 | #ifndef _tgl_zgl_h_ |
2 | #define _tgl_zgl_h_ |
||
3 | |||
4 | #include |
||
5 | #include |
||
6 | #include |
||
7 | /*#include |
||
8 | #include |
||
9 | #include "zbuffer.h" |
||
10 | #include "zmath.h" |
||
11 | #include "zfeatures.h" |
||
12 | |||
13 | #define fputc(...) /*nothing*/ |
||
14 | #define fprintf(...) /*nothing*/ |
||
15 | #define vfprintf(...) /*nothing*/ |
||
16 | #undef stderr |
||
17 | #define stderr ((FILE*)-1) |
||
18 | |||
19 | |||
20 | /*#define DEBUG */ |
||
21 | /*#define NDEBUG */ |
||
22 | |||
23 | enum { |
||
24 | |||
25 | #define ADD_OP(a,b,c) OP_ ## a , |
||
26 | |||
27 | #include "opinfo.h" |
||
28 | |||
29 | }; |
||
30 | |||
31 | /* initially # of allocated GLVertexes (will grow when necessary) */ |
||
32 | #define POLYGON_MAX_VERTEX 16 |
||
33 | |||
34 | /* Max # of specular light pow buffers */ |
||
35 | #define MAX_SPECULAR_BUFFERS 8 |
||
36 | /* # of entries in specular buffer */ |
||
37 | #define SPECULAR_BUFFER_SIZE 1024 |
||
38 | /* specular buffer granularity */ |
||
39 | #define SPECULAR_BUFFER_RESOLUTION 1024 |
||
40 | |||
41 | |||
42 | #define MAX_MODELVIEW_STACK_DEPTH 32 |
||
43 | #define MAX_PROJECTION_STACK_DEPTH 8 |
||
44 | #define MAX_TEXTURE_STACK_DEPTH 8 |
||
45 | #define MAX_NAME_STACK_DEPTH 64 |
||
46 | #define MAX_TEXTURE_LEVELS 11 |
||
47 | #define MAX_LIGHTS 16 |
||
48 | |||
49 | #define VERTEX_HASH_SIZE 1031 |
||
50 | |||
51 | #define MAX_DISPLAY_LISTS 1024 |
||
52 | #define OP_BUFFER_MAX_SIZE 512 |
||
53 | |||
54 | #define TGL_OFFSET_FILL 0x1 |
||
55 | #define TGL_OFFSET_LINE 0x2 |
||
56 | #define TGL_OFFSET_POINT 0x4 |
||
57 | |||
58 | typedef struct GLSpecBuf { |
||
59 | int shininess_i; |
||
60 | int last_used; |
||
61 | float buf[SPECULAR_BUFFER_SIZE+1]; |
||
62 | struct GLSpecBuf *next; |
||
63 | } GLSpecBuf; |
||
64 | |||
65 | typedef struct GLLight { |
||
66 | V4 ambient; |
||
67 | V4 diffuse; |
||
68 | V4 specular; |
||
69 | V4 position; |
||
70 | V3 spot_direction; |
||
71 | float spot_exponent; |
||
72 | float spot_cutoff; |
||
73 | float attenuation[3]; |
||
74 | /* precomputed values */ |
||
75 | float cos_spot_cutoff; |
||
76 | V3 norm_spot_direction; |
||
77 | V3 norm_position; |
||
78 | /* we use a linked list to know which are the enabled lights */ |
||
79 | int enabled; |
||
80 | struct GLLight *next,*prev; |
||
81 | } GLLight; |
||
82 | |||
83 | typedef struct GLMaterial { |
||
84 | V4 emission; |
||
85 | V4 ambient; |
||
86 | V4 diffuse; |
||
87 | V4 specular; |
||
88 | float shininess; |
||
89 | |||
90 | /* computed values */ |
||
91 | int shininess_i; |
||
92 | int do_specular; |
||
93 | } GLMaterial; |
||
94 | |||
95 | |||
96 | typedef struct GLViewport { |
||
97 | int xmin,ymin,xsize,ysize; |
||
98 | V3 scale; |
||
99 | V3 trans; |
||
100 | int updated; |
||
101 | } GLViewport; |
||
102 | |||
103 | typedef union { |
||
104 | int op; |
||
105 | float f; |
||
106 | int i; |
||
107 | unsigned int ui; |
||
108 | void *p; |
||
109 | } GLParam; |
||
110 | |||
111 | typedef struct GLParamBuffer { |
||
112 | GLParam ops[OP_BUFFER_MAX_SIZE]; |
||
113 | struct GLParamBuffer *next; |
||
114 | } GLParamBuffer; |
||
115 | |||
116 | typedef struct GLList { |
||
117 | GLParamBuffer *first_op_buffer; |
||
118 | /* TODO: extensions for an hash table or a better allocating scheme */ |
||
119 | } GLList; |
||
120 | |||
121 | typedef struct GLVertex { |
||
122 | int edge_flag; |
||
123 | V3 normal; |
||
124 | V4 coord; |
||
125 | V4 tex_coord; |
||
126 | V4 color; |
||
127 | |||
128 | /* computed values */ |
||
129 | V4 ec; /* eye coordinates */ |
||
130 | V4 pc; /* coordinates in the normalized volume */ |
||
131 | int clip_code; /* clip code */ |
||
132 | ZBufferPoint zp; /* integer coordinates for the rasterization */ |
||
133 | } GLVertex; |
||
134 | |||
135 | typedef struct GLImage { |
||
136 | void *pixmap; |
||
137 | int xsize,ysize; |
||
138 | } GLImage; |
||
139 | |||
140 | /* textures */ |
||
141 | |||
142 | #define TEXTURE_HASH_TABLE_SIZE 256 |
||
143 | |||
144 | typedef struct GLTexture { |
||
145 | GLImage images[MAX_TEXTURE_LEVELS]; |
||
146 | int handle; |
||
147 | struct GLTexture *next,*prev; |
||
148 | } GLTexture; |
||
149 | |||
150 | |||
151 | /* shared state */ |
||
152 | |||
153 | typedef struct GLSharedState { |
||
154 | GLList **lists; |
||
155 | GLTexture **texture_hash_table; |
||
156 | } GLSharedState; |
||
157 | |||
158 | struct GLContext; |
||
159 | |||
160 | typedef void (*gl_draw_triangle_func)(struct GLContext *c, |
||
161 | GLVertex *p0,GLVertex *p1,GLVertex *p2); |
||
162 | |||
163 | /* display context */ |
||
164 | |||
165 | typedef struct GLContext { |
||
166 | /* Z buffer */ |
||
167 | ZBuffer *zb; |
||
168 | |||
169 | /* lights */ |
||
170 | GLLight lights[MAX_LIGHTS]; |
||
171 | GLLight *first_light; |
||
172 | V4 ambient_light_model; |
||
173 | int local_light_model; |
||
174 | int lighting_enabled; |
||
175 | int light_model_two_side; |
||
176 | |||
177 | /* materials */ |
||
178 | GLMaterial materials[2]; |
||
179 | int color_material_enabled; |
||
180 | int current_color_material_mode; |
||
181 | int current_color_material_type; |
||
182 | |||
183 | /* textures */ |
||
184 | GLTexture *current_texture; |
||
185 | int texture_2d_enabled; |
||
186 | |||
187 | /* shared state */ |
||
188 | GLSharedState shared_state; |
||
189 | |||
190 | /* current list */ |
||
191 | GLParamBuffer *current_op_buffer; |
||
192 | int current_op_buffer_index; |
||
193 | int exec_flag,compile_flag,print_flag; |
||
194 | |||
195 | /* matrix */ |
||
196 | |||
197 | int matrix_mode; |
||
198 | M4 *matrix_stack[3]; |
||
199 | M4 *matrix_stack_ptr[3]; |
||
200 | int matrix_stack_depth_max[3]; |
||
201 | |||
202 | M4 matrix_model_view_inv; |
||
203 | M4 matrix_model_projection; |
||
204 | int matrix_model_projection_updated; |
||
205 | int matrix_model_projection_no_w_transform; |
||
206 | int apply_texture_matrix; |
||
207 | |||
208 | /* viewport */ |
||
209 | GLViewport viewport; |
||
210 | |||
211 | /* current state */ |
||
212 | int polygon_mode_back; |
||
213 | int polygon_mode_front; |
||
214 | |||
215 | int current_front_face; |
||
216 | int current_shade_model; |
||
217 | int current_cull_face; |
||
218 | int cull_face_enabled; |
||
219 | int normalize_enabled; |
||
220 | gl_draw_triangle_func draw_triangle_front,draw_triangle_back; |
||
221 | |||
222 | /* selection */ |
||
223 | int render_mode; |
||
224 | unsigned int *select_buffer; |
||
225 | int select_size; |
||
226 | unsigned int *select_ptr,*select_hit; |
||
227 | int select_overflow; |
||
228 | int select_hits; |
||
229 | |||
230 | /* names */ |
||
231 | unsigned int name_stack[MAX_NAME_STACK_DEPTH]; |
||
232 | int name_stack_size; |
||
233 | |||
234 | /* clear */ |
||
235 | float clear_depth; |
||
236 | V4 clear_color; |
||
237 | |||
238 | /* current vertex state */ |
||
239 | V4 current_color; |
||
240 | unsigned int longcurrent_color[3]; /* precomputed integer color */ |
||
241 | V4 current_normal; |
||
242 | V4 current_tex_coord; |
||
243 | int current_edge_flag; |
||
244 | |||
245 | /* glBegin / glEnd */ |
||
246 | int in_begin; |
||
247 | int begin_type; |
||
248 | int vertex_n,vertex_cnt; |
||
249 | int vertex_max; |
||
250 | GLVertex *vertex; |
||
251 | |||
252 | /* opengl 1.1 arrays */ |
||
253 | float *vertex_array; |
||
254 | int vertex_array_size; |
||
255 | int vertex_array_stride; |
||
256 | float *normal_array; |
||
257 | int normal_array_stride; |
||
258 | float *color_array; |
||
259 | int color_array_size; |
||
260 | int color_array_stride; |
||
261 | float *texcoord_array; |
||
262 | int texcoord_array_size; |
||
263 | int texcoord_array_stride; |
||
264 | int client_states; |
||
265 | |||
266 | /* opengl 1.1 polygon offset */ |
||
267 | float offset_factor; |
||
268 | float offset_units; |
||
269 | int offset_states; |
||
270 | |||
271 | /* specular buffer. could probably be shared between contexts, |
||
272 | but that wouldn't be 100% thread safe */ |
||
273 | GLSpecBuf *specbuf_first; |
||
274 | int specbuf_used_counter; |
||
275 | int specbuf_num_buffers; |
||
276 | |||
277 | /* opaque structure for user's use */ |
||
278 | void *opaque; |
||
279 | /* resize viewport function */ |
||
280 | int (*gl_resize_viewport)(struct GLContext *c,int *xsize,int *ysize); |
||
281 | |||
282 | /* depth test */ |
||
283 | int depth_test; |
||
284 | } GLContext; |
||
285 | |||
286 | extern GLContext *gl_ctx; |
||
287 | |||
288 | void gl_add_op(GLParam *p); |
||
289 | |||
290 | /* clip.c */ |
||
291 | void gl_transform_to_viewport(GLContext *c,GLVertex *v); |
||
292 | void gl_draw_triangle(GLContext *c,GLVertex *p0,GLVertex *p1,GLVertex *p2); |
||
293 | void gl_draw_line(GLContext *c,GLVertex *p0,GLVertex *p1); |
||
294 | void gl_draw_point(GLContext *c,GLVertex *p0); |
||
295 | |||
296 | void gl_draw_triangle_point(GLContext *c, |
||
297 | GLVertex *p0,GLVertex *p1,GLVertex *p2); |
||
298 | void gl_draw_triangle_line(GLContext *c, |
||
299 | GLVertex *p0,GLVertex *p1,GLVertex *p2); |
||
300 | void gl_draw_triangle_fill(GLContext *c, |
||
301 | GLVertex *p0,GLVertex *p1,GLVertex *p2); |
||
302 | void gl_draw_triangle_select(GLContext *c, |
||
303 | GLVertex *p0,GLVertex *p1,GLVertex *p2); |
||
304 | |||
305 | /* matrix.c */ |
||
306 | void gl_print_matrix(const float *m); |
||
307 | /* |
||
308 | void glopLoadIdentity(GLContext *c,GLParam *p); |
||
309 | void glopTranslate(GLContext *c,GLParam *p);*/ |
||
310 | |||
311 | /* light.c */ |
||
312 | void gl_add_select(GLContext *c,unsigned int zmin,unsigned int zmax); |
||
313 | void gl_enable_disable_light(GLContext *c,int light,int v); |
||
314 | void gl_shade_vertex(GLContext *c,GLVertex *v); |
||
315 | |||
316 | void glInitTextures(GLContext *c); |
||
317 | void glEndTextures(GLContext *c); |
||
318 | GLTexture *alloc_texture(GLContext *c,int h); |
||
319 | |||
320 | /* image_util.c */ |
||
321 | void gl_convertRGB_to_5R6G5B(unsigned short *pixmap,unsigned char *rgb, |
||
322 | int xsize,int ysize); |
||
323 | void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb, |
||
324 | int xsize, int ysize); |
||
325 | void gl_resizeImage(unsigned char *dest,int xsize_dest,int ysize_dest, |
||
326 | unsigned char *src,int xsize_src,int ysize_src); |
||
327 | void gl_resizeImageNoInterpolate(unsigned char *dest,int xsize_dest,int ysize_dest, |
||
328 | unsigned char *src,int xsize_src,int ysize_src); |
||
329 | |||
330 | static inline GLContext *gl_get_context(void) |
||
331 | { |
||
332 | return gl_ctx; |
||
333 | }; |
||
334 | |||
335 | void gl_fatal_error(char *format, ...); |
||
336 | |||
337 | |||
338 | /* specular buffer "api" */ |
||
339 | GLSpecBuf *specbuf_get_buffer(GLContext *c, const int shininess_i, |
||
340 | const float shininess); |
||
341 | |||
342 | #ifdef __BEOS__ |
||
343 | void dprintf(const char *, ...); |
||
344 | |||
345 | #else /* !BEOS */ |
||
346 | |||
347 | #ifdef DEBUG |
||
348 | |||
349 | #define dprintf(format, args...) \ |
||
350 | fprintf(stderr,"In '%s': " format "\n",__FUNCTION__, ##args); |
||
351 | |||
352 | #else |
||
353 | |||
354 | #define dprintf(format, args...) |
||
355 | |||
356 | #endif |
||
357 | #endif /* !BEOS */ |
||
358 | |||
359 | /* glopXXX functions */ |
||
360 | |||
361 | #define ADD_OP(a,b,c) void glop ## a (GLContext *,GLParam *); |
||
362 | #include "opinfo.h" |
||
363 | |||
364 | /* this clip epsilon is needed to avoid some rounding errors after |
||
365 | several clipping stages */ |
||
366 | |||
367 | #define CLIP_EPSILON (1E-5) |
||
368 | |||
369 | static inline int gl_clipcode(float x,float y,float z,float w1) |
||
370 | { |
||
371 | float w; |
||
372 | |||
373 | w=w1 * (1.0 + CLIP_EPSILON); |
||
374 | return (x<-w) | |
||
375 | ((x>w)<<1) | |
||
376 | ((y<-w)<<2) | |
||
377 | ((y>w)<<3) | |
||
378 | ((z<-w)<<4) | |
||
379 | ((z>w)<<5) ; |
||
380 | } |
||
381 | |||
382 | #define RGBFtoRGBI(rf,gf,bf,ri,gi,bi) \ |
||
383 | {\ |
||
384 | ri = (unsigned int) (rf * (ZB_POINT_RED_MAX - ZB_POINT_RED_MIN) + \ |
||
385 | ZB_POINT_RED_MIN); \ |
||
386 | gi = (unsigned int) (gf * (ZB_POINT_GREEN_MAX - ZB_POINT_GREEN_MIN) + \ |
||
387 | ZB_POINT_GREEN_MIN); \ |
||
388 | bi = (unsigned int) (bf * (ZB_POINT_BLUE_MAX - ZB_POINT_BLUE_MIN) + \ |
||
389 | ZB_POINT_BLUE_MIN);\ |
||
390 | } |
||
391 | |||
392 | #endif /* _tgl_zgl_h_ */5)><5)>4)><4)>-w)<<4)>3)><3)>2)><2)>-w)<<2)>1)><1)>-w)> |