//Stuff to do with sprites #include #define CalcSprPos2(sprite,cx,cy) \ sprite->tpage = GetTPage(1,0,(((cx)>>1) & 8128),(cy) & 7936); \ sprite->u = ((cx) % 128); \ sprite->v = ((cy) % 256) void InitSpr(long address); void InitGsSprite (GsSPRITE* sprite); void CalcLetterPos(GsSPRITE* spr, char letter); // initialise sprite to dummy void InitGsSprite (GsSPRITE* sprite) { sprite->attribute = 1<<24; sprite->x = 0; sprite->y = 0; sprite->w = 16; sprite->h = 16; sprite->tpage = 0; sprite->u = 0; sprite->v = 0; sprite->cx = 320; sprite->cy = 511; sprite->r=sprite->g=sprite->b = 128; sprite->mx = 0; sprite->my = 0; sprite->scalex = ONE; sprite->scaley = ONE; sprite->rotate = 0; } void InitSpr(long address) { GsIMAGE temp; RECT rect; // +4 because we need to skip head of TIM file GsGetTimInfo( (u_long *)(address+4), &temp); rect.x = temp.px; rect.y = temp.py; rect.w = temp.pw; rect.h = temp.ph; LoadImage(&rect, temp.pixel); // if image needs a CLUT, load it up // (pmode: 8 or 9 ==> texture is 4-bit or 8-bit) if ( (temp.pmode>>3)&0x01) { rect.x = temp.cx; rect.y = temp.cy; rect.w = temp.cw; rect.h = temp.ch; LoadImage( &rect, temp.clut); } // wait for loading to finish DrawSync(0); } void CalcLetterPos(GsSPRITE* spr, char letter) { if (letter>47 && letter<58) { CalcSprPos2(spr, 640+((letter-48)<<4), 184); } else if (letter>96 && letter<123) { CalcSprPos2(spr, (384<<1) + (((letter-97) % 13)<<4), 100 + (((letter-97)/13)<<4)); } }