This commit is contained in:
parent
cb4922cb43
commit
57211b9df3
17 changed files with 478 additions and 740 deletions
|
@ -25,7 +25,7 @@ void CFXFallingTile::init(DVECTOR const &_Pos)
|
|||
CFX::init();
|
||||
sLevelHdr *LevelHdr=CLevel::getLevelHdr();
|
||||
|
||||
TileBank3d=LevelHdr->TileBank3d;
|
||||
ElemBank3d=LevelHdr->ElemBank3d;
|
||||
TriList=LevelHdr->TriList;
|
||||
QuadList=LevelHdr->QuadList;
|
||||
VtxList=LevelHdr->VtxList;
|
||||
|
@ -77,7 +77,7 @@ VECTOR ThisRenderPos;
|
|||
gte_SetRotMatrix(&Mtx);
|
||||
CMX_SetTransMtxXY(&ThisRenderPos);
|
||||
|
||||
sTile3d *ThisTile=&TileBank3d[Tile];
|
||||
sElem3d *ThisTile=&ElemBank3d[Tile];
|
||||
int TriCount=ThisTile->TriCount;
|
||||
sTri *TList=&TriList[ThisTile->TriStart];
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ protected:
|
|||
u16 Tile;
|
||||
DVECTOR Velocity;
|
||||
|
||||
sTile3d *TileBank3d;
|
||||
sElem3d *ElemBank3d;
|
||||
sTri *TriList;
|
||||
sQuad *QuadList;
|
||||
sVtx *VtxList;
|
||||
|
|
|
@ -773,18 +773,19 @@ u8 V=Node->V;
|
|||
/*****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
sModel *CModelGfx::ModelTable;
|
||||
sElem3d *CModelGfx::ModelElemBank;
|
||||
sTri *CModelGfx::ModelTriList;
|
||||
sQuad *CModelGfx::ModelQuadList;
|
||||
sVtx *CModelGfx::ModelVtxList;
|
||||
|
||||
/*****************************************************************************/
|
||||
void CModelGfx::SetData(sModel *Table,sTri *TList,sQuad *QList,sVtx *VList)
|
||||
void CModelGfx::SetData(sLevelHdr *LevelHdr)
|
||||
{
|
||||
ModelTable=Table;
|
||||
ModelTriList=TList;
|
||||
ModelQuadList=QList;
|
||||
ModelVtxList=VList;
|
||||
|
||||
ModelTable=LevelHdr->ModelList;
|
||||
ModelElemBank=LevelHdr->ElemBank3d;
|
||||
ModelTriList=LevelHdr->TriList;
|
||||
ModelQuadList=LevelHdr->QuadList;
|
||||
ModelVtxList=LevelHdr->VtxList;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -794,19 +795,21 @@ void CModelGfx::SetModel(int Type)
|
|||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static const int MXO=0;
|
||||
static const int MYO=-8;
|
||||
void CModelGfx::Render(DVECTOR &Pos,SVECTOR *Angle,VECTOR *Scale)
|
||||
{
|
||||
#define BLOCK_MULT 16
|
||||
sElem3d *Elem=&ModelElemBank[Model->ElemID];
|
||||
u8 *PrimPtr=GetPrimPtr();
|
||||
POLY_FT3 *TPrimPtr=(POLY_FT3*)PrimPtr;
|
||||
sVtx *P0,*P1,*P2;
|
||||
u32 T0,T1,T2;
|
||||
s32 ClipZ;
|
||||
sOT *ThisOT;
|
||||
DVECTOR MapXY;
|
||||
VECTOR RenderPos;
|
||||
int TriCount=Model->TriCount;
|
||||
sTri *TList=&ModelTriList[Model->TriStart];
|
||||
int TriCount=Elem->TriCount;
|
||||
sTri *TList=&ModelTriList[Elem->TriStart];
|
||||
MATRIX Mtx;
|
||||
|
||||
// If has scale && angle then need to use PSX scale matrix, otherwise, force values
|
||||
|
@ -830,15 +833,9 @@ sTri *TList=&ModelTriList[Model->TriStart];
|
|||
}
|
||||
}
|
||||
|
||||
MapXY.vx=Pos.vx>>4;
|
||||
MapXY.vy=Pos.vy>>4;
|
||||
|
||||
int ShiftX=(Pos.vx & 15);
|
||||
int ShiftY=(Pos.vy & 15);
|
||||
|
||||
RenderPos.vx=INGAME_SCREENOFS_X+((MapXY.vx*16)+ShiftX);
|
||||
RenderPos.vy=INGAME_SCREENOFS_Y+((MapXY.vy*16)+ShiftY);
|
||||
|
||||
RenderPos.vx=(INGAME_SCREENOFS_X+MXO)+Pos.vx;
|
||||
RenderPos.vy=(INGAME_SCREENOFS_Y+MYO)+Pos.vy;
|
||||
|
||||
gte_SetRotMatrix(&Mtx);
|
||||
CMX_SetTransMtxXY(&RenderPos);
|
||||
|
||||
|
@ -857,35 +854,13 @@ int ShiftY=(Pos.vy & 15);
|
|||
*(u32*)&TPrimPtr->u0=T0; // Set UV0
|
||||
*(u32*)&TPrimPtr->u1=T1; // Set UV1
|
||||
*(u16*)&TPrimPtr->u2=T2; // Set UV2
|
||||
/*
|
||||
if (TList->OTOfs>ActorOT)
|
||||
{
|
||||
ThisOT=OtPtr+(ActorOT+1);
|
||||
}
|
||||
else
|
||||
{
|
||||
ThisOT=OtPtr+(ActorOT-1);
|
||||
}
|
||||
*/
|
||||
ThisOT=OtPtr+TList->OTOfs;
|
||||
|
||||
|
||||
TList++;
|
||||
addPrim(ThisOT,TPrimPtr);
|
||||
gte_stsxy3_ft3(TPrimPtr);
|
||||
TPrimPtr++;
|
||||
|
||||
/* Models are not clipped
|
||||
gte_nclip_b();
|
||||
gte_stsxy3_ft3(TPrimPtr);
|
||||
gte_stopz(&ClipZ);
|
||||
if (ClipZ<=0)
|
||||
{
|
||||
addPrim(ThisOT,TPrimPtr);
|
||||
TPrimPtr++;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
SetPrimPtr((u8*)TPrimPtr);
|
||||
|
||||
}
|
||||
|
|
|
@ -174,7 +174,7 @@ public:
|
|||
CModelGfx(){};
|
||||
virtual ~CModelGfx(){};
|
||||
|
||||
static void SetData(sModel *Table,sTri *TList,sQuad *QList,sVtx *VList);
|
||||
static void SetData(sLevelHdr *LevelHdr);
|
||||
void SetModel(int Type);
|
||||
|
||||
void Render(DVECTOR &Pos,SVECTOR *Angle=0,VECTOR *Scale=0);
|
||||
|
@ -183,9 +183,11 @@ static void SetData(sModel *Table,sTri *TList,sQuad *QList,sVtx *VList);
|
|||
protected:
|
||||
|
||||
static sModel *ModelTable;
|
||||
static sElem3d *ModelElemBank;
|
||||
static sTri *ModelTriList;
|
||||
static sQuad *ModelQuadList;
|
||||
static sVtx *ModelVtxList;
|
||||
|
||||
sModel *Model;
|
||||
};
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ CLayerTile::CLayerTile(sLevelHdr *LevelHdr,sLayerHdr *Hdr)
|
|||
MapHeight=LayerHdr->Height;
|
||||
|
||||
// printf("%i %i\n",MapWidth,MapHeight);
|
||||
TileBank2d=LevelHdr->TileBank2d;
|
||||
ElemBank2d=LevelHdr->ElemBank2d;
|
||||
Map=(sTileMapElem*)MakePtr(Hdr,sizeof(sLayerHdr));
|
||||
}
|
||||
|
||||
|
@ -108,7 +108,7 @@ sOT *ThisOT=OtPtr+LayerOT;
|
|||
MapRow++;
|
||||
if (ThisTile)
|
||||
{
|
||||
sTile2d *Tile=&TileBank2d[ThisTile];
|
||||
sElem2d *Tile=&ElemBank2d[ThisTile];
|
||||
POLY_FT4 *Ft4=(POLY_FT4*)PrimPtr;
|
||||
setPolyFT4(Ft4);
|
||||
setShadeTex(Ft4,1);
|
||||
|
@ -151,7 +151,7 @@ sOT *ThisOT=OtPtr+LayerOT;
|
|||
int ThisTile=*MapRow++;
|
||||
if (ThisTile)
|
||||
{
|
||||
/**/ sTile2d *Tile=&TileBank2d[ThisTile];
|
||||
/**/ sElem2d *Tile=&ElemBank2d[ThisTile];
|
||||
TSPRT_16 *SprPtr=(TSPRT_16*)PrimPtr;
|
||||
setTSprt16(SprPtr);
|
||||
setTSetShadeTex(SprPtr,1);
|
||||
|
|
|
@ -49,7 +49,7 @@ virtual sTileMapElem *getMapPtr(int _x,int _y) {return(&Map[(_x>>4)+((_y>>4)*M
|
|||
protected:
|
||||
|
||||
sLayerHdr *LayerHdr;
|
||||
sTile2d *TileBank2d;
|
||||
sElem2d *ElemBank2d;
|
||||
|
||||
int MapWidth,MapHeight,MapXYShift;
|
||||
int RenderW,RenderH;
|
||||
|
|
|
@ -21,23 +21,22 @@ static FontBank *Font;
|
|||
|
||||
static const int BLOCK_SIZE =16;
|
||||
static const int SCREEN_TILE_ADJ_U =2;
|
||||
static const int SCREEN_TILE_ADJ_D =2;
|
||||
static const int SCREEN_TILE_ADJ_D =1;
|
||||
static const int SCREEN_TILE_ADJ_L =2;
|
||||
static const int SCREEN_TILE_ADJ_R =3;
|
||||
|
||||
static const int SCREEN_TILE3D_WIDTH =(INGAME_SCREENW/BLOCK_SIZE)+SCREEN_TILE_ADJ_L+SCREEN_TILE_ADJ_R;
|
||||
static const int SCREEN_TILE3D_HEIGHT =(INGAME_SCREENH/BLOCK_SIZE)+SCREEN_TILE_ADJ_U+SCREEN_TILE_ADJ_D;
|
||||
static const int RENDER_X_PIX_OFS =8;
|
||||
static const int RENDER_Y_PIX_OFS =16;
|
||||
|
||||
static const int RENDER_X_OFS =INGAME_SCREENOFS_X-(SCREEN_TILE_ADJ_L*BLOCK_SIZE)+RENDER_X_PIX_OFS;
|
||||
static const int RENDER_Y_OFS =INGAME_SCREENOFS_Y-(SCREEN_TILE_ADJ_U*BLOCK_SIZE)+RENDER_Y_PIX_OFS;
|
||||
static const int RENDER_X_OFS =INGAME_SCREENOFS_X-(SCREEN_TILE_ADJ_L*BLOCK_SIZE)+INGAME_RENDER_OFS_X;
|
||||
static const int RENDER_Y_OFS =INGAME_SCREENOFS_Y-(SCREEN_TILE_ADJ_U*BLOCK_SIZE)+INGAME_RENDER_OFS_Y;
|
||||
|
||||
/*****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
CLayerTile3d::CLayerTile3d(sLevelHdr *LevelHdr,sLayerHdr *Hdr) : CLayerTile(LevelHdr,Hdr)
|
||||
{
|
||||
TileBank3d=LevelHdr->TileBank3d;
|
||||
ElemBank3d=LevelHdr->ElemBank3d;
|
||||
TriList=LevelHdr->TriList;
|
||||
QuadList=LevelHdr->QuadList;
|
||||
VtxList=LevelHdr->VtxList;
|
||||
|
@ -112,6 +111,29 @@ void CLayerTile3d::think(DVECTOR &MapPos)
|
|||
/*****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
/*****************************************************************************/
|
||||
#define CMX_SetRotMatrixXY( r0 ) __asm__ ( \
|
||||
"lw $12, 0( %0 );" \
|
||||
"lw $13, 4( %0 );" \
|
||||
"ctc2 $12, $0;" \
|
||||
"ctc2 $13, $2;" \
|
||||
: \
|
||||
: "r"( r0 ) \
|
||||
: "$12", "$13")
|
||||
|
||||
struct sFlipTable
|
||||
{
|
||||
s16 Mtx[4];
|
||||
s32 ClipCode;
|
||||
};
|
||||
|
||||
sFlipTable FlipTable[4]=
|
||||
{
|
||||
{{+4096,0,+4096,0},0<<31}, //00 <0
|
||||
{{-4096,0,+4096,0},1<<31}, //01 >0
|
||||
{{+4096,0,-4096,0},1<<31}, //10 >0
|
||||
{{-4096,0,-4096,0},0<<31} //11 <0
|
||||
};
|
||||
|
||||
void CLayerTile3d::render()
|
||||
{
|
||||
sTileMapElem *MapPtr=GetMapPos();
|
||||
|
@ -134,14 +156,19 @@ VECTOR BlkPos;
|
|||
|
||||
for (int X=0; X<RenderW; X++)
|
||||
{
|
||||
sTile3d *Tile=&TileBank3d[MapRow->Tile];
|
||||
int TriCount=Tile->TriCount;
|
||||
sTri *TList=&TriList[Tile->TriStart];
|
||||
u16 Tile=MapRow->Tile;
|
||||
u16 TileIdx=Tile>>2;
|
||||
u16 Flip=Tile&3;
|
||||
sFlipTable *FTab=&FlipTable[Flip];
|
||||
sElem3d *Elem=&ElemBank3d[TileIdx];
|
||||
int TriCount=Elem->TriCount;
|
||||
sTri *TList=&TriList[Elem->TriStart];
|
||||
|
||||
P0=&VtxList[TList->P0]; P1=&VtxList[TList->P1]; P2=&VtxList[TList->P2];
|
||||
while (TriCount--) // Blank tiles rejected here (as no tri-count)
|
||||
{
|
||||
CMX_SetTransMtxXY(&BlkPos);
|
||||
CMX_SetRotMatrixXY(&FTab->Mtx);
|
||||
gte_ldv3(P0,P1,P2);
|
||||
setlen(TPrimPtr, GPU_PolyFT3Tag);
|
||||
TPrimPtr->code=TList->PolyCode;
|
||||
|
@ -157,11 +184,12 @@ VECTOR BlkPos;
|
|||
|
||||
ThisOT=OtPtr+TList->OTOfs;
|
||||
TList++;
|
||||
P0=&VtxList[TList->P0]; P1=&VtxList[TList->P1]; P2=&VtxList[TList->P2];
|
||||
P0=&VtxList[TList->P0]; P1=&VtxList[TList->P1]; P2=&VtxList[TList->P2]; // Pre-fetch next Tri
|
||||
gte_nclip_b();
|
||||
gte_stsxy3_ft3(TPrimPtr);
|
||||
gte_stopz(&ClipZ);
|
||||
if (ClipZ<=0)
|
||||
ClipZ^=FTab->ClipCode;
|
||||
if (ClipZ<0)
|
||||
{
|
||||
addPrim(ThisOT,TPrimPtr);
|
||||
TPrimPtr++;
|
||||
|
|
|
@ -13,31 +13,14 @@ class CLayerTile3d : public CLayerTile
|
|||
public:
|
||||
CLayerTile3d(sLevelHdr *LevelHdr,sLayerHdr *Hdr);
|
||||
~CLayerTile3d();
|
||||
/*
|
||||
enum
|
||||
{
|
||||
TILE3D_WIDTH =16,
|
||||
TILE3D_HEIGHT =16,
|
||||
BLOCK_MULT =16,
|
||||
SCREEN_TILE_ADJ_UP =1,
|
||||
SCREEN_TILE_ADJ_LEFT =3,
|
||||
SCREEN_TILE3D_WIDTH =40,
|
||||
SCREEN_TILE3D_HEIGHT =18,
|
||||
RENDER_X_PIX_OFS =-8,
|
||||
RENDER_Y_PIX_OFS =0,
|
||||
|
||||
RENDER_X_OFS =-(BLOCK_MULT*15)-(SCREEN_TILE_ADJ_LEFT*BLOCK_MULT)+RENDER_X_PIX_OFS,
|
||||
RENDER_Y_OFS =-(BLOCK_MULT*7)-(SCREEN_TILE_ADJ_UP*BLOCK_MULT)+RENDER_Y_PIX_OFS,
|
||||
|
||||
};
|
||||
*/
|
||||
void init(DVECTOR &MapPos,int Shift);
|
||||
void shutdown();
|
||||
void think(DVECTOR &MapPos);
|
||||
void render();
|
||||
|
||||
protected:
|
||||
sTile3d *TileBank3d;
|
||||
sElem3d *ElemBank3d;
|
||||
sTri *TriList;
|
||||
sQuad *QuadList;
|
||||
sVtx *VtxList;
|
||||
|
|
|
@ -203,14 +203,14 @@ sLvlTab *lvlTab=&LvlTable[LevelNo];
|
|||
DisplayLoadingScreen(lvlTab);
|
||||
|
||||
LevelHdr=(sLevelHdr*)CFileIO::loadFile(lvlTab->LevelFilename,"Level");
|
||||
LevelHdr->TileBank2d=(sTile2d*) MakePtr(LevelHdr,(int)LevelHdr->TileBank2d);
|
||||
LevelHdr->TileBank3d=(sTile3d*) MakePtr(LevelHdr,(int)LevelHdr->TileBank3d);
|
||||
LevelHdr->ElemBank2d=(sElem2d*) MakePtr(LevelHdr,(int)LevelHdr->ElemBank2d);
|
||||
LevelHdr->ElemBank3d=(sElem3d*) MakePtr(LevelHdr,(int)LevelHdr->ElemBank3d);
|
||||
LevelHdr->TriList=(sTri*) MakePtr(LevelHdr,(int)LevelHdr->TriList);
|
||||
LevelHdr->QuadList=(sQuad*) MakePtr(LevelHdr,(int)LevelHdr->QuadList);
|
||||
LevelHdr->VtxList=(sVtx*) MakePtr(LevelHdr,(int)LevelHdr->VtxList);
|
||||
LevelHdr->ModelList=(sModel*) MakePtr(LevelHdr,(int)LevelHdr->ModelList);
|
||||
|
||||
CModelGfx::SetData(LevelHdr->ModelList,LevelHdr->TriList,LevelHdr->QuadList,LevelHdr->VtxList);
|
||||
CModelGfx::SetData(LevelHdr);//LevelHdr->ModelList,LevelHdr->TriList,LevelHdr->QuadList,LevelHdr->VtxList);
|
||||
m_levelTPage=TPLoadTex(lvlTab->TexFilename);
|
||||
|
||||
s_playerSpawnPos.vx=LevelHdr->PlayerStartX*16;
|
||||
|
|
|
@ -8,13 +8,15 @@
|
|||
#include "system\global.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
#define GEOM_SCREEN_H 350
|
||||
#define GEOM_SCREEN_H (350)
|
||||
|
||||
#define INGAME_SCREENW 512
|
||||
#define INGAME_SCREENH 256
|
||||
#define INGAME_SCREENW (512)
|
||||
#define INGAME_SCREENH (256)
|
||||
|
||||
#define INGAME_SCREENOFS_X -(INGAME_SCREENW/2)
|
||||
#define INGAME_SCREENOFS_Y -(INGAME_SCREENH/2)
|
||||
#define INGAME_RENDER_OFS_X (8)
|
||||
#define INGAME_RENDER_OFS_Y (4)
|
||||
#define INGAME_SCREENOFS_X (-INGAME_SCREENW/2)
|
||||
#define INGAME_SCREENOFS_Y (-INGAME_SCREENH/2)
|
||||
|
||||
/*****************************************************************************/
|
||||
typedef void (*VbFuncType)(void);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue