diff --git a/source/gfx/sprbank.cpp b/source/gfx/sprbank.cpp index 5f1216001..817c8feef 100644 --- a/source/gfx/sprbank.cpp +++ b/source/gfx/sprbank.cpp @@ -32,6 +32,10 @@ #include "gfx\prim.h" #endif +#ifndef __MATHTABLE_HEADER__ +#include "utils\mathtab.h" +#endif + /* Std Lib ------- */ @@ -297,6 +301,78 @@ void SpriteBank::prepareFT4Scaled(POLY_FT4 *_ft4,sFrameHdr *_fh,int _x,int _y,bo } +/*---------------------------------------------------------------------- + Function: + Purpose: NB: Still needs to be aspect corrected.. (PKG) + Params: + Returns: + ---------------------------------------------------------------------- */ +void SpriteBank::prepareFT4RotatedScaled(POLY_FT4 *_ft4,sFrameHdr *_fh,int _xCentre,int _yCentre,int _xScale,int _yScale,int _rot) +{ + int halfW,halfH; + int ca,sa; + int cw,ch,sw,sh; + int width,height; + int aspect; + + halfW=(_fh->W*_xScale)>>(12+1); + halfH=(_fh->H*_yScale)>>(12+1); + ca=mcos(_rot); + sa=msin(_rot); + cw=(ca*halfW)>>12; + ch=(ca*halfH)>>12; + sw=(sa*halfW)>>12; + sh=(sa*halfH)>>12; + +// aspect=(512<<12)/384;//((_fh->H<<12)/_fh->W)/2; +// ch=(ch*aspect)>>12; +// sh=(sh*aspect)>>12; + + _ft4->x0=_xCentre-cw+sh; _ft4->y0=_yCentre-sw-ch; + _ft4->x1=_xCentre+cw+sh; _ft4->y1=_yCentre+sw-ch; + _ft4->x2=_xCentre-cw-sh; _ft4->y2=_yCentre-sw+ch; + _ft4->x3=_xCentre+cw-sh; _ft4->y3=_yCentre+sw+ch; + + setShadeTexPolyFT4(_ft4); + setShadeTex(_ft4,0); + setRGB0(_ft4,128,128,128); +// setUVTp(_fh,_ft4,false,false); +//////////////////////////////// + int U=_fh->U; + int V=_fh->V; + int W=_fh->W; + int H=_fh->H; + + if (!_fh->Rotated) + { + _ft4->u0=U; + _ft4->u1=U+W; + _ft4->u2=U; + _ft4->u3=U+W; + + _ft4->v0=V; + _ft4->v1=V; + _ft4->v2=V+H-1; + _ft4->v3=V+H-1; + } + else + { + _ft4->v0=V+W-1; + _ft4->v2=V+W-1; + _ft4->v1=V-1; + _ft4->v3=V-1; + + _ft4->u0=U; + _ft4->u1=U; + _ft4->u2=U+H; + _ft4->u3=U+H; + } + _ft4->tpage=_fh->TPage; + _ft4->clut=_fh->Clut; +//////////////////////////////// +} + + /*---------------------------------------------------------------------- Function: Purpose: @@ -375,7 +451,3 @@ void SpriteBank::setUVTp(sFrameHdr *_fh,POLY_FT4 *_ft4,int _xFlip,int _yFlip) _ft4->tpage=_fh->TPage; _ft4->clut=_fh->Clut; } - - - - diff --git a/source/gfx/sprbank.h b/source/gfx/sprbank.h index 0e790c131..906d87c36 100644 --- a/source/gfx/sprbank.h +++ b/source/gfx/sprbank.h @@ -86,7 +86,6 @@ inline POLY_FT4 *printFT4(int _frame,int _x,int _y,int _xFlip,int _yFlip,int _ot inline POLY_FT4 *printFT4(sFrameHdr *_fh,int _x,int _y,int _xFlip,int _yFlip,int _ot) { POLY_FT4 *ft4=GetPrimFT4(); - prepareFT4(ft4,_fh,_x,_y,_xFlip,_yFlip); AddPrimToList(ft4,_ot); return(ft4); @@ -95,17 +94,30 @@ inline POLY_FT4 *printFT4Scaled(int _frame,int _x,int _y,int _xFlip,int _yFlip,i inline POLY_FT4 *printFT4Scaled(sFrameHdr *_fh,int _x,int _y,int _xFlip,int _yFlip,int _ot, long _z) { POLY_FT4 *ft4=GetPrimFT4(); - prepareFT4Scaled(ft4,_fh,_x,_y,_xFlip,_yFlip,_z ); AddPrimToList(ft4,_ot); return(ft4); } - + +inline POLY_FT4 *printRotatedScaledSprite(sFrameHdr *_fh,int _xCentre,int _yCentre,int _xScale,int _yScale,int _rot,int _ot) +{ + ASSERT(_rot>=0); + ASSERT(_rot<=4095); + POLY_FT4 *ft4=GetPrimFT4(); + prepareFT4RotatedScaled(ft4,_fh,_xCentre,_yCentre,_xScale,_yScale,_rot); + AddPrimToList(ft4,_ot); + return(ft4); +} + + // Hmm.. why did these used to be private? void prepareFT4(POLY_FT4 *_ft4,sFrameHdr *_fh,int _x,int _y,bool _xFlip,bool _yFlip); void prepareFT4Scaled(POLY_FT4 *_ft4,sFrameHdr *_fh,int _x,int _y,bool _xFlip,bool _yFlip,long _z); + void prepareFT4RotatedScaled(POLY_FT4 *_ft4,sFrameHdr *_fh,int _xCentre,int _yCentre,int _xScale,int _yScale,int _rot); void setUVTp(sFrameHdr *_fh,POLY_FT4 *_ft4,int _xFlip,int _yYFlip); +// void printRotatedScaledSprite(sFrameHdr *_fh,int _xCentre,int _yCentre,int _xScale,int _yScale,int _rot,int _ot); + private: class SpriteBankInstance *m_SpriteBankInstance;