Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

traster.h File Reference

#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)


Define Documentation

#define TRASTER_DEFAULT_MAX_AFFINE_SIZE   (32)
 

Definition at line 39 of file traster.h.


Function Documentation

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 }

void GENESISCC TRaster_Setup int  MaxAffineSize,
geRDriver_THandle Dest,
geRDriver_THandle ZBuffer,
void(*  Callback)(TRaster_Lightmap *LM)
 

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 }


Generated on Tue Sep 30 12:38:19 2003 for GTestAndEngine by doxygen 1.3.2