Panda3D
 All Classes Functions Variables Enumerations
zbuffer.h
00001 #ifndef _tgl_zbuffer_h_
00002 #define _tgl_zbuffer_h_
00003 
00004 /*
00005  * Z buffer
00006  */
00007 
00008 #include "zfeatures.h"
00009 #include "pbitops.h"
00010 
00011 typedef unsigned int ZPOINT;
00012 #define ZB_Z_BITS 20
00013 #define ZB_POINT_Z_FRAC_BITS 10  // These must add to < 32.
00014 
00015 /* The number of fractional bits below the S and T texture coords.
00016    The more we have, the more precise the texel calculation will be
00017    when we zoom into small details of a texture; but the greater
00018    chance we might overflow our 32-bit integer when texcoords get
00019    large.  This also limits our greatest texture size (its T dimension
00020    cannot exceed this number of bits).*/
00021 #define ZB_POINT_ST_FRAC_BITS 12
00022 
00023 /* This is the theoretical max number of bits we have available to
00024    shift down to achieve each next mipmap level, based on the size of
00025    a 32-bit int.  We need to preallocate mipmap arrays of this size. */
00026 #define MAX_MIPMAP_LEVELS (32 - ZB_POINT_ST_FRAC_BITS + 1)
00027 
00028 /* Returns the index within a texture level for the given (s, t) texel. */
00029 #define ZB_TEXEL(texture_level, s, t)                                   \
00030   ((((t) & (texture_level).t_mask) >> (texture_level).t_shift) |      \
00031    (((s) & (texture_level).s_mask) >> (texture_level).s_shift))
00032 
00033 #define ZB_LOOKUP_TEXTURE_NEAREST(texture_def, s, t) \
00034   (texture_def)->levels[0].pixmap[ZB_TEXEL((texture_def)->levels[0], s, t)]
00035 
00036 #define ZB_LOOKUP_TEXTURE_MIPMAP_NEAREST(texture_def, s, t, level) \
00037   (texture_def)->levels[(level)].pixmap[ZB_TEXEL((texture_def)->levels[(level)], s, t)]
00038 
00039 /* A special abs() function which doesn't require any branching
00040    instructions.  Might not work on some exotic hardware. */
00041 
00042 /* Also doesn't appear to be any faster in practice.  Guess gcc is
00043    already doing the right thing.  Is msvc? */
00044 //#define FAST_ABS(v) (((v) ^ ((v) >> (sizeof(v) * 8 - 1))) - ((v) >> (sizeof(v) * 8 - 1)))
00045 
00046 #define DO_CALC_MIPMAP_LEVEL(mipmap_level, mipmap_dx, dsdx, dtdx) \
00047   { \
00048     (mipmap_dx) = ((unsigned int)abs(dsdx) + (unsigned int)abs(dtdx)); \
00049     (mipmap_level) = get_next_higher_bit((mipmap_dx) >> ZB_POINT_ST_FRAC_BITS); \
00050     (mipmap_dx) &= ((1 << (((mipmap_level) - 1) + ZB_POINT_ST_FRAC_BITS)) - 1); \
00051   }
00052 
00053 #define ZB_POINT_RED_MIN   0x0000
00054 #define ZB_POINT_RED_MAX   0xffff
00055 #define ZB_POINT_GREEN_MIN 0x0000
00056 #define ZB_POINT_GREEN_MAX 0xffff
00057 #define ZB_POINT_BLUE_MIN  0x0000
00058 #define ZB_POINT_BLUE_MAX  0xffff
00059 #define ZB_POINT_ALPHA_MIN 0x0000
00060 #define ZB_POINT_ALPHA_MAX 0xffff
00061 
00062 /* display modes */
00063 #define ZB_MODE_5R6G5B  1  /* true color 16 bits */
00064 #define ZB_MODE_INDEX   2  /* color index 8 bits */
00065 #define ZB_MODE_RGBA    3  /* 32 bit rgba mode */
00066 #define ZB_MODE_RGB24   4  /* 24 bit rgb mode */
00067 #define ZB_NB_COLORS    225 /* number of colors for 8 bit display */
00068 
00069 #define RGB_TO_PIXEL(r,g,b) \
00070   ((((unsigned int)(r) << 8) & 0xff0000) | ((unsigned int)(g) & 0xff00) | ((unsigned int)(b) >> 8))
00071 #define RGBA_TO_PIXEL(r,g,b,a)                                   \
00072   ((((unsigned int)(a) << 16) & 0xff000000) | (((unsigned int)(r) << 8) & 0xff0000) | ((unsigned int)(g) & 0xff00) | ((unsigned int)(b) >> 8))
00073 #define RGBA8_TO_PIXEL(r,g,b,a)                                   \
00074   ((((unsigned int)(a) << 24) & 0xff000000) | (((unsigned int)(r) << 16) & 0xff0000) | (((unsigned int)(g) << 8) & 0xff00) | (unsigned int)(b))
00075 #define PIXEL_R(p) (((unsigned int)(p) & 0xff0000) >> 8)
00076 #define PIXEL_G(p) ((unsigned int)(p) & 0xff00)
00077 #define PIXEL_B(p) (((unsigned int)(p) & 0x00ff) << 8)
00078 #define PIXEL_A(p) (((unsigned int)(p) & 0xff000000) >> 16)
00079 typedef unsigned int PIXEL;
00080 #define PSZB 4
00081 #define PSZSH 5
00082 
00083 // Returns an unsigned product of c1 * c2
00084 #define PCOMPONENT_MULT(c1, c2) \
00085   ((((unsigned int)(c1) * (unsigned int)(c2))) >> 16)
00086 #define PCOMPONENT_MULT3(c1, c2, c3) \
00087   PCOMPONENT_MULT(c1, PCOMPONENT_MULT(c2, c3))
00088 #define PCOMPONENT_MULT4(c1, c2, c3, c4) \
00089   PCOMPONENT_MULT(PCOMPONENT_MULT(c1, c2), PCOMPONENT_MULT(c3, c4))
00090 
00091 // Returns a signed product of c1 * c2, where c1 is initially signed.
00092 // We leave 2 bits on the top to differentiate between c1 < 0 and c1 >
00093 // 0xffff; the result has the same sign.
00094 #define PALPHA_MULT(c1, c2) \
00095   (((int)(((int)(c1) >> 2) * (unsigned int)(c2))) >> 14)
00096 
00097 #define PCOMPONENT_BLEND(c1, c2, a2) \
00098   ((((unsigned int)(c1) * ((unsigned int)0xffff - (unsigned int)(a2)) + (unsigned int)(c2) * (unsigned int)(a2))) >> 16)
00099 
00100 #define PIXEL_BLEND(r1, g1, b1, r2, g2, b2, a2) \
00101   RGBA_TO_PIXEL(PCOMPONENT_BLEND(r1, r2, a2),   \
00102                 PCOMPONENT_BLEND(g1, g2, a2),   \
00103                 PCOMPONENT_BLEND(b1, b2, a2),   \
00104                 a2)
00105 #define PIXEL_BLEND_RGB(rgb, r, g, b, a) \
00106   PIXEL_BLEND(PIXEL_R(rgb), PIXEL_G(rgb), PIXEL_B(rgb), r, g, b, a)
00107 
00108 typedef struct {
00109   PIXEL *pixmap;
00110   unsigned int s_mask, s_shift, t_mask, t_shift;
00111 } ZTextureLevel;
00112 
00113 typedef struct ZBuffer ZBuffer;
00114 typedef struct ZBufferPoint ZBufferPoint;
00115 typedef struct ZTextureDef ZTextureDef;
00116 
00117 typedef void (*ZB_fillTriangleFunc)(ZBuffer *, ZBufferPoint *, ZBufferPoint *, ZBufferPoint *);
00118 
00119 typedef void (*ZB_storePixelFunc)(ZBuffer *zb, PIXEL &result, int r, int g, int b, int a);
00120 
00121 typedef PIXEL (*ZB_lookupTextureFunc)(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00122 
00123 typedef int (*ZB_texWrapFunc)(int coord, int max_coord); 
00124 
00125 struct ZTextureDef {
00126   ZTextureLevel *levels;
00127   ZB_lookupTextureFunc tex_minfilter_func;
00128   ZB_lookupTextureFunc tex_magfilter_func;
00129   ZB_lookupTextureFunc tex_minfilter_func_impl;
00130   ZB_lookupTextureFunc tex_magfilter_func_impl;
00131   ZB_texWrapFunc tex_wrap_u_func;
00132   ZB_texWrapFunc tex_wrap_v_func;
00133   int s_max, t_max;
00134   PIXEL border_color;
00135 };
00136 
00137 struct ZBuffer {
00138   int xsize,ysize;
00139   int linesize; /* line size, in bytes */
00140   int mode;
00141   
00142   ZPOINT *zbuf;
00143   PIXEL *pbuf;
00144   int frame_buffer_allocated;
00145   
00146   int nb_colors;
00147   unsigned char *dctable;
00148   int *ctable;
00149   ZTextureDef current_textures[MAX_TEXTURE_STAGES];
00150   int reference_alpha;
00151   int blend_r, blend_g, blend_b, blend_a;
00152   ZB_storePixelFunc store_pix_func;
00153 };
00154 
00155 struct ZBufferPoint {
00156   int x,y,z;     /* integer coordinates in the zbuffer */
00157   int s,t;       /* coordinates for the mapping */
00158   int r,g,b,a;     /* color indexes */
00159   
00160   PN_stdfloat sz,tz;   /* temporary coordinates for mapping */
00161 
00162   int sa, ta;   /* mapping coordinates for optional second texture stage */
00163   PN_stdfloat sza,tza; 
00164 
00165   int sb, tb;   /* mapping coordinates for optional third texture stage */
00166   PN_stdfloat szb,tzb; 
00167 };
00168 
00169 /* zbuffer.c */
00170 
00171 #ifdef DO_PSTATS
00172 extern int pixel_count_white_untextured;
00173 extern int pixel_count_flat_untextured;
00174 extern int pixel_count_smooth_untextured;
00175 extern int pixel_count_white_textured;
00176 extern int pixel_count_flat_textured;
00177 extern int pixel_count_smooth_textured;
00178 extern int pixel_count_white_perspective;
00179 extern int pixel_count_flat_perspective;
00180 extern int pixel_count_smooth_perspective;
00181 extern int pixel_count_smooth_multitex2;
00182 extern int pixel_count_smooth_multitex3;
00183 
00184 #define COUNT_PIXELS(pixel_count, p0, p1, p2) \
00185   (pixel_count) += abs((p0)->x * ((p1)->y - (p2)->y) + (p1)->x * ((p2)->y - (p0)->y) + (p2)->x * ((p0)->y - (p1)->y)) / 2
00186 
00187 #else
00188 
00189 #define COUNT_PIXELS(pixel_count, p0, p1, p2)
00190 
00191 #endif  // DO_PSTATS
00192 
00193 ZBuffer *ZB_open(int xsize,int ysize,int mode,
00194                  int nb_colors,
00195                  unsigned char *color_indexes,
00196                  unsigned int *color_table,
00197                  void *frame_buffer);
00198 
00199 
00200 void ZB_close(ZBuffer *zb);
00201 
00202 void ZB_resize(ZBuffer *zb,void *frame_buffer,int xsize,int ysize);
00203 void ZB_clear(ZBuffer *zb, int clear_z, ZPOINT z,
00204               int clear_color, unsigned int r, unsigned int g, unsigned int b, unsigned int a);
00205 void ZB_clear_viewport(ZBuffer * zb, int clear_z, ZPOINT z,
00206                        int clear_color, unsigned int r, unsigned int g, unsigned int b, unsigned int a,
00207                        int xmin, int ymin, int xsize, int ysize);
00208 
00209 PIXEL lookup_texture_nearest(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00210 PIXEL lookup_texture_bilinear(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00211 PIXEL lookup_texture_mipmap_nearest(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00212 PIXEL lookup_texture_mipmap_linear(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00213 PIXEL lookup_texture_mipmap_bilinear(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00214 PIXEL lookup_texture_mipmap_trilinear(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00215 
00216 PIXEL apply_wrap_general_minfilter(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00217 PIXEL apply_wrap_general_magfilter(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00218 
00219 PIXEL apply_wrap_border_color_minfilter(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00220 PIXEL apply_wrap_border_color_magfilter(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00221 
00222 PIXEL apply_wrap_clamp_minfilter(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00223 PIXEL apply_wrap_clamp_magfilter(ZTextureDef *texture_def, int s, int t, unsigned int level, unsigned int level_dx);
00224 
00225 int texcoord_clamp(int coord, int max_coord);
00226 int texcoord_repeat(int coord, int max_coord);
00227 int texcoord_mirror(int coord, int max_coord);
00228 int texcoord_mirror_once(int coord, int max_coord);
00229 
00230 /* linesize is in BYTES */
00231 void ZB_copyFrameBuffer(const ZBuffer *zb,void *buf,int linesize);
00232 void ZB_copyFrameBufferNoAlpha(const ZBuffer *zb,void *buf,int linesize);
00233 void ZB_zoomFrameBuffer(ZBuffer *dest, int dest_xmin, int dest_ymin, 
00234                         int dest_xsize, int dest_ysize,
00235                         const ZBuffer *source, int source_xmin, int source_ymin,
00236                         int source_xsize, int source_ysize);
00237 
00238 /* zdither.c */
00239 
00240 void ZB_initDither(ZBuffer *zb,int nb_colors,
00241                    unsigned char *color_indexes,int *color_table);
00242 void ZB_closeDither(ZBuffer *zb);
00243 void ZB_ditherFrameBuffer(ZBuffer *zb,unsigned char *dest,
00244                           int linesize);
00245 
00246 /* zline.c */
00247 
00248 void ZB_plot(ZBuffer *zb,ZBufferPoint *p);
00249 void ZB_line(ZBuffer *zb,ZBufferPoint *p1,ZBufferPoint *p2);
00250 void ZB_line_z(ZBuffer * zb, ZBufferPoint * p1, ZBufferPoint * p2);
00251 
00252 
00253 /* memory.c */
00254 void gl_free(void *p);
00255 void *gl_malloc(int size);
00256 void *gl_zalloc(int size);
00257 
00258 #endif /* _tgl_zbuffer_h_ */
 All Classes Functions Variables Enumerations