This commit is contained in:
Daveo 2001-07-28 16:45:46 +00:00
parent 057cb931bb
commit e5a2e9a6ed
21 changed files with 121 additions and 95 deletions

View file

@ -110,7 +110,7 @@ int YPos=MapPos.vy>>MapXYShift;
/*****************************************************************************/
void CLayerTile::render()
{
sTileMapElem *MapPtr=GetMapPos();
sTileMapElem *MapPtr=Map+GetMapOfs();
s16 TileX,TileY;
sOT *ThisOT=OtPtr+LayerOT;
TSPRT *PrimPtr=PrimBank;

View file

@ -33,7 +33,7 @@ virtual void think(DVECTOR &MapPos);
virtual void render();
int GetMapOfs() {return(MapXY.vx+(MapXY.vy*MapWidth));}
virtual sTileMapElem *GetMapPos() {return(Map+GetMapOfs());}
//virtual sTileMapElem *GetMapPos() {return(Map+GetMapOfs());}
virtual sTileMapElem *getMapPtr(int _x,int _y) {return(&Map[(_x>>4)+((_y>>4)*MapWidth)]);}
protected:

View file

@ -87,27 +87,18 @@ sFlipTable FlipTable[4]=
},0<<31}
};
u8 RGBTable[16*4];
int RS=128;
int Ri=-6;
int GS=128;
int Gi=-6;
int BS=128;
int Bi=-6;
int AS=128;
int Ai=-6;
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
CLayerTile3d::CLayerTile3d(sLevelHdr *LevelHdr,sLayerHdr *Hdr) : CLayerTile(LevelHdr,Hdr)
CLayerTile3d::CLayerTile3d(sLevelHdr *LevelHdr,sLayerHdr *Hdr,u8 *_RGBMap,u8 *_RGBTable) : CLayerTile(LevelHdr,Hdr)
{
ElemBank3d=LevelHdr->ElemBank3d;
TriList=LevelHdr->TriList;
QuadList=LevelHdr->QuadList;
VtxList=LevelHdr->VtxList;
VtxIdxList=LevelHdr->VtxIdxList;
RGBMap=_RGBMap;
RGBTable=_RGBTable;
#if defined(_SHOW_POLYZ_)
Font=new ("PrimFont") FontBank;
@ -115,21 +106,6 @@ CLayerTile3d::CLayerTile3d(sLevelHdr *LevelHdr,sLayerHdr *Hdr) : CLayerTile(Leve
Font->setOt( 0 );
Font->setTrans(1);
#endif
for (int i=0; i<16; i++)
{
int R,G,B;
R=RS-(i*Ri);
G=GS-(i*Gi);
B=BS-(i*Bi);
if (R<0) R=0; else if (R>255) R=255;
if (G<0) G=0; else if (G>255) G=255;
if (B<0) B=0; else if (B>255) B=255;
RGBTable[(i*4)+0]=R;
RGBTable[(i*4)+1]=G;
RGBTable[(i*4)+2]=B;
RGBTable[(i*4)+3]=0;
}
}
@ -263,33 +239,6 @@ void CLayerTile3d::think(DVECTOR &MapPos)
RenderH=SCREEN_TILE3D_HEIGHT;
else
RenderH=MapHeight-MapXY.vy;
#if defined(__USER_daveo__)
if (AS!=-1)
{
RS=GS=BS=AS;
}
if (Ai!=-1)
{
Ri=Gi=Bi=Ai;
}
for (int i=0; i<16; i++)
{
int R,G,B;
R=RS-(i*Ri);
G=GS-(i*Gi);
B=BS-(i*Bi);
if (R<0) R=0; else if (R>255) R=255;
if (G<0) G=0; else if (G>255) G=255;
if (B<0) B=0; else if (B>255) B=255;
RGBTable[(i*4)+0]=R;
RGBTable[(i*4)+1]=G;
RGBTable[(i*4)+2]=B;
RGBTable[(i*4)+3]=0;
}
#endif
}
/*****************************************************************************/
@ -322,12 +271,14 @@ s32 *OutPtr;
gte_ldv3(V0,V1,V2);
gte_stsxy3c(OutPtr); // read XY back
}
}
/*****************************************************************************/
void CLayerTile3d::render()
{
sTileMapElem *MapPtr=GetMapPos();
int MapOfs=GetMapOfs();
sTileMapElem *MapPtr=Map+MapOfs;
u8 *RGBMapPtr=RGBMap+MapOfs;
u8 *PrimPtr=GetPrimPtr();
u32 *XYList=(u32*)SCRATCH_RAM;
u32 T0,T1,T2,T3;
@ -350,6 +301,7 @@ s16 TCount=0,QCount=0;
for (int Y=0; Y<RenderH; Y++)
{
sTileMapElem *MapRow=MapPtr;
u8 *RGBRow=RGBMapPtr;
s32 BlkXOld=BlkPos.vx;
s16 *DeltaFX=FTableX[ShiftX];
s16 *DeltaBX=BTableX[ShiftX];
@ -366,6 +318,9 @@ s16 TCount=0,QCount=0;
sTri *TList=&TriList[Elem->TriStart];
int QuadCount=Elem->QuadCount;
sQuad *QList=&QuadList[Elem->QuadStart];
int RGBOfs=*RGBRow++;
u8 *RGB=&RGBTable[RGBOfs*(16*4)];
if (TriCount || QuadCount) // Blank tiles rejected here, to prevent over processing (as no tri-count)
{
CMX_SetTransMtxXY(&BlkPos);
@ -472,9 +427,9 @@ s16 TCount=0,QCount=0;
*(u32*)&ThisPrim->x2=P2; // Set XY2
addPrim(ThisOT,ThisPrim);
// lighting
T0=*(u32*)&RGBTable[TList->C0];
T1=*(u32*)&RGBTable[TList->C1];
T2=*(u32*)&RGBTable[TList->C2];
T0=*(u32*)&RGB[TList->C0];
T1=*(u32*)&RGB[TList->C1];
T2=*(u32*)&RGB[TList->C2];
*(u32*)&ThisPrim->r0=T0;
*(u32*)&ThisPrim->r1=T1;
*(u32*)&ThisPrim->r2=T2;
@ -527,10 +482,10 @@ s16 TCount=0,QCount=0;
*(u32*)&ThisPrim->x2=P2; // Set XY2
*(u32*)&ThisPrim->x3=P3; // Set XY3
// Lighting
T0=*(u32*)&RGBTable[QList->C0];
T1=*(u32*)&RGBTable[QList->C1];
T2=*(u32*)&RGBTable[QList->C2];
T3=*(u32*)&RGBTable[QList->C3];
T0=*(u32*)&RGB[QList->C0];
T1=*(u32*)&RGB[QList->C1];
T2=*(u32*)&RGB[QList->C2];
T3=*(u32*)&RGB[QList->C3];
*(u32*)&ThisPrim->r0=T0;
*(u32*)&ThisPrim->r1=T1;
*(u32*)&ThisPrim->r2=T2;
@ -552,6 +507,7 @@ s16 TCount=0,QCount=0;
DeltaFX++; DeltaBX++;
}
MapPtr+=MapWidth;
RGBMapPtr+=MapWidth;
BlkPos.vx=BlkXOld;
BlkPos.vy+=BLOCK_SIZE;
DeltaFY++; DeltaBY++;

View file

@ -28,7 +28,7 @@ class FontBank;
class CLayerTile3d : public CLayerTile
{
public:
CLayerTile3d(sLevelHdr *LevelHdr,sLayerHdr *Hdr);
CLayerTile3d(sLevelHdr *LevelHdr,sLayerHdr *Hdr,u8 *_RGBMap,u8 *_RGBTable);
~CLayerTile3d();
void init(DVECTOR &MapPos,int Shift);
@ -46,6 +46,8 @@ protected:
sVtx *VtxList;
u16 *VtxIdxList;
DVECTOR RenderOfs;
u8 *RGBMap;
u8 *RGBTable;
s16 *FTableX[16];
s16 *FTableY[16];

View file

@ -201,9 +201,9 @@ void CLevel::init(int LevelNo)
// Load it
sLvlTab *lvlTab=&LvlTable[LevelNo];
CSoundMediator::setSong((CSoundMediator::SONGID)lvlTab->songId);
// DisplayLoadingScreen(lvlTab);
DisplayLoadingScreen(lvlTab);
CSoundMediator::setSong((CSoundMediator::SONGID)lvlTab->songId);
LevelHdr=(sLevelHdr*)CFileIO::loadFile(lvlTab->LevelFilename,"Level");
LevelHdr->ElemBank2d=(sElem2d*) MakePtr(LevelHdr,(int)LevelHdr->ElemBank2d);
@ -214,7 +214,34 @@ sLvlTab *lvlTab=&LvlTable[LevelNo];
LevelHdr->VtxIdxList=(u16*) MakePtr(LevelHdr,(int)LevelHdr->VtxIdxList);
LevelHdr->ModelList=(sModel*) MakePtr(LevelHdr,(int)LevelHdr->ModelList);
CModelGfx::SetData(LevelHdr);//LevelHdr->ModelList,LevelHdr->TriList,LevelHdr->QuadList,LevelHdr->VtxList);
// Deal with RGB Tables (and create if none)
if (LevelHdr->RGBLayer)
{
sLayerRGBHdr *RGBHdr=(sLayerRGBHdr*) MakePtr(LevelHdr,(int)LevelHdr->RGBLayer+sizeof(sLayerHdr));
m_RGBMap=(u8*) MakePtr(LevelHdr,(int)RGBHdr->RGBMap);
m_RGBTable=(u8*) MakePtr(LevelHdr,(int)RGBHdr->RGBTable);
}
else
{ // Make blank RGB data
sLayerHdr *LayerLayer=(sLayerHdr*)MakePtr(LevelHdr,LevelHdr->ActionLayer);
int LvlSize=LayerLayer->Width*LayerLayer->Height;
m_RGBMap=(u8*)MemAlloc(LvlSize,"BlankRGBMap"); ASSERT(m_RGBMap);
memset(m_RGBMap,0,LvlSize);
m_RGBTable=(u8*)MemAlloc(16*4,"BlankRGBTable"); ASSERT(m_RGBTable);
u8 RGB=127;
for (int c=0; c<16; c++)
{
m_RGBTable[(c*4)+0]=RGB;
m_RGBTable[(c*4)+1]=RGB;
m_RGBTable[(c*4)+2]=RGB;
m_RGBTable[(c*4)+3]=0;
RGB+=6;
}
}
CModelGfx::SetData(LevelHdr);
m_levelTPage=TPLoadTex(lvlTab->TexFilename);
s_playerSpawnPos.vx=LevelHdr->PlayerStartX*16;
@ -252,19 +279,20 @@ bool Finished=false;
}
/*****************************************************************************/
void CLevel::DisplayLoadingScreen(sLvlTab *lvlTab)
void CLevel::DisplayLoadingScreen(int LevelNo)
{
sLvlTab *lvlTab=&LvlTable[LevelNo];
ScalableFontBank font;
char buf[256];
u8 *s_image;
int i;
font.initialise(&standardFont);
font.setJustification(FontBank::JUST_CENTRE);
font.setScale(370);
sprintf(buf,"%s\n\n%s",TranslationDatabase::getString(lvlTab->ChapterLoadingText),TranslationDatabase::getString(lvlTab->LevelLoadingText));
s_image=CFileIO::loadFile(loadingScreens[lvlTab->Chapter-1]);
s_image=LoadPakScreen(loadingScreens[lvlTab->Chapter-1]);
ASSERT(s_image);
SetScreenImage(s_image);
for(i=0;i<2;i++)
@ -327,7 +355,7 @@ void CLevel::initLayers()
if (LevelHdr->ActionLayer)
{
sLayerHdr *Layer=(sLayerHdr*)MakePtr(LevelHdr,LevelHdr->ActionLayer);
CLayerTile *NewLayer=new ("Action Layer") CLayerTile3d(LevelHdr,Layer);
CLayerTile *NewLayer=new ("Action Layer") CLayerTile3d(LevelHdr,Layer,m_RGBMap,m_RGBTable);
NewLayer->init(MapPos,0);
TileLayers[CLayerTile::LAYER_TILE_TYPE_ACTION]=NewLayer;
}
@ -604,6 +632,11 @@ void CLevel::shutdown()
delete TileLayers[i];
}
}
if (!LevelHdr->RGBLayer)
{
MemFree(m_RGBMap);
MemFree(m_RGBTable);
}
if (CollisionLayer)
{

View file

@ -84,14 +84,12 @@ static s32 getBossHealth() {return m_bossHealth;}
static void setIsBossRespawn( u8 newIsBossRespawn) {m_isBossRespawn=newIsBossRespawn;}
static void setBossHealth( s32 newBossHealth ) {m_bossHealth=newBossHealth;}
static void DisplayLoadingScreen(int LevelNo=25);
private:
void initLayers();
void initThings(int _respawningLevel);
void DisplayLoadingScreen(sLvlTab *lvlTab);
static sLevelHdr *LevelHdr;
static DVECTOR MapPos;
@ -118,6 +116,9 @@ static DVECTOR s_playerSpawnPos;
int HazardCount;
sThingHazard **HazardList;
u8 *m_RGBMap;
u8 *m_RGBTable;
static u8 m_isBossRespawn;
static s32 m_bossHealth;