From 944a38a726b7dfbddb24eea9fa1ff3bf881ad4aa Mon Sep 17 00:00:00 2001 From: Daveo Date: Mon, 9 Apr 2001 21:27:21 +0000 Subject: [PATCH] --- source/enemy/npc.cpp | 2 +- source/gfx/actor.cpp | 363 ++++++++++++++++++++++------------ source/gfx/actor.h | 117 +++++++---- source/level/level.cpp | 2 + tools/Data/bin/MkActor.exe | Bin 86016 -> 86016 bytes tools/Data/include/dstructs.h | 3 +- 6 files changed, 331 insertions(+), 156 deletions(-) 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 66118b953956af519133f755ff1c65b87d32d4c1..81594c5f762de3172bfa7c001e3d4eedbcdb1bc1 100644 GIT binary patch delta 16734 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 O;M(*4f9&j*;QtFKvdL=z 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