diff --git a/source/gfx/actor.cpp b/source/gfx/actor.cpp index 4f44a5e80..31e564d6b 100644 --- a/source/gfx/actor.cpp +++ b/source/gfx/actor.cpp @@ -14,6 +14,7 @@ /*****************************************************************************/ CActorGfx *CActorPool::ActorList[CActorPool::MAX_ACTORS]; +u8 CActorPool::UnpackBuffer[CActorPool::MAX_ACTOR_SIZE]; /*****************************************************************************/ /*****************************************************************************/ @@ -77,26 +78,45 @@ CActorGfx::~CActorGfx() MemFree(SpriteBank); } +/*****************************************************************************/ +sSpriteFrame *CActorGfx::GetFrame(int Anim,int Frame) +{ +sSpriteAnim *ThisAnim=SpriteBank->AnimList+Anim; +u16 ThisFrame=ThisAnim->Anim[Frame]; + + return(SpriteBank->FrameList+ThisFrame); +} + +/*****************************************************************************/ +int CActorGfx::getFrameWidth(int Anim,int Frame) +{ +sSpriteFrame *ThisFrame=GetFrame(Anim,Frame); + return(ThisFrame->W); +} + +/*****************************************************************************/ +int CActorGfx::getFrameHeight(int Anim,int Frame) +{ +sSpriteFrame *ThisFrame=GetFrame(Anim,Frame); + return(ThisFrame->H); +} + /*****************************************************************************/ POLY_FT4 *CActorGfx::Render(DVECTOR &Pos,int Anim,int Frame,bool XFlip,bool YFlip,bool Shadow) { -sSpriteAnim &ThisAnim=SpriteBank->AnimList[Anim]; -u16 FrameNo=ThisAnim.Anim[Frame]; -sSpriteFrame &ThisFrame=SpriteBank->FrameList[FrameNo]; -u8 Buffer[64*64]; +sSpriteFrame *FrameGfx=GetFrame(Anim,Frame); - PAK_doUnpak(Buffer,ThisFrame.PAKSpr); - + PAK_doUnpak(CActorPool::UnpackBuffer,FrameGfx->PAKSpr); // Gfx RECT Rect; Rect.x=TexX; Rect.y=TexY; - Rect.w=ThisFrame.W/4; - Rect.h=ThisFrame.H; - LoadImage( &Rect, (u32*)Buffer); + Rect.w=FrameGfx->W/4; + Rect.h=FrameGfx->H; + LoadImage( &Rect, (u32*)CActorPool::UnpackBuffer); POLY_FT4 *Ft4=GetPrimFT4(); - SetUpFT4(Ft4,&ThisFrame,Pos.vx,Pos.vy,XFlip,YFlip); + SetUpFT4(Ft4,FrameGfx,Pos.vx,Pos.vy,XFlip,YFlip); setRGB0(Ft4,128,128,128); setTPage(Ft4,0,0,TexX,TexY); setClut(Ft4, ClutX, ClutY); @@ -167,24 +187,6 @@ int H=ThisFrame->H; void CActorGfx::Dump() { } -/*****************************************************************************/ -int CActorGfx::getFrameWidth(int Anim,int Frame) -{ -sSpriteAnim &ThisAnim=SpriteBank->AnimList[Anim]; -u16 FrameNo=ThisAnim.Anim[Frame]; -sSpriteFrame &ThisFrame=SpriteBank->FrameList[FrameNo]; - return(ThisFrame.W); -} - -/*****************************************************************************/ -int CActorGfx::getFrameHeight(int Anim,int Frame) -{ -sSpriteAnim &ThisAnim=SpriteBank->AnimList[Anim]; -u16 FrameNo=ThisAnim.Anim[Frame]; -sSpriteFrame &ThisFrame=SpriteBank->FrameList[FrameNo]; - return(ThisFrame.H); -} - /*****************************************************************************/ /*****************************************************************************/ @@ -220,11 +222,13 @@ int CActorPool::FindFreeIdx() /*****************************************************************************/ /*** Load ********************************************************************/ /*****************************************************************************/ +int ActorNo=0; CActorGfx *CActorPool::GetActor(FileEquate Filename) { CActorGfx *NewActor; int Idx; + Filename=(FileEquate)(ACTORS_SPONGEBOB_SBK+ActorNo); // Already Loaded? Idx=FindIdx(Filename); if (Idx!=-1) return(ActorList[Idx]); @@ -254,4 +258,3 @@ int Idx; ActorList[Idx]=0; delete ThisActor; } - diff --git a/source/gfx/actor.h b/source/gfx/actor.h index 0fd9a03e4..5cf0b4a2e 100644 --- a/source/gfx/actor.h +++ b/source/gfx/actor.h @@ -30,6 +30,7 @@ virtual ~CActorGfx(); FileEquate GetFilename() {return(Filename);} private: void SetUpFT4(POLY_FT4 *Ft4,sSpriteFrame *ThisFrame,int X,int Y,bool XFlip,bool YFlip); + sSpriteFrame *GetFrame(int Anim,int Frame); FileEquate Filename; sSpriteAnimBank *SpriteBank; @@ -45,6 +46,7 @@ public: enum { MAX_ACTORS=8, + MAX_ACTOR_SIZE=128*128, }; static void Init(); @@ -53,6 +55,8 @@ static void AddActor(FileEquate Filename) {GetActor(Filename);} static CActorGfx *GetActor(FileEquate Filename); static void DumpActor(FileEquate Filename); +static u8 UnpackBuffer[MAX_ACTOR_SIZE]; + private: static int FindIdx(FileEquate Filename); static int FindFreeIdx(); diff --git a/tools/Data/bin/MkActor.exe b/tools/Data/bin/MkActor.exe index 9644d6ba7..85c0941b6 100644 Binary files a/tools/Data/bin/MkActor.exe and b/tools/Data/bin/MkActor.exe differ diff --git a/tools/Data/include/dstructs.h b/tools/Data/include/dstructs.h index 88c265406..7bd681234 100644 --- a/tools/Data/include/dstructs.h +++ b/tools/Data/include/dstructs.h @@ -108,18 +108,6 @@ struct sQuad //*** Game Types and Headers ************************************************ //*************************************************************************** // Maps -/* -enum TILE3D_FLAGS -{ - TILE3D_FLAGS_F=0, - TILE3D_FLAGS_U, - TILE3D_FLAGS_D, - TILE3D_FLAGS_L, - TILE3D_FLAGS_R, -// TILE3D_FLAGS_B, // Should never have back facing polys - TILE3D_FLAGS_MAX -}; -*/ typedef u16 sTileMapElem; // Tile or Tri Start struct sTile @@ -203,7 +191,8 @@ struct sSpriteFrame struct sSpriteAnim { u16 FrameCount; // 2 - u16 *Anim; // 2 + u16 Pad; + u16 *Anim; // 4 }; struct sSpriteAnimBank