00001 #ifndef _tgl_zgl_h_
00002 #define _tgl_zgl_h_
00003
00004 #include <stdlib.h>
00005 #include <stdio.h>
00006 #include <math.h>
00007 #include <assert.h>
00008 #include "zbuffer.h"
00009 #include "zmath.h"
00010 #include "zfeatures.h"
00011
00012
00013 #define POLYGON_MAX_VERTEX 16
00014
00015
00016 #define MAX_SPECULAR_BUFFERS 8
00017
00018 #define SPECULAR_BUFFER_SIZE 1024
00019
00020 #define SPECULAR_BUFFER_RESOLUTION 1024
00021
00022
00023 #define MAX_MODELVIEW_STACK_DEPTH 32
00024 #define MAX_PROJECTION_STACK_DEPTH 8
00025 #define MAX_TEXTURE_STACK_DEPTH 8
00026 #define MAX_NAME_STACK_DEPTH 64
00027 #define MAX_TEXTURE_LEVELS 11
00028 #define MAX_LIGHTS 16
00029
00030 #define VERTEX_HASH_SIZE 1031
00031
00032 #define MAX_DISPLAY_LISTS 1024
00033 #define OP_BUFFER_MAX_SIZE 512
00034
00035 #define TGL_OFFSET_FILL 0x1
00036 #define TGL_OFFSET_LINE 0x2
00037 #define TGL_OFFSET_POINT 0x4
00038
00039 typedef struct GLSpecBuf {
00040 int shininess_i;
00041 int last_used;
00042 PN_stdfloat buf[SPECULAR_BUFFER_SIZE+1];
00043 struct GLSpecBuf *next;
00044 } GLSpecBuf;
00045
00046 typedef struct GLLight {
00047 V4 ambient;
00048 V4 diffuse;
00049 V4 specular;
00050 V4 position;
00051 V3 spot_direction;
00052 PN_stdfloat spot_exponent;
00053 PN_stdfloat spot_cutoff;
00054 PN_stdfloat attenuation[3];
00055
00056 PN_stdfloat cos_spot_cutoff;
00057 V3 norm_spot_direction;
00058 V3 norm_position;
00059 struct GLLight *next;
00060 } GLLight;
00061
00062 typedef struct GLMaterial {
00063 V4 emission;
00064 V4 ambient;
00065 V4 diffuse;
00066 V4 specular;
00067 PN_stdfloat shininess;
00068
00069
00070 int shininess_i;
00071 int do_specular;
00072 } GLMaterial;
00073
00074
00075 typedef struct GLViewport {
00076 int xmin,ymin,xsize,ysize;
00077 V3 scale;
00078 V3 trans;
00079 int updated;
00080 } GLViewport;
00081
00082 typedef struct GLScissor {
00083 PN_stdfloat left, right, bottom, top;
00084 } GLScissor;
00085
00086 typedef union {
00087 int op;
00088 PN_stdfloat f;
00089 int i;
00090 unsigned int ui;
00091 void *p;
00092 } GLParam;
00093
00094 typedef struct GLParamBuffer {
00095 GLParam ops[OP_BUFFER_MAX_SIZE];
00096 struct GLParamBuffer *next;
00097 } GLParamBuffer;
00098
00099 typedef struct GLList {
00100 GLParamBuffer *first_op_buffer;
00101
00102 } GLList;
00103
00104 typedef struct GLVertex {
00105 int edge_flag;
00106 V3 normal;
00107 V4 coord;
00108 V2 tex_coord[MAX_TEXTURE_STAGES];
00109 V4 color;
00110
00111
00112 V4 ec;
00113 V4 pc;
00114 int clip_code;
00115 ZBufferPoint zp;
00116 } GLVertex;
00117
00118
00119
00120
00121 typedef struct GLTexture {
00122 ZTextureLevel levels[MAX_MIPMAP_LEVELS];
00123 int num_levels;
00124 int xsize, ysize;
00125 int s_max, t_max;
00126 V4 border_color;
00127
00128 void *allocated_buffer;
00129 int total_bytecount;
00130 } GLTexture;
00131
00132 struct GLContext;
00133
00134 typedef void (*gl_draw_triangle_func)(struct GLContext *c,
00135 GLVertex *p0,GLVertex *p1,GLVertex *p2);
00136
00137
00138
00139 typedef struct GLContext {
00140
00141 ZBuffer *zb;
00142
00143
00144 GLLight lights[MAX_LIGHTS];
00145 GLLight *first_light;
00146 V4 ambient_light_model;
00147 int local_light_model;
00148 int lighting_enabled;
00149 int light_model_two_side;
00150
00151
00152 GLMaterial materials[2];
00153
00154
00155 GLTexture *current_textures[MAX_TEXTURE_STAGES];
00156 int num_textures_enabled;
00157
00158
00159 M4 matrix_projection;
00160 M4 matrix_model_view;
00161 M4 matrix_model_view_inv;
00162 M4 matrix_model_projection;
00163 int matrix_model_projection_updated;
00164 int matrix_model_projection_no_w_transform;
00165 int apply_texture_matrix;
00166
00167
00168 GLViewport viewport;
00169 GLScissor scissor;
00170
00171
00172 int smooth_shade_model;
00173 int cull_face_enabled;
00174 int cull_clockwise;
00175 int normalize_enabled;
00176 PN_stdfloat normal_scale;
00177
00178 gl_draw_triangle_func draw_triangle_front,draw_triangle_back;
00179 ZB_fillTriangleFunc zb_fill_tri;
00180
00181
00182 V4 current_color;
00183 V4 current_normal;
00184
00185
00186 int depth_test;
00187 int zbias;
00188
00189
00190
00191 GLSpecBuf *specbuf_first;
00192 int specbuf_used_counter;
00193 int specbuf_num_buffers;
00194 } GLContext;
00195
00196
00197 void glInit(GLContext *c, ZBuffer *zbuffer);
00198 void glClose(GLContext *c);
00199
00200
00201 void gl_transform_to_viewport(GLContext *c,GLVertex *v);
00202 void gl_draw_triangle(GLContext *c,GLVertex *p0,GLVertex *p1,GLVertex *p2);
00203 void gl_draw_line(GLContext *c,GLVertex *p0,GLVertex *p1);
00204 void gl_draw_point(GLContext *c,GLVertex *p0);
00205
00206 void gl_draw_triangle_point(GLContext *c,
00207 GLVertex *p0,GLVertex *p1,GLVertex *p2);
00208 void gl_draw_triangle_line(GLContext *c,
00209 GLVertex *p0,GLVertex *p1,GLVertex *p2);
00210 void gl_draw_triangle_fill(GLContext *c,
00211 GLVertex *p0,GLVertex *p1,GLVertex *p2);
00212
00213
00214 void gl_enable_disable_light(GLContext *c,int light,int v);
00215 void gl_shade_vertex(GLContext *c,GLVertex *v);
00216
00217
00218 void gl_eval_viewport(GLContext *c);
00219 void gl_vertex_transform(GLContext * c, GLVertex * v);
00220
00221
00222 void gl_convertRGB_to_5R6G5B(unsigned short *pixmap,unsigned char *rgb,
00223 int xsize,int ysize);
00224 void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb,
00225 int xsize, int ysize);
00226 void gl_resizeImage(unsigned char *dest,int xsize_dest,int ysize_dest,
00227 unsigned char *src,int xsize_src,int ysize_src);
00228 void gl_resizeImageNoInterpolate(unsigned char *dest,int xsize_dest,int ysize_dest,
00229 unsigned char *src,int xsize_src,int ysize_src);
00230
00231 GLContext *gl_get_context(void);
00232
00233 void gl_fatal_error(const char *format, ...);
00234
00235
00236
00237 GLSpecBuf *specbuf_get_buffer(GLContext *c, const int shininess_i,
00238 const PN_stdfloat shininess);
00239
00240
00241
00242
00243 #define CLIP_EPSILON (1E-5f)
00244
00245 static inline int gl_clipcode(PN_stdfloat x,PN_stdfloat y,PN_stdfloat z,PN_stdfloat w1)
00246 {
00247 PN_stdfloat w;
00248
00249 w = w1 * (1.0f + CLIP_EPSILON);
00250 return (x<-w) |
00251 ((x>w)<<1) |
00252 ((y<-w)<<2) |
00253 ((y>w)<<3) |
00254 ((z<-w)<<4) |
00255 ((z>w)<<5) ;
00256 }
00257
00258 #endif