diff --git a/MakeUSA.bat b/MakeUSA.bat index 1ea1466e5..d7acc8e1c 100644 --- a/MakeUSA.bat +++ b/MakeUSA.bat @@ -1,4 +1,7 @@ del out\*.* /s /y /e >nul @tools\make -r -f makefile.gfx VERSION=DEBUG TERRITORY=USA USER_NAME=CDBUILD @tools\make -r -f makefile.gaz VERSION=DEBUG TERRITORY=USA USER_NAME=CDBUILD - +ren cdbuild CdBuild.Debug +@tools\make -r -f makefile.gfx VERSION=FINAL TERRITORY=USA USER_NAME=CDBUILD +@tools\make -r -f makefile.gaz VERSION=FINAL TERRITORY=USA USER_NAME=CDBUILD +ren cdbuild CdBuild.Final diff --git a/source/gfx/actor.cpp b/source/gfx/actor.cpp index 1beb2c0ff..d0dea2a2f 100644 --- a/source/gfx/actor.cpp +++ b/source/gfx/actor.cpp @@ -11,6 +11,7 @@ #include "gfx\actor.h" #include "gfx\otpos.h" #include "gfx\animtex.h" +#include "game\game.h" #include @@ -521,10 +522,9 @@ void CActorGfx::setActor(sActorPool *ThisActor) } /*****************************************************************************/ -POLY_FT4 *CActorGfx::Render(DVECTOR &Pos,int Anim,int Frame,bool XFlip,bool YFlip) +sPoolNode *CActorGfx::CacheFrame(int Anim,int Frame) { sPoolNode *ThisNode,*FindNode; -POLY_FT4 *Ft4; // Calc Frame Ptrs sSpriteAnimBank *SpriteBank=PoolEntry->ActorGfx; @@ -599,111 +599,7 @@ sSpriteAnim *ThisAnim=SpriteBank->AnimList+Anim; CPakTex::Add(CurrentFrameGfx->PAKSpr,&ThisNode->DstRect); } - - Ft4=GetPrimFT4(); - SetUpFT4(Ft4,ThisNode,Pos.vx,Pos.vy,XFlip,YFlip); - Ft4->tpage=ThisNode->TPage; - Ft4->clut=PoolEntry->ActorGfx->Clut; - setShadeTex(Ft4,1); - setRGB0(Ft4,127,127,127); - addPrim(OtPtr+OtPos,Ft4); -// Set BBox -// Sizes now depend on aspect corrected sizes, so get sizes back from poly -int BBoxW=Ft4->x1-Ft4->x0; -int BBoxH=Ft4->y2-Ft4->y0; -int HalfW=BBoxW>>1; - - BBox.XMin=-HalfW+BBOX_ADJ; - BBox.XMax=+HalfW-BBOX_ADJ; - BBox.YMin=-BBoxH+BBOX_ADJ; - BBox.YMax=0-BBOX_ADJ; - - return(Ft4); -} - -/*****************************************************************************/ -POLY_FT4 *CActorGfx::RotateScale(POLY_FT4 *Ft4,DVECTOR &Pos,int Angle,int XScale,int YScale) -{ -int dX,dY; -int CosAngle,SinAngle; -int CosX,CosY,SinX,SinY; -sBBox SBox,CBox; -int W=Ft4->x1-Ft4->x0; -int H=Ft4->y2-Ft4->y0; - - Angle&=4095; - -// dX=(CurrentFrameGfx->W*XScale)>>(12+1); // +1 for half -// dY=(CurrentFrameGfx->H*YScale)>>(12); - - dX=(W*XScale)>>(12+1); // +1 for half - dY=(H*YScale)>>(12); - - CosAngle=mcos(Angle); - SinAngle=msin(Angle); - - SBox.XMin=(SinAngle*-dX)>>12; - SBox.XMax=(SinAngle*+dX)>>12; - SBox.YMin=(SinAngle*-dY)>>12; - SBox.YMax=0; - - CBox.XMin=(CosAngle*-dX)>>12; - CBox.XMax=(CosAngle*+dX)>>12; - CBox.YMin=(CosAngle*-dY)>>12; - CBox.YMax=0; - -int x0,x1,x2,x3; -int y0,y1,y2,y3; -int XMin,XMax; -int YMin,YMax; - - x0=CBox.XMin-SBox.YMin; y0=SBox.XMin+CBox.YMin; - x1=CBox.XMax-SBox.YMin; y1=SBox.XMax+CBox.YMin; - x2=CBox.XMin+SBox.YMax; y2=SBox.XMin-CBox.YMax; - x3=CBox.XMax+SBox.YMax; y3=SBox.XMax-CBox.YMax; - - XMin=x0; - if (XMin>x1) XMin=x1; - if (XMin>x2) XMin=x2; - if (XMin>x3) XMin=x3; - XMax=x0; - if (XMaxy1) YMin=y1; - if (YMin>y2) YMin=y2; - if (YMin>y3) YMin=y3; - YMax=y0; - if (YMaxx0=Pos.vx+x0; Ft4->y0=Pos.vy+y0; - Ft4->x1=Pos.vx+x1; Ft4->y1=Pos.vy+y1; - Ft4->x2=Pos.vx+x2; Ft4->y2=Pos.vy+y2; - Ft4->x3=Pos.vx+x3; Ft4->y3=Pos.vy+y3; - - return(Ft4); -} - -/*****************************************************************************/ -void CActorGfx::getFrameOffsets(int _anim,int _frame,int *_x,int *_y) -{ - sSpriteAnimBank *SpriteBank; - sSpriteAnim *ThisAnim; - sSpriteFrame *pFrame; - - SpriteBank=PoolEntry->ActorGfx; - ThisAnim=SpriteBank->AnimList+_anim; - pFrame=&ThisAnim->Anim[_frame]; - *_x=pFrame->XOfs; - *_y=pFrame->YOfs; + return(ThisNode); } /*****************************************************************************/ @@ -714,6 +610,7 @@ u8 H=CurrentFrameGfx->H-1; u8 U=Node->U; u8 V=Node->V; int AspectX0,AspectX1; + if (XFlip) { X-=CurrentFrame->XOfs; @@ -765,6 +662,132 @@ int AspectX0,AspectX1; #endif } +/*****************************************************************************/ + +POLY_FT4 *CActorGfx::Render(DVECTOR &Pos,int Anim,int Frame,bool XFlip,bool YFlip) +{ +sPoolNode *ThisNode=CacheFrame(Anim,Frame); +POLY_FT4 *Ft4=GetPrimFT4(); + + SetUpFT4(Ft4,ThisNode,Pos.vx,Pos.vy,XFlip,YFlip); + Ft4->tpage=ThisNode->TPage; + Ft4->clut=PoolEntry->ActorGfx->Clut; + setShadeTex(Ft4,1); + setRGB0(Ft4,127,127,127); + addPrim(OtPtr+OtPos,Ft4); + +// Set BBox +// Sizes now depend on aspect corrected sizes, so get sizes back from poly +int BBoxW=Ft4->x1-Ft4->x0; +int BBoxH=Ft4->y2-Ft4->y0; +int HalfW=BBoxW>>1; + + BBox.XMin=-HalfW+BBOX_ADJ; + BBox.XMax=+HalfW-BBOX_ADJ; + BBox.YMin=-BBoxH+BBOX_ADJ; + BBox.YMax=0-BBOX_ADJ; + + return(Ft4); +} + +/*****************************************************************************/ +static const VECTOR ZeroPos={0,0,0}; +static const int ScaleXAspect=2050; // Odd hard coded number, sorry + +POLY_FT4 *CActorGfx::RotateScale(POLY_FT4 *Ft4,DVECTOR &Pos,int Angle,int XScale,int YScale) +{ +MATRIX Mtx; +VECTOR Scale; +int ScaleInc=Angle&1023; +int Quad=0; + XScale+=ScaleXAspect; + + Angle&=4095; + + Quad=Angle>>10; + switch(Quad) + { + case 0: + ScaleInc=+ScaleInc; + break; + case 1: + ScaleInc=1023-ScaleInc; + break; + case 2: + ScaleInc=+ScaleInc; + break; + case 3: + ScaleInc=1023-ScaleInc; + break; + } + + Scale.vx=XScale-(ScaleInc*2); + Scale.vy=YScale+(ScaleInc*2); + Scale.vz=ONE; + SetIdentNoTrans(&Mtx); + ScaleMatrix(&Mtx,&Scale); + RotMatrixZ(Angle,&Mtx); + gte_SetRotMatrix(&Mtx); + CMX_SetTransMtxXY(&ZeroPos); + + +SVECTOR I,O; +s32 Tmp; + I.vz=0; + I.vy=-CurrentFrameGfx->H; + I.vx=-CurrentFrameGfx->W0; RotTransSV(&I,&O,&Tmp); Ft4->x0=O.vx; Ft4->y0=O.vy; + I.vx=+CurrentFrameGfx->W1; RotTransSV(&I,&O,&Tmp); Ft4->x1=O.vx; Ft4->y1=O.vy; + I.vy=0; + I.vx=-CurrentFrameGfx->W0; RotTransSV(&I,&O,&Tmp); Ft4->x2=O.vx; Ft4->y2=O.vy; + I.vx=+CurrentFrameGfx->W1; RotTransSV(&I,&O,&Tmp); Ft4->x3=O.vx; Ft4->y3=O.vy; + +// Adjust BBox +int XMin,XMax; +int YMin,YMax; + + XMin=Ft4->x0; + if (XMin>Ft4->x1) XMin=Ft4->x1; + if (XMin>Ft4->x2) XMin=Ft4->x2; + if (XMin>Ft4->x3) XMin=Ft4->x3; + XMax=Ft4->x0; + if (XMaxx1) XMax=Ft4->x1; + if (XMaxx2) XMax=Ft4->x2; + if (XMaxx3) XMax=Ft4->x3; + YMin=Ft4->y0; + if (YMin>Ft4->y1) YMin=Ft4->y1; + if (YMin>Ft4->y2) YMin=Ft4->y2; + if (YMin>Ft4->y3) YMin=Ft4->y3; + YMax=Ft4->y0; + if (YMaxy1) YMax=Ft4->y1; + if (YMaxy2) YMax=Ft4->y2; + if (YMaxy3) YMax=Ft4->y3; + + BBox.XMin=XMin+BBOX_ADJ; + BBox.XMax=XMax-BBOX_ADJ; + BBox.YMin=YMin+BBOX_ADJ; + BBox.YMax=YMax-BBOX_ADJ; + + Ft4->x0+=Pos.vx; Ft4->y0+=Pos.vy; + Ft4->x1+=Pos.vx; Ft4->y1+=Pos.vy; + Ft4->x2+=Pos.vx; Ft4->y2+=Pos.vy; + Ft4->x3+=Pos.vx; Ft4->y3+=Pos.vy; + + return(Ft4); +} + +/*****************************************************************************/ +void CActorGfx::getFrameOffsets(int _anim,int _frame,int *_x,int *_y) +{ + sSpriteAnimBank *SpriteBank; + sSpriteAnim *ThisAnim; + sSpriteFrame *pFrame; + + SpriteBank=PoolEntry->ActorGfx; + ThisAnim=SpriteBank->AnimList+_anim; + pFrame=&ThisAnim->Anim[_frame]; + *_x=pFrame->XOfs; + *_y=pFrame->YOfs; +} /*****************************************************************************/ /*****************************************************************************/ @@ -865,6 +888,7 @@ VECTOR RenderPos; MATRIX Mtx; u32 const *XYList=(u32*)SCRATCH_RAM; + // If has scale && angle then need to use PSX scale matrix, otherwise, force values if (Angle) { diff --git a/source/gfx/actor.h b/source/gfx/actor.h index 8763e58e3..be76de8f7 100644 --- a/source/gfx/actor.h +++ b/source/gfx/actor.h @@ -148,6 +148,7 @@ virtual ~CActorGfx(); protected: + sPoolNode *CacheFrame(int Anim,int Frame); void SetUpFT4(POLY_FT4 *Ft4,sPoolNode *Node,int X,int Y,bool XFlip,bool YFlip); sActorPool *PoolEntry;