This commit is contained in:
Daveo 2001-05-15 17:40:54 +00:00
parent 5b4d988629
commit f8cc72ac83
4 changed files with 73 additions and 103 deletions

View File

@ -227,16 +227,9 @@ char AnimName[256];
{
sAnim &ThisAnim=AnimList[i];
sprintf(AnimName,"%s",InAnimList[i]);
if (AnimName[0]=='~')
{ // VRam Sprite
ThisAnim.Name=&AnimName[1];
ThisAnim.VRamFlag=true;
}
else
{ // PAK Sprite
ThisAnim.Name=&AnimName[0];
ThisAnim.VRamFlag=false;
}
ThisAnim.Name=&AnimName[0];
FindFrames(ThisAnim);
}
}
@ -285,18 +278,13 @@ int i,ListSize=AnimList.size();
int FrameCount=ThisAnim.Frames.size();
for (int f=0; f<FrameCount; f++)
{
printf("%s - Load Anim %2d/%2d\tFrame %2d/%2d\r",Name,i+1,ListSize,f,FrameCount);
LoadFrame(ThisAnim.Frames[f],ThisAnim.VRamFlag);
printf("%s - Load Anim %2d/%2d\tFrame %2d/%2d \r",Name,i+1,ListSize,f,FrameCount);
LoadBmp(ThisAnim.Frames[f]);
}
}
printf("\t\t\t\t\t\t\r");
}
//***************************************************************************
void CMkActor::LoadFrame(sFrame &ThisFrame,bool VRamFlag)
{
ThisFrame.FrameIdx=LoadBmp(ThisFrame.Filename,VRamFlag);
}
//***************************************************************************
void CMkActor::MakePsxGfx(sBmp &Bmp)
@ -427,9 +415,9 @@ Rect BBox;
}
//***************************************************************************
int CMkActor::LoadBmp(GString &Name,bool VRamFlag)
void CMkActor::LoadBmp(sFrame &ThisFrame)
{
GString Filename=SpriteDir+Name;
GString Filename=SpriteDir+ThisFrame.Filename;
int BmpListSize=BmpList.size();
sBmp NewBmp;
@ -438,14 +426,10 @@ sBmp NewBmp;
NewBmp.RGB=0;
NewBmp.Pak=0;
NewBmp.Psx=0;
NewBmp.VRamFlag=VRamFlag;
CheckAndShrinkFrame(NewBmp);
if (BmpListSize==0)
{ // Calc HotSpot based on first frame
printf("!");
}
ThisFrame.XOfs=NewBmp.CrossHairX;
ThisFrame.YOfs=NewBmp.CrossHairY;
// Check Dups
int Idx=FindDup(NewBmp);
@ -453,7 +437,8 @@ int Idx=FindDup(NewBmp);
if (Idx!=-1)
{
DupCount++;
return(Idx);
ThisFrame.FrameIdx=Idx;
return;
}
// Its unique, add to list
BmpList.push_back(NewBmp);
@ -465,7 +450,7 @@ void WriteTGA(GString Name,Frame Frm);
WriteTGA(Name,NewBmp.Frm);
#endif
return(BmpListSize);
ThisFrame.FrameIdx=BmpListSize;
}
//***************************************************************************
@ -535,7 +520,7 @@ GString OutName=OutFile+".SBK";
FileHdr.AnimList=(sSpriteAnim*)WriteAnimList();
PadFile(File);
// Write FrameList
FileHdr.FrameList=(sSpriteFrame*)WriteFrameList();
FileHdr.FrameList=(sSpriteFrameGfx*)WriteFrameList();
// PadFile(File);
// Rewrite Header
@ -594,13 +579,17 @@ vector<sSpriteAnim> Hdrs;
int f,FrameCount=ThisAnim.Frames.size();
Hdrs[i].FrameCount=FrameCount;
Hdrs[i].Anim=(u16*)ftell(File);
Hdrs[i].Anim=(sSpriteFrame*)ftell(File);
for (f=0; f<FrameCount; f++)
{
sFrame &ThisFrame=ThisAnim.Frames[f];
u16 FrameNo=ThisFrame.FrameIdx;
fwrite(&FrameNo,1,sizeof(u16),File);
sFrame &ThisFrame=ThisAnim.Frames[f];
sSpriteFrame OutFrame;
OutFrame.FrameIdx=ThisFrame.FrameIdx;
OutFrame.XOfs=ThisFrame.XOfs;
OutFrame.YOfs=ThisFrame.YOfs;
fwrite(&OutFrame,1,sizeof(sSpriteFrame),File);
}
PadFile(File);
@ -623,7 +612,7 @@ int CMkActor::WriteFrameList()
{
int Pos=ftell(File);
int i,FrameCount=BmpList.size();
vector<sSpriteFrame> Hdrs;
vector<sSpriteFrameGfx> Hdrs;
FileHdr.MaxW=MaxW;
FileHdr.MaxH=MaxH;
@ -631,9 +620,10 @@ vector<sSpriteFrame> Hdrs;
// Write Dummy Hdrs
Hdrs.resize(FrameCount);
for (i=0; i<FrameCount; i++)
{
fwrite(&Hdrs[i],1,sizeof(sSpriteFrame),File);
fwrite(&Hdrs[i],1,sizeof(sSpriteFrameGfx),File);
}
PadFile(File);
@ -641,31 +631,20 @@ vector<sSpriteFrame> Hdrs;
for (i=0; i<FrameCount; i++)
{
sBmp &ThisBmp=BmpList[i];
if (ThisBmp.VRamFlag)
{ // VRam
GObject::Error(ERR_FATAL,"VRam sprites not supported yet (%s)\n",ThisBmp.Frm.GetName);
}
else
{ // Pak
int XOfs=ThisBmp.CrossHairX;
int YOfs=ThisBmp.CrossHairY;
Hdrs[i].PAKSpr=(u8*)ftell(File);
Hdrs[i].XOfs=XOfs;
Hdrs[i].YOfs=YOfs;
Hdrs[i].W=ThisBmp.Frm.GetWidth();
Hdrs[i].H=ThisBmp.Frm.GetHeight();
fwrite(ThisBmp.Pak,1,ThisBmp.PakSize,File);
}
Hdrs[i].PAKSpr=(u8*)ftell(File);
// Hdrs[i].XOfs=ThisBmp.CrossHairX;
// Hdrs[i].YOfs=ThisBmp.CrossHairY;
Hdrs[i].W=ThisBmp.Frm.GetWidth();
Hdrs[i].H=ThisBmp.Frm.GetHeight();
fwrite(ThisBmp.Pak,1,ThisBmp.PakSize,File);
}
// ReWrite Headers
int SavePos=ftell(File);
fseek(File,Pos,SEEK_SET);
for (i=0; i<FrameCount; i++)
{
fwrite(&Hdrs[i],1,sizeof(sSpriteFrame),File);
fwrite(&Hdrs[i],1,sizeof(sSpriteFrameGfx),File);
}
fseek(File,SavePos,SEEK_SET);

View File

@ -10,6 +10,7 @@ struct sFrame
{
GString Filename;
int FrameIdx;
int XOfs,YOfs;
};
//***************************************************************************
@ -17,7 +18,6 @@ struct sAnim
{
GString Name;
vector<sFrame> Frames;
bool VRamFlag;
};
//***************************************************************************
@ -31,7 +31,6 @@ struct sBmp
u8 *Pak;
int PsxSize;
int PakSize;
bool VRamFlag;
int CrossHairX,CrossHairY;
};
@ -55,8 +54,7 @@ private:
int FindDup(sBmp &Frm);
void LoadFrameList();
void LoadFrame(sFrame &ThisFrame,bool VRamFlag);
int LoadBmp(GString &Name,bool VRamFlag);
void LoadBmp(sFrame &ThisFrame);
void CheckAndShrinkFrame(sBmp &Bmp);
bool IsImageSame(sBmp &Bmp0,sBmp &Bmp1);
void MakePsxGfx(sBmp &Bmp);

View File

@ -429,22 +429,22 @@ int TotalFrames=0;
sSpriteAnimBank *Spr=(sSpriteAnimBank*)CFileIO::loadFile(Filename,"ActorGfx");
Spr->AnimList=(sSpriteAnim*) MakePtr(Spr,(int)Spr->AnimList);
Spr->FrameList=(sSpriteFrame*) MakePtr(Spr,(int)Spr->FrameList);
Spr->Palette=(u8*) MakePtr(Spr,(int)Spr->Palette);
Spr->AnimList=(sSpriteAnim*) MakePtr(Spr,(int)Spr->AnimList);
Spr->FrameList=(sSpriteFrameGfx*) MakePtr(Spr,(int)Spr->FrameList);
Spr->Palette=(u8*) MakePtr(Spr,(int)Spr->Palette);
// FixUp AnimList
for (i=0; i<Spr->AnimCount; i++)
{
sSpriteAnim *ThisAnim=&Spr->AnimList[i];
ThisAnim->Anim=(u16*) MakePtr(Spr,(int)ThisAnim->Anim);
ThisAnim->Anim=(sSpriteFrame*) MakePtr(Spr,(int)ThisAnim->Anim);
TotalFrames+=ThisAnim->FrameCount;
}
// FixUp FrameList
for (i=0; i<Spr->FrameCount; i++)
{
sSpriteFrame *ThisFrame=&Spr->FrameList[i];
sSpriteFrameGfx *ThisFrame=&Spr->FrameList[i];
ThisFrame->PAKSpr=(u8*) MakePtr(Spr,(int)ThisFrame->PAKSpr);
}
@ -531,6 +531,7 @@ CActorGfx::CActorGfx(sActorPool *ThisActor)
ShadowYOfs=DEF_SHADOW_OFS;
ShadowFlag=false;
OtPos=OTPOS__ACTOR_POS;
}
/*****************************************************************************/
@ -538,30 +539,26 @@ CActorGfx::~CActorGfx()
{
}
/*****************************************************************************/
sSpriteFrame *CActorGfx::GetFrame(int Anim,int Frame)
{
sSpriteAnim *ThisAnim=PoolEntry->ActorGfx->AnimList+Anim;
u16 ThisFrame=ThisAnim->Anim[Frame];
return(PoolEntry->ActorGfx->FrameList+ThisFrame);
}
/*****************************************************************************/
POLY_FT4 *CActorGfx::Render(DVECTOR &Pos,int Anim,int Frame,bool XFlip,bool YFlip)
{
sPoolNode *ThisNode,*FindNode;
POLY_FT4 *Ft4;
CurrentFrame=GetFrame(Anim,Frame);
ThisNode=0;
// Calc Frame Ptrs
sSpriteAnimBank *SpriteBank=PoolEntry->ActorGfx;
sSpriteAnim *ThisAnim=SpriteBank->AnimList+Anim;
CurrentFrame=&ThisAnim->Anim[Frame];
CurrentFrameGfx=&SpriteBank->FrameList[CurrentFrame->FrameIdx];
// Try to find Pre-cached sprite
ThisNode=0;
// Check Local Cache
FindNode=PoolEntry->LocalCache.Head;
while (FindNode)
{ // Try local Cache (From Head forward)
if (FindNode->Frame==CurrentFrame)
if (FindNode->Frame==CurrentFrameGfx)
{
ThisNode=FindNode;
break;
@ -575,7 +572,7 @@ POLY_FT4 *Ft4;
FindNode=PoolEntry->LastCache.Head;
while (FindNode)
{
if (FindNode->Frame==CurrentFrame)
if (FindNode->Frame==CurrentFrameGfx)
{
ThisNode=FindNode;
CActorCache::RemoveNode(ThisNode,PoolEntry->GlobalCache);
@ -588,13 +585,13 @@ POLY_FT4 *Ft4;
}
// Check Global Cache
// Check Global Cache (From Tail back)
if (!ThisNode)
{
FindNode=PoolEntry->GlobalCache->Tail;
while (FindNode)
{
if (FindNode->Frame==CurrentFrame)
if (FindNode->Frame==CurrentFrameGfx)
{
ThisNode=FindNode;
CActorCache::RemoveNode(ThisNode,PoolEntry->GlobalCache);
@ -612,15 +609,16 @@ POLY_FT4 *Ft4;
ASSERT(ThisNode);
CActorCache::AddNode(ThisNode,&PoolEntry->LocalCache);
ThisNode->Frame=CurrentFrame;
ThisNode->Frame=CurrentFrameGfx;
ThisNode->DstRect.w=CurrentFrame->W>>2; // div 4 cos 16 color
ThisNode->DstRect.h=CurrentFrame->H;
CPakTex::Add(CurrentFrame->PAKSpr,&ThisNode->DstRect);
ThisNode->DstRect.w=CurrentFrameGfx->W>>2; // div 4 cos 16 color
ThisNode->DstRect.h=CurrentFrameGfx->H;
CPakTex::Add(CurrentFrameGfx->PAKSpr,&ThisNode->DstRect);
}
Ft4=GetPrimFT4();
SetUpFT4(Ft4,CurrentFrame,ThisNode,Pos.vx,Pos.vy,XFlip,YFlip);
SetUpFT4(Ft4,ThisNode,Pos.vx,Pos.vy,XFlip,YFlip);
setRGB0(Ft4,128,128,128);
Ft4->tpage=ThisNode->TPage;
Ft4->clut=PoolEntry->ActorGfx->Clut;
@ -639,11 +637,11 @@ POLY_FT4 *Ft4;
addPrim(OtPtr+OtPos,sFt4);
}
// Set BBox
int HalfW=CurrentFrame->W>>1;
int HalfW=CurrentFrameGfx->W>>1;
BBox.XMin=-HalfW+BBOX_ADJ;
BBox.XMax=+HalfW-BBOX_ADJ;
BBox.YMin=-CurrentFrame->H+BBOX_ADJ;
BBox.YMin=-CurrentFrameGfx->H+BBOX_ADJ;
BBox.YMax=0-BBOX_ADJ;
return(Ft4);
@ -660,8 +658,8 @@ sBBox SBox,CBox;
Angle&=4095;
dX=(CurrentFrame->W*XScale)>>(12+1); // +1 for half
dY=(CurrentFrame->H*YScale)>>(12);
dX=(CurrentFrameGfx->W*XScale)>>(12+1); // +1 for half
dY=(CurrentFrameGfx->H*YScale)>>(12);
CosAngle=mcos(Angle);
SinAngle=msin(Angle);
@ -713,25 +711,20 @@ int YMin,YMax;
Ft4->x2=Pos.vx+x2; Ft4->y2=Pos.vy+y2;
Ft4->x3=Pos.vx+x3; Ft4->y3=Pos.vy+y3;
// Ft4->x0=Pos.vx+CBox.XMin-SBox.YMin; Ft4->y0=Pos.vy+SBox.XMin+CBox.YMin;
// Ft4->x1=Pos.vx+CBox.XMax-SBox.YMin; Ft4->y1=Pos.vy+SBox.XMax+CBox.YMin;
// Ft4->x2=Pos.vx+CBox.XMin+SBox.YMax; Ft4->y2=Pos.vy+SBox.XMin-CBox.YMax;
// Ft4->x3=Pos.vx+CBox.XMax+SBox.YMax; Ft4->y3=Pos.vy+SBox.XMax-CBox.YMax;
return(Ft4);
}
/*****************************************************************************/
void CActorGfx::SetUpFT4(POLY_FT4 *Ft4,sSpriteFrame *Frame,sPoolNode *Node,int X,int Y,bool XFlip,bool YFlip)
void CActorGfx::SetUpFT4(POLY_FT4 *Ft4,sPoolNode *Node,int X,int Y,bool XFlip,bool YFlip)
{
u8 W=Frame->W;
u8 H=Frame->H;
u8 W=CurrentFrameGfx->W;
u8 H=CurrentFrameGfx->H;
u8 U=Node->U;
u8 V=Node->V;
if (XFlip)
{
X-=Frame->XOfs;
X-=CurrentFrame->XOfs;
X-=W;
Ft4->u0=U+W-1;
Ft4->u1=U;//-1;
@ -741,7 +734,7 @@ u8 V=Node->V;
}
else
{
X+=Frame->XOfs;
X+=CurrentFrame->XOfs;
Ft4->u0=U;
Ft4->u1=U+W-1;
Ft4->u2=U;
@ -751,7 +744,7 @@ u8 V=Node->V;
if (YFlip)
{
Y-=Frame->YOfs;
Y-=CurrentFrame->YOfs;
Y-=H;
Ft4->v0=V+H-1;
Ft4->v1=V+H-1;
@ -760,7 +753,7 @@ u8 V=Node->V;
}
else
{
Y+=Frame->YOfs;
Y+=CurrentFrame->YOfs;
Ft4->v0=V;
Ft4->v1=V;
Ft4->v2=V+H-1;
@ -796,8 +789,8 @@ void CModelGfx::SetModel(int Type)
}
/*****************************************************************************/
int PXOfs=-16;
int PYOfs=-8;
const int PXOfs=-16;
const int PYOfs=-8;
void CModelGfx::Render(DVECTOR &Pos,SVECTOR *Angle,VECTOR *Scale)
{

View File

@ -15,7 +15,7 @@
/*****************************************************************************/
struct sPoolNode
{
sSpriteFrame *Frame;
sSpriteFrameGfx *Frame;
RECT DstRect;
u16 TPage;
u8 U,V;
@ -151,11 +151,11 @@ virtual ~CActorGfx();
void SetOtPos(int Ot) {OtPos=Ot;}
protected:
void SetUpFT4(POLY_FT4 *Ft4,sSpriteFrame *Frame,sPoolNode *Node,int X,int Y,bool XFlip,bool YFlip);
sSpriteFrame *GetFrame(int Anim,int Frame);
void SetUpFT4(POLY_FT4 *Ft4,sPoolNode *Node,int X,int Y,bool XFlip,bool YFlip);
sActorPool *PoolEntry;
sSpriteFrame *CurrentFrame;
sSpriteFrameGfx *CurrentFrameGfx;
sBBox BBox;
bool ShadowFlag;