diff --git a/source/enemy/npc.cpp b/source/enemy/npc.cpp index 2476fd234..49b317ef9 100644 --- a/source/enemy/npc.cpp +++ b/source/enemy/npc.cpp @@ -221,7 +221,7 @@ void CNpcEnemy::CacheActor(int Type) { int m_type = mapEditConvertTable[Type - NPC_ENEMY_MAPEDIT_OFFSET]; - CActorPool::GetActor(m_data[m_type].skelType); + CActorPool::AddActor(m_data[m_type].skelType); } diff --git a/source/gfx/actor.cpp b/source/gfx/actor.cpp index 63938525d..0f13c66f4 100644 --- a/source/gfx/actor.cpp +++ b/source/gfx/actor.cpp @@ -12,6 +12,10 @@ #include +/*****************************************************************************/ +int ShadowXOfs=32; +int ShadowYOfs=32; + /*****************************************************************************/ CActorPool::ACTOR_TYPE CActorPool::actorType[38] = @@ -57,69 +61,261 @@ CActorPool::ACTOR_TYPE CActorPool::actorType[38] = }; /*****************************************************************************/ -CActorGfx *CActorPool::ActorList[CActorPool::MAX_ACTORS]; -u8 CActorPool::UnpackBuffer[CActorPool::MAX_ACTOR_SIZE]; +sActorPool CActorPool::ActorPool[MAX_ACTORS]; + +CSlotCache CActorGfx::SlotCache; +u8 CActorGfx::UnpackBuffer[CActorPool::MAX_ACTOR_SIZE]; /*****************************************************************************/ +/*** Slot Cache **************************************************************/ /*****************************************************************************/ -/*****************************************************************************/ -void CActorGfx::Init(FileEquate _Filename) +void CSlotCache::Init() { - CActorPool::GetActor(Filename); + for (int Y=0; YDYN_SLOTW) return(false); + if (SY+SH>DYN_SLOTH) return(false); + if ((SX&3)==3 && SW>1) return(false); + + for (H=0; HAnimList=(sSpriteAnim*) MakePtr(SpriteBank,(int)SpriteBank->AnimList); - SpriteBank->FrameList=(sSpriteFrame*) MakePtr(SpriteBank,(int)SpriteBank->FrameList); - SpriteBank->Palette=(u8*) MakePtr(SpriteBank,(int)SpriteBank->Palette); + Spr->AnimList=(sSpriteAnim*) MakePtr(Spr,(int)Spr->AnimList); + Spr->FrameList=(sSpriteFrame*) MakePtr(Spr,(int)Spr->FrameList); + Spr->Palette=(u8*) MakePtr(Spr,(int)Spr->Palette); // FixUp AnimList - DAVE_DBGMSG("Anims %i\n",SpriteBank->AnimCount); - for (i=0; iAnimCount; i++) + DAVE_DBGMSG("Anims %i\n",Spr->AnimCount); + for (i=0; iAnimCount; i++) { - sSpriteAnim *ThisAnim=&SpriteBank->AnimList[i]; - ThisAnim->Anim=(u16*) MakePtr(SpriteBank,(int)ThisAnim->Anim); + sSpriteAnim *ThisAnim=&Spr->AnimList[i]; + ThisAnim->Anim=(u16*) MakePtr(Spr,(int)ThisAnim->Anim); } // FixUp FrameList - DAVE_DBGMSG("Anims %i\n",SpriteBank->FrameCount); - for (i=0; iFrameCount; i++) + DAVE_DBGMSG("Anims %i\n",Spr->FrameCount); + for (i=0; iFrameCount; i++) { - sSpriteFrame *ThisFrame=&SpriteBank->FrameList[i]; - ThisFrame->PAKSpr=(u8*) MakePtr(SpriteBank,(int)ThisFrame->PAKSpr); + sSpriteFrame *ThisFrame=&Spr->FrameList[i]; + ThisFrame->PAKSpr=(u8*) MakePtr(Spr,(int)ThisFrame->PAKSpr); } - TexX=DefTPX+(TPInc*ActorNo); - TexY=DefTPY+4; - ClutX=TexX; - ClutY=DefTPY; +// Store it +int Idx=FindFreeActor(); + ASSERT(Idx!=-1); -// upload clut -RECT Rect; - Rect.x=ClutX; - Rect.y=ClutY; - Rect.w=SpriteBank->ColorCount; - Rect.h=1; - LoadImage( &Rect, (u32*)SpriteBank->Palette); +sActorPool &ThisActor=ActorPool[Idx]; + + ThisActor.Filename=Filename; + ThisActor.SpriteBank=Spr; + ThisActor.RefCount=1; + ThisActor.Clut=LoadPalette(ThisActor,Idx); + + return(Idx); +} + +/*****************************************************************************/ +#define DYN_PALW 64 +#define DYN_PALH 1 +#define DYN_PALX DYN_PALW*(8+4) +#define DYN_PALY 511 + +u16 CActorPool::LoadPalette(sActorPool &ThisActor,int Idx) +{ +RECT R; + + R.x=DYN_PALX+(Idx*DYN_PALW); + R.y=DYN_PALY; + R.w=DYN_PALW; + R.h=DYN_PALH; + LoadImage( &R, (u32*)ThisActor.SpriteBank->Palette); + +int Clut=getClut(R.x,R.y); + return(Clut); +} + +/*****************************************************************************/ +void CActorPool::AddActor(FileEquate Filename) +{ +sActorPool *Actor; +int Idx=FindActorInPool(Filename); + + if (Idx!=-1) return; +// Load it + LoadActor(Filename); +} + +/*****************************************************************************/ +CActorGfx *CActorPool::GetActor(FileEquate Filename) +{ +CActorGfx *Actor; +int Idx; + +// Find Actor in Pool + Idx=FindActorInPool(Filename); + if (Idx==-1) ASSERT(!"Actor Not Loaded"); + +sActorPool &ThisActor=ActorPool[Idx]; + Actor=new ("CActorGfx") CActorGfx; + Actor->SetData(Filename,ThisActor.SpriteBank,ThisActor.Clut); + ThisActor.RefCount++; + return(Actor); +} + +/*****************************************************************************/ +/*** Dump ********************************************************************/ +/*****************************************************************************/ +// Dumps all apart from spongeybob +void CActorPool::DumpActors() +{ + for (int i=0; iMaxW,_SpriteBank->MaxH,TexX,TexY,U,V); + ASSERT(SlotStatus); + } + else + { + TexX=512; + TexY=256; + U=0; + V=0; + } + TPage=getTPage(0,0,TexX,TexY); +} + +/*****************************************************************************/ +void CActorGfx::ResetCache() +{ +RECT R; + SlotCache.Init(); + R.x=512; + R.y=256; + R.w=512; + R.h=250; + ClearImage(&R,0,255,0); } /*****************************************************************************/ @@ -132,25 +328,26 @@ u16 ThisFrame=ThisAnim->Anim[Frame]; } /*****************************************************************************/ + POLY_FT4 *CActorGfx::Render(DVECTOR &Pos,int Anim,int Frame,bool XFlip,bool YFlip,bool Shadow) { sSpriteFrame *FrameGfx=GetFrame(Anim,Frame); - - PAK_doUnpak(CActorPool::UnpackBuffer,FrameGfx->PAKSpr); + + PAK_doUnpak(UnpackBuffer,FrameGfx->PAKSpr); // Gfx + RECT Rect; Rect.x=TexX; Rect.y=TexY; Rect.w=FrameGfx->W/4; Rect.h=FrameGfx->H; - - LoadImage( &Rect, (u32*)CActorPool::UnpackBuffer); + LoadImage( &Rect, (u32*)UnpackBuffer); POLY_FT4 *Ft4=GetPrimFT4(); SetUpFT4(Ft4,FrameGfx,Pos.vx,Pos.vy,XFlip,YFlip); setRGB0(Ft4,128,128,128); - setTPage(Ft4,0,0,TexX,TexY); - setClut(Ft4, ClutX, ClutY); + Ft4->tpage=TPage; + Ft4->clut=Clut; AddPrimToList(Ft4,10); if (Shadow) @@ -172,10 +369,8 @@ POLY_FT4 *Ft4=GetPrimFT4(); /*****************************************************************************/ void CActorGfx::SetUpFT4(POLY_FT4 *Ft4,sSpriteFrame *Frame,int X,int Y,bool XFlip,bool YFlip) { -int U=0; -int V=4; -int W=Frame->W; -int H=Frame->H; +u8 W=Frame->W; +u8 H=Frame->H; if (XFlip) { @@ -218,78 +413,4 @@ int H=Frame->H; setXYWH(Ft4,X,Y,W,H); } -/*****************************************************************************/ -void CActorGfx::Dump() -{ - MemFree(SpriteBank); -} -/*****************************************************************************/ -/*****************************************************************************/ -/*****************************************************************************/ -void CActorPool::Init() -{ - for (int i=0; iGetFilename()==Filename) return(i); - } - return(-1); -} - -/*****************************************************************************/ -int CActorPool::FindFreeIdx() -{ - for (int i=0; iGetFilename()!=ACTORS_SPONGEBOB_SBK) - { - CActorGfx *ThisActor=ActorList[i]; - delete ThisActor; - ActorList[i]=0; - } - } -} diff --git a/source/gfx/actor.h b/source/gfx/actor.h index 269e6af3a..3d8e758ce 100644 --- a/source/gfx/actor.h +++ b/source/gfx/actor.h @@ -12,39 +12,56 @@ #include #endif -/*****************************************************************************/ -class CActorGfx +struct sSlot { -public: - CActorGfx(FileEquate Filename,int No); -virtual ~CActorGfx(); - - void Init(FileEquate _Filename); - POLY_FT4 *Render(DVECTOR &Pos,int Anim,int Frame,bool FlipX=false,bool FlipY=false,bool Shadow=false); - void Dump(); - - int getFrameCount(int Anim) {return(SpriteBank->AnimList[Anim].FrameCount);} - 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; - int ActorNo; // qwik bodge for mo :oP - int TexX,TexY; - int ClutX,ClutY; + u16 W,H; }; /*****************************************************************************/ +struct sActorPool +{ + FileEquate Filename; + sSpriteAnimBank *SpriteBank; + u16 RefCount; + u16 Clut; +}; + +/*****************************************************************************/ +class CSlotCache +{ +public: + enum + { + DYN_W =64, + DYN_H =64, + DYN_TPAGEW =4*256, + DYN_TPAGEH =1*256, + DYN_SLOTW =(DYN_TPAGEW/DYN_W), + DYN_SLOTH =(DYN_TPAGEH/DYN_H), + DYN_SLOTX =512+256, + DYN_SLOTY =256, + }; + CSlotCache(){}; + ~CSlotCache(){}; + + + void Init(); + bool FindSlot(int SprW,int SprH,u16 &TexX,u16 &TexY,u8 &u,u8 &v); +protected: + bool TakeSlot(int SX,int SY,int SW,int SH); + + sSlot Cache[DYN_SLOTW][DYN_SLOTH]; + +}; +/*****************************************************************************/ +class CActorGfx; class CActorPool { public: enum { - MAX_ACTORS=8, - MAX_ACTOR_SIZE=128*128, + MAX_ACTORS =32, + MAX_ACTOR_SIZE= 128*128, }; enum ACTOR_TYPE @@ -57,21 +74,55 @@ public: static void Init(); -static void AddActor(FileEquate Filename) {GetActor(Filename);} -static CActorGfx *GetActor(FileEquate Filename); -static void DumpActors(); +static void AddActor(FileEquate Filename); +static CActorGfx *GetActor(FileEquate Filename); +static void DumpActors(); -static u8 UnpackBuffer[MAX_ACTOR_SIZE]; static ACTOR_TYPE getActorType( int actorNum ) {return actorType[actorNum];} -private: -static int FindIdx(FileEquate Filename); -static int FindFreeIdx(); +protected: +static int FindActorInPool(FileEquate Filename); +static int FindFreeActor(); +static int LoadActor(FileEquate Filename); +static u16 LoadPalette(sActorPool &ThisActor,int Idx); -static CActorGfx *ActorList[MAX_ACTORS]; -static ACTOR_TYPE actorType[38]; +static sActorPool ActorPool[]; + +static ACTOR_TYPE actorType[]; + +}; + +/*****************************************************************************/ +class CActorGfx +{ +public: + CActorGfx(); +virtual ~CActorGfx(); + + void SetData(FileEquate Filename,sSpriteAnimBank *_SpriteBank,u16 _Clut); +static void ResetCache(); + + POLY_FT4 *Render(DVECTOR &Pos,int Anim,int Frame,bool FlipX=false,bool FlipY=false,bool Shadow=false); + + int getFrameCount(int Anim) {return(SpriteBank->AnimList[Anim].FrameCount);} + + +protected: + void SetUpFT4(POLY_FT4 *Ft4,sSpriteFrame *ThisFrame,int X,int Y,bool XFlip,bool YFlip); + sSpriteFrame *GetFrame(int Anim,int Frame); + + sSpriteAnimBank *SpriteBank; + +// RECT DrawRect; + u16 Clut; + u16 TPage,TexX,TexY; + u8 U,V; + +static CSlotCache SlotCache; +static u8 UnpackBuffer[CActorPool::MAX_ACTOR_SIZE]; + }; diff --git a/source/level/level.cpp b/source/level/level.cpp index b3688e5ea..7241f5886 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -418,7 +418,9 @@ void CLevel::init() // Load it sLvlTab *lvlTab=&LvlTable[s_globalLevelSelectThing]; + CActorGfx::ResetCache(); CSoundMediator::setSong((CSoundMediator::SONGID)lvlTab->songId); + if (!LevelBuffer) { initNewLevel(lvlTab); diff --git a/tools/Data/bin/MkActor.exe b/tools/Data/bin/MkActor.exe index 66118b953..81594c5f7 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 3a7302fab..ddef20d42 100644 --- a/tools/Data/include/dstructs.h +++ b/tools/Data/include/dstructs.h @@ -264,7 +264,8 @@ struct sSpriteAnimBank u16 ColorCount; // 2 u16 AnimCount; // 2 u16 FrameCount; // 2 - u16 Pad; // 2 + u16 MaxW,MaxH; // 4 + u16 Pad; u8 *Palette; // 4 sSpriteAnim *AnimList; // 4