#include "basetype.h"#include "rop.h"#include "swthandle.h"Go to the source code of this file.
Compounds | |
| struct | TRaster_Lightmap |
Defines | |
| #define | TRASTER_DEFAULT_MAX_AFFINE_SIZE (32) |
Functions | |
| void GENESISCC | TRaster_Setup (int MaxAffineSize, geRDriver_THandle *Dest, geRDriver_THandle *ZBuffer, void(*Callback)(TRaster_Lightmap *LM)) |
| void GENESISCC | TRaster_Rasterize (geROP ROP, geRDriver_THandle *Texture, int MipIndex, const DRV_TLVertex *pVertices) |
|
|
|
|
||||||||||||||||||||
|
Definition at line 200 of file TRaster.c. References A, AFLAT, geRDriver_THandle::BitPtr, Triangle_Edge::Dest, Triangle_Triangle::DestMap, DESTPIXEL_SHIFTER, Triangle_Edge::DestStep, TRaster_RopInfo::Flags, GE_FALSE, GE_ROP_END, geFloat, GENESISCC, Triangle_Triangle::Gradients, Triangle_Edge::Height, geRDriver_THandle::Height, int32, Triangle_Triangle::IsLightMapSetup, Triangle_Triangle::Left, LMAP, LSHADE, Triangle_Triangle::MipIndex, NULL, OneMinusA, Triangle_Triangle::Palette, geRDriver_THandle::PalHandle, Triangle_Triangle::Right, Triangle_Triangle::ROPFlags, Span_GetDrawFunction(), TRaster_RopInfo::SpanEdges, Triangle_Triangle::StrideShift, Triangle_Triangle::TextureBits, TEXTUREPIXEL, TMAP, TOPDOWN_OR_BOTTOMUP, TRaster_DrawSpan, TRaster_RopTable, Triangle, Triangle_EdgeCompute(), Triangle_GradientsCompute(), Triangle_PaletteEntry, uint32, Triangle_Triangle::UMask, Triangle_Triangle::VMask, geRDriver_THandle::Width, Triangle_Edge::X, Triangle_Edge::XStep, Triangle_Edge::Y, DRV_TLVertex::y, Triangle_Triangle::ZBufferAddressDelta, and Triangle_Triangle::ZMap. Referenced by SoftDrv_RenderGouraudPoly(), SoftDrv_RenderMiscTexturePoly(), and SoftDrv_RenderWorldPoly().
00205 {
00206 uint32 DestPtr;
00207 int32 DestWidth;
00208 int Top,Middle,Bottom;
00209 geFloat Y0 = pVertices[0].y;
00210 geFloat Y1 = pVertices[1].y;
00211 geFloat Y2 = pVertices[2].y;
00212
00213
00214
00215 Triangle_Edge TopToBottom, TopToSplit, SplitToBottom;
00216 int SplitRight; // set if triangle has two right-side edges (and one left-side edge)
00217
00218 #ifdef NOISE_FILTER
00219 Triangle.RandomIndex=0;
00220 #endif
00221
00222 assert( ROP >=0 ) ;
00223 assert( ROP <= GE_ROP_END );
00224
00225 Triangle.ROPFlags = TRaster_RopTable[ROP].Flags;
00226
00227 assert( TRaster_RopTable[ROP].SpanEdges != NULL );
00228 assert( ((Triangle.ROPFlags & AFLAT) && (pVertices[0].a>=0.0f && pVertices[0].a<=255.1f)) || !(Triangle.ROPFlags & AFLAT));
00229 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[0].r>=0.0f && pVertices[0].r<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00230 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[1].r>=0.0f && pVertices[1].r<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00231 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[2].r>=0.0f && pVertices[2].r<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00232 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[0].g>=0.0f && pVertices[0].g<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00233 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[1].g>=0.0f && pVertices[1].g<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00234 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[2].g>=0.0f && pVertices[2].g<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00235 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[0].b>=0.0f && pVertices[0].b<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00236 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[1].b>=0.0f && pVertices[1].b<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00237 assert( ((Triangle.ROPFlags & LSHADE) && (pVertices[2].b>=0.0f && pVertices[2].b<=255.1f)) || !(Triangle.ROPFlags & LSHADE));
00238
00239 if (Triangle.ROPFlags & TMAP)
00240 {
00241 int W,H;
00242 assert( Texture != NULL );
00243 W = Texture->Width >> MipIndex;
00244 H = Texture->Height >> MipIndex;
00245 if (Triangle_GradientsCompute(&(Triangle.Gradients),
00246 pVertices,(geFloat)(W),(geFloat)(H))==GE_FALSE)
00247 return; // poly has no area.
00248
00249 for(Triangle.StrideShift=1;((1<<Triangle.StrideShift) < W); Triangle.StrideShift++);
00250 assert( (1<<Triangle.StrideShift) == W );
00251 if (Triangle.ROPFlags & LMAP)
00252 {
00253 Triangle.IsLightMapSetup = GE_FALSE;
00254 }
00255
00256 Triangle.UMask = W-1;
00257 Triangle.VMask = H-1;
00258 assert( MipIndex >= 0 );
00259 assert( MipIndex < Texture->MipLevels );
00260 Triangle.MipIndex = MipIndex;
00261 Triangle.TextureBits = (TEXTUREPIXEL *)Texture->BitPtr[MipIndex];
00262 if (Texture->PalHandle)
00263 Triangle.Palette = (Triangle_PaletteEntry *)Texture->PalHandle->BitPtr[0];
00264 }
00265 else
00266 {
00267 if (Triangle_GradientsCompute(&(Triangle.Gradients),pVertices,1.0f,1.0f)==GE_FALSE)
00268 return; // poly has no area.
00269 }
00270 if (Triangle.ROPFlags & ZBUF)
00271 {
00272 assert(Triangle.ZMap != NULL );
00273 assert(Triangle.ZMap->Width == Triangle.DestMap->Width);
00274
00275 Triangle.ZBufferAddressDelta = ((int)(Triangle.ZMap->BitPtr[0])) - ((int)(Triangle.DestMap->BitPtr[0]));
00276 }
00277 TRaster_DrawSpan = Span_GetDrawFunction(ROP);
00278 A = (int32)(pVertices[0].a / (255.0f/16.0f) );
00279 OneMinusA = 16 - A;
00280
00281 // sort vertices in y
00282 if(Y0 < Y1)
00283 {
00284 if(Y2 < Y0)
00285 { Top = 2; Middle = 0; Bottom = 1; SplitRight = 1; }
00286 else
00287 {
00288 if(Y1 < Y2)
00289 { Top = 0; Middle = 1; Bottom = 2; SplitRight = 1; }
00290 else
00291 { Top = 0; Middle = 2; Bottom = 1; SplitRight = 0; }
00292 }
00293 }
00294 else
00295 {
00296 if(Y2 < Y1)
00297 { Top = 2; Middle = 1; Bottom = 0; SplitRight = 0; }
00298 else
00299 {
00300 if(Y0 < Y2)
00301 { Top = 1; Middle = 0; Bottom = 2; SplitRight = 0; }
00302 else
00303 { Top = 1; Middle = 2; Bottom = 0; SplitRight = 1; }
00304 }
00305 }
00306
00307
00308 Triangle_EdgeCompute(&TopToBottom, &(Triangle.Gradients),pVertices,Top, Bottom, SplitRight);
00309 Triangle_EdgeCompute(&TopToSplit, &(Triangle.Gradients),pVertices,Top, Middle, !SplitRight);
00310 Triangle_EdgeCompute(&SplitToBottom,&(Triangle.Gradients),pVertices,Middle,Bottom, !SplitRight);
00311
00312 // to maximize mmx optimization, there is no floating point from this point on
00313 if(SplitRight)
00314 {
00315 Triangle.Left = TopToBottom;
00316 Triangle.Right = TopToSplit;
00317 }
00318 else
00319 {
00320 Triangle.Left = TopToSplit;
00321 Triangle.Right = TopToBottom;
00322 }
00323
00324 DestPtr = ( uint32 )(Triangle.DestMap->BitPtr[0]);
00325 DestWidth = TOPDOWN_OR_BOTTOMUP(Triangle.DestMap->Width);
00326 Triangle.Left.Dest = DestPtr + ((Triangle.Left.X + Triangle.Left.Y * DestWidth)<<DESTPIXEL_SHIFTER);
00327 Triangle.Left.DestStep = (Triangle.Left.XStep + DestWidth)<<DESTPIXEL_SHIFTER;
00328
00329
00330 TRaster_RopTable[ROP].SpanEdges(TopToSplit.Height);
00331
00332 if(SplitRight)
00333 {
00334 Triangle.Right = SplitToBottom;
00335 }
00336 else
00337 {
00338 Triangle.Left = SplitToBottom;
00339 Triangle.Left.Dest = DestPtr + ((Triangle.Left.X + Triangle.Left.Y * DestWidth)<<DESTPIXEL_SHIFTER);
00340 Triangle.Left.DestStep = (Triangle.Left.XStep + DestWidth)<<DESTPIXEL_SHIFTER;
00341 }
00342
00343 TRaster_RopTable[ROP].SpanEdges(SplitToBottom.Height);
00344 }
|
|
||||||||||||||||||||
|
Definition at line 163 of file TRaster.c. References Dest, Triangle_Triangle::DestMap, geFloat, GENESISCC, Triangle_Triangle::LightMapSetup, Triangle_Triangle::MaxAffineSize, NULL, Triangle_Triangle::SmallDivideTable, TRASTER_SMALL_DIVIDE_TABLESIZE, Triangle, ZBuffer, and Triangle_Triangle::ZMap. Referenced by SoftDrv_Init().
00164 {
00165 int i;
00166
00167 assert( MaxAffineSize > 0);
00168 assert( MaxAffineSize < TRASTER_SMALL_DIVIDE_TABLESIZE);
00169 assert( Dest != NULL );
00170 assert( LightMapSetup != NULL );
00171
00172 Triangle.MaxAffineSize = (geFloat)MaxAffineSize;
00173
00174
00175 for (i=1; i<TRASTER_SMALL_DIVIDE_TABLESIZE; i++)
00176 {
00177 Triangle.SmallDivideTable[i] = 0x10000/i;
00178 }
00179 #ifdef NOISE_FILTER
00180 for (i=0; i<256; i++)
00181 {
00182 Triangle.RandomTable[i] = (rand() & 0x03)<<24;
00183 }
00184 #endif
00185
00186 Triangle.ZMap = ZBuffer;
00187 Triangle.DestMap = Dest;
00188 Triangle.LightMapSetup = LightMapSetup;
00189 }
|
1.3.2