00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef TRIANGLE_H
00028 #define TRIANGLE_H
00029
00030 #include "basetype.h"
00031 #include "swthandle.h"
00032
00033 #ifdef __cplusplus
00034 extern "C" {
00035 #endif
00036
00037
00038
00039
00040
00041 #define USE_FIXED_POINT
00042
00043
00044
00045 #define OOZ_NUMERATOR_SHIFTER (32)
00046 #define OOZ_NUMERATOR 0xFFFFFFFF
00047
00048
00049
00050
00051
00052 #define OZ_FXP_SHIFTER (20)
00053 #define OOZ_FXP_SHIFTER (26)
00054
00055 #define OOZ_DIV_PRECISION_BITS (18)
00056
00057 #define OOZ_MULTIPLY_PRECISION_BITS (12)
00058 #define OZ_MULTIPLY_PRECISION_BITS (4) // affects the accuracy to the nearest texel
00059
00060 #define OOZ_DIV_PREP_RSHIFT (OOZ_FXP_SHIFTER - OOZ_DIV_PRECISION_BITS)
00061
00062 #define RGB_FXP_SHIFTER (15)
00063 #define Z_FXP_SHIFTER (8)
00064
00065 #define Z_FXP_MULTIPLIER ((geFloat)( 1 << Z_FXP_SHIFTER ))
00066 #define OOZ_FXP_MULTIPLIER ((geFloat)( 1 << OOZ_FXP_SHIFTER ))
00067 #define OZ_FXP_MULTIPLIER ((geFloat)( 1 << OZ_FXP_SHIFTER ))
00068 #define RGB_FXP_MULTIPLIER ((geFloat)( 1 << RGB_FXP_SHIFTER ))
00069
00070 #define OOZ_MUL_PREP_RSHIFT (OOZ_NUMERATOR_SHIFTER - OOZ_FXP_SHIFTER + OOZ_DIV_PREP_RSHIFT - OOZ_MULTIPLY_PRECISION_BITS)
00071 #define OZ_MUL_PREP_RSHIFT (OZ_FXP_SHIFTER - OZ_MULTIPLY_PRECISION_BITS)
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 #if OOZ_DIV_PREP_RSHIFT > 0
00097 #define OOZ_DIV_PREP(OOZ) ((OOZ)>>OOZ_DIV_PREP_RSHIFT)
00098 #else
00099 #define OOZ_DIV_PREP(OOZ) ((OOZ)<<(-OOZ_DIV_PREP_RSHIFT))
00100 #endif
00101
00102 #if OZ_MUL_PREP_RSHIFT > 0
00103 #define OZ_MUL_PREP(OZ) ((OZ)>>OZ_MUL_PREP_RSHIFT)
00104 #else
00105 #define OZ_MUL_PREP(OZ) ((OZ)<<(-OZ_MUL_PREP_RSHIFT))
00106 #endif
00107
00108 #if OOZ_MUL_PREP_RSHIFT > 0
00109 #define OOZ_MUL_PREP(OZ) ((OZ)>>OOZ_MUL_PREP_RSHIFT)
00110 #else
00111 #define OOZ_MUL_PREP(OZ) ((OZ)<<(-OOZ_MUL_PREP_RSHIFT))
00112 #endif
00113
00114 #if (OOZ_MULTIPLY_PRECISION_BITS > 8)
00115 #define OOZ_MUL_Z(OOZ,Z) ( ((OOZ)>>(OOZ_MULTIPLY_PRECISION_BITS-8)) * (Z) )
00116 #else
00117 #define OOZ_MUL_Z(OOZ,Z) ( ((OOZ)<<(8-OOZ_MULTIPLY_PRECISION_BITS)) * (Z) )
00118 #endif
00119
00120 #if (OOZ_MULTIPLY_PRECISION_BITS > 8)
00121 #define GRADIENT_OOZ_MUL_Z(OOZ,Z) ( ((OOZ)>>(OOZ_FXPMULTIPLY_PRECISION_BITS-8)) * (Z) )
00122 #else
00123 #define GRADIENT_OOZ_MUL_Z(OOZ,Z) ( ((OOZ)<<(8-OOZ_MULTIPLY_PRECISION_BITS)) * (Z) )
00124 #endif
00125
00126 #if (OZ_MULTIPLY_SHIFTER <0) || (OOZ_MULTIPLY_SHIFTER<0)
00127 error.
00128 #endif
00129
00130 #define USE_FIXED_POINT
00131 #define DEST16BIT
00132
00133 #ifdef USE_FIXED_POINT
00134 #define FXFL int32
00135 #define FXFL_OOZ(XXX) ((int32)((XXX) * OOZ_FXP_MULTIPLIER))
00136 #define FXFL_OZ(XXX) ((int32)((XXX) * OZ_FXP_MULTIPLIER))
00137 #define FXFL_RGB(XXX) ((int32)((XXX) * RGB_FXP_MULTIPLIER))
00138 #define FXFL_Z(XXX) ((int32)((XXX) * Z_FXP_MULTIPLIER))
00139 #define OOZ_FXP_TO_16_16(XXX) ( (XXX)>>(OOZ_FXP_SHIFTER-16) )
00140 #define OZ_FXP_TO_16_16(XXX) ( (XXX)>>(OZ_FXP_SHIFTER-16) )
00141 #define Z_FXP_TO_INT(XXX) ( (XXX)>>Z_FXP_SHIFTER )
00142 #define RGB_FXP_TO_16_16(XXX) (XXX)
00143 #else
00144 error.
00145 #endif
00146
00147
00148 #define TEXTUREPIXEL unsigned char
00149 #define LIGHTMAPPIXEL unsigned char
00150 #ifdef DEST16BIT
00151 #define DESTPIXEL unsigned short
00152 #else
00153 #define DESTPIXEL unsigned char
00154 #endif
00155 #define ZMAPPIXEL unsigned short
00156 #define ALPHAMAPPIXEL unsigned short
00157
00158 #define DESTPIXEL_SHIFTER (sizeof(DESTPIXEL)/2)
00159 #ifdef USE_DIBS
00160 #define TOPDOWN_OR_BOTTOMUP(XXX) (-(XXX)) // + for TOPDOWN, - for BOTTOMUP.
00161 #else
00162 #define TOPDOWN_OR_BOTTOMUP(XXX) ((XXX)) // + for TOPDOWN, - for BOTTOMUP.
00163 #endif
00164
00165
00166 #define TMAP 0x1
00167 #define LSHADE 0x2
00168 #define LFLAT 0x4
00169 #define LMAP 0x8
00170 #define AFLAT 0x10
00171 #define AMAP 0x20
00172 #define ZSET 0x40
00173 #define ZTEST 0x80
00174 #define ZBUF 0x100 // any zbuffering
00175 #define SBUF 0x200
00176 #define D565 0x200 // not really a rop flag, but used in generating spans
00177
00178
00179
00180 #define TRASTER_SMALL_DIVIDE_TABLESIZE 129
00181
00182
00183
00184 typedef struct Triangle_Gradients
00185 {
00186 geFloat OneOverZ[3];
00187
00188 geFloat UOverZ[3];
00189 geFloat VOverZ[3];
00190 geFloat FdOneOverZdX;
00191 geFloat dOneOverZdY;
00192 geFloat FdUOverZdX;
00193 geFloat dUOverZdY;
00194 geFloat FdVOverZdX;
00195 geFloat dVOverZdY;
00196
00197 int SubSpanWidth;
00198 int SubSpanShift;
00199 int Affine;
00200
00201
00202 geFloat FdRdX;
00203 geFloat dRdY;
00204 geFloat FdGdX;
00205 geFloat dGdY;
00206 geFloat FdBdX;
00207 geFloat dBdY;
00208
00209 FXFL dOneOverZdX;
00210 FXFL dUOverZdX;
00211 FXFL dVOverZdX;
00212 FXFL dRdX;
00213 FXFL dGdX;
00214 FXFL dBdX;
00215
00216 geFloat FZScale;
00217 FXFL ZScale;
00218 } Triangle_Gradients;
00219
00220
00221 typedef struct Triangle_Edge
00222 {
00223 int32 X;
00224 int32 XStep;
00225 uint32 Dest;
00226 int32 DestStep;
00227 int32 Numerator, Denominator;
00228 int32 ErrorTerm;
00229
00230 FXFL OneOverZ;
00231 FXFL OneOverZStep;
00232 FXFL UOverZ;
00233 FXFL UOverZStep;
00234 FXFL VOverZ;
00235 FXFL VOverZStep;
00236 FXFL R;
00237 FXFL RStep;
00238 FXFL G;
00239 FXFL GStep;
00240 FXFL B;
00241 FXFL BStep;
00242
00243
00244 FXFL dOneOverZdX;
00245 FXFL dUOverZdX;
00246 FXFL dVOverZdX;
00247 FXFL dRdX;
00248 FXFL dGdX;
00249 FXFL dBdX;
00250
00251
00252 int Y;
00253 int Height;
00254
00255 } Triangle_Edge;
00256
00257
00258 #define Triangle_PaletteEntry uint32
00259
00260 typedef struct Triangle_Triangle
00261 {
00262 int ROPFlags;
00263 Triangle_Gradients Gradients;
00264 Triangle_Edge Left;
00265 Triangle_Edge Right;
00266
00267 DESTPIXEL *DestBits;
00268 TEXTUREPIXEL *TextureBits;
00269 Triangle_PaletteEntry *Palette;
00270 int MipIndex;
00271 int StrideShift;
00272
00273 int SpanWidth;
00274
00275 int UMask;
00276 int VMask;
00277
00278 LIGHTMAPPIXEL *LightMapBits;
00279
00280 int LightMapWidth;
00281 int LightMapStride;
00282 int LightMapHeight;
00283 int LightMapMaxU;
00284 int LightMapMaxV;
00285 int32 LightMapShiftU;
00286 int32 LightMapScaleU;
00287 int32 LightMapShiftV;
00288 int32 LightMapScaleV;
00289
00290 ZMAPPIXEL *ZMapBits;
00291 geRDriver_THandle *ZMap;
00292 geRDriver_THandle *DestMap;
00293 int ZBufferAddressDelta;
00294
00295 int SmallDivideTable[TRASTER_SMALL_DIVIDE_TABLESIZE];
00296
00297 geFloat MaxAffineSize;
00298
00299 geBoolean IsLightMapSetup;
00300 void (*LightMapSetup)();
00301
00302 #ifdef NOISE_FILTER
00303 int RandomIndex;
00304 int RandomTable[256];
00305 unsigned char RandomTableIndex=0;
00306 #endif
00307 } Triangle_Triangle;
00308
00309
00310
00311 int32 OneOverZ,UOverZ,VOverZ;
00312 int32 R,G,B;
00313
00314 int32 A,OneMinusA;
00315
00316 Triangle_Triangle Triangle;
00317
00318
00319
00320 geBoolean GENESISCC Triangle_GradientsCompute(
00321 Triangle_Gradients *G,
00322 const DRV_TLVertex *pVertices,
00323 geFloat TextureWidth,
00324 geFloat TextureHeight);
00325
00326
00327
00328
00329 void GENESISCC Triangle_EdgeCompute(
00330 Triangle_Edge *E,
00331 const Triangle_Gradients *Gradients,
00332 const DRV_TLVertex *pVertices,
00333 int Top,
00334 int Bottom,
00335 int IsLeftEdge);
00336
00337
00338 #ifdef __cplusplus
00339 }
00340 #endif
00341
00342
00343
00344 #endif