This commit is contained in:
Daveo 2001-07-24 20:17:50 +00:00
parent d21a42d53d
commit 0f12c8495d
9 changed files with 262 additions and 85 deletions

View File

@ -266,6 +266,7 @@ int V=ThisTex.v+H;
Out.TPage|=In.TPageFlag<<5; Out.TPage|=In.TPageFlag<<5;
} }
} }
} }
@ -677,6 +678,7 @@ int c = FaceList.size();
FaceList[minF].Avail = false; FaceList[minF].Avail = false;
F.Normal= FaceList[minF].Normal; F.Normal= FaceList[minF].Normal;
F.OtOfs=FaceList[minF].OtOfs; F.OtOfs=FaceList[minF].OtOfs;
F.TPageFlag=FaceList[minF].TPageFlag;
if (minC && MaxStrip>F.pts.size()) FollowFace( minF, F ); if (minC && MaxStrip>F.pts.size()) FollowFace( minF, F );

View File

@ -244,7 +244,7 @@ int i,ListSize=ModelList.size();
if (OtOfs) if (OtOfs)
printf("ModelOTOfs %s %i\n",ThisModel.Name,OtOfs); printf("ModelOTOfs %s %i\n",ThisModel.Name,OtOfs);
ThisModel.ElemID=Create3dElem(ThisModel.TriCount,ThisModel.TriStart,false,false,OtOfs); // always all models as global for the moment ThisModel.ElemID=Create3dElem(ThisModel.TriCount,ThisModel.TriStart,false,OtOfs); // always all models as global for the moment
} }
} }
@ -278,7 +278,7 @@ int Size;
LoadTiles(FileHdr); LoadTiles(FileHdr);
LoadLayers(FileHdr); LoadLayers(FileHdr);
SnapTiles(); if (SnapThresh!=0.0f) SnapTiles();
free(FileHdr); free(FileHdr);
} }
@ -577,7 +577,7 @@ CFaceStore &ThisList=ThisElem.FaceStore;
ThisList.setMaxStripLength(StripLength); ThisList.setMaxStripLength(StripLength);
ThisElem.Elem3d.TriStart=OutTriList.size(); ThisElem.Elem3d.TriStart=OutTriList.size();
ThisElem.Elem3d.QuadStart=OutQuadList.size(); ThisElem.Elem3d.QuadStart=OutQuadList.size();
if (!ThisElem.LocalGeom) if (!LocalGeom)
{ // Global Geom { // Global Geom
ThisList.Process(OutTriList,OutQuadList,OutVtxList); ThisList.Process(OutTriList,OutQuadList,OutVtxList);
CalcOtOfs(OutTriList,OutVtxList,ThisElem.Elem3d.TriStart,ThisList.GetTriFaceCount()); CalcOtOfs(OutTriList,OutVtxList,ThisElem.Elem3d.TriStart,ThisList.GetTriFaceCount());
@ -586,29 +586,34 @@ CFaceStore &ThisList=ThisElem.FaceStore;
else else
{ // Local Geom { // Local Geom
vector<sVtx> LocalVtxList; vector<sVtx> LocalVtxList;
int VtxStart=0;
if (!ThisElem.Model)
{
AddDefVtx(LocalVtxList); AddDefVtx(LocalVtxList);
VtxStart=8;
}
ThisList.Process(OutTriList,OutQuadList,LocalVtxList); ThisList.Process(OutTriList,OutQuadList,LocalVtxList);
ThisElem.Elem3d.VtxIdxStart=OutLocalVtxIdxList.size(); ThisElem.Elem3d.VtxIdxStart=OutLocalVtxIdxList.size();
int ListSize=LocalVtxList.size(); int ListSize=LocalVtxList.size();
int LocalVtxCount=0; int LocalVtxCount=0;
for (int v=8; v<ListSize; v++) for (int v=VtxStart; v<ListSize; v++)
{ {
u16 Idx=CFaceStore::AddVtx(OutVtxList,LocalVtxList[v]); u16 Idx=CFaceStore::AddVtx(OutVtxList,LocalVtxList[v]);
OutLocalVtxIdxList.push_back(Idx); OutLocalVtxIdxList.push_back(Idx);
LocalVtxCount++; LocalVtxCount++;
} }
if (LocalVtxCount<=0) if (LocalVtxCount==0)
{ {
LocalOptCount++; LocalOptCount++;
LocalVtxCount=0; LocalVtxCount=0;
} }
ThisElem.Elem3d.VtxTriCount=LocalVtxCount/3; ThisElem.Elem3d.VtxTriCount=LocalVtxCount/3;
if (LocalVtxCount%3) ThisElem.Elem3d.VtxTriCount++; if (LocalVtxCount%3) ThisElem.Elem3d.VtxTriCount++;
// printf("%i=%i\n",LocalVtxCount,ThisElem.Elem3d.VtxTriCount);
CalcOtOfs(OutTriList,LocalVtxList,ThisElem.Elem3d.TriStart,ThisList.GetTriFaceCount()); CalcOtOfs(OutTriList,LocalVtxList,ThisElem.Elem3d.TriStart,ThisList.GetTriFaceCount());
CalcOtOfs(OutQuadList,LocalVtxList,ThisElem.Elem3d.QuadStart,ThisList.GetQuadFaceCount()); CalcOtOfs(OutQuadList,LocalVtxList,ThisElem.Elem3d.QuadStart,ThisList.GetQuadFaceCount());
@ -767,18 +772,18 @@ sExpTile &SrcTile=InTileList[Tile];
int ElemID; int ElemID;
if (SrcTile.TriCount) if (SrcTile.TriCount)
{ {
ElemID=Create3dElem(SrcTile.TriCount,SrcTile.TriStart,LocalGeom,true,0); ElemID=Create3dElem(SrcTile.TriCount,SrcTile.TriStart,true,0);
} }
else else
{ {
ElemID=Create2dElem(Tile,LocalGeom); ElemID=Create2dElem(Tile);
} }
return(ElemID); return(ElemID);
} }
//*************************************************************************** //***************************************************************************
int CMkLevel::Create3dElem(int TriCount,int TriStart,bool Local,bool IsTile,int OtOfs) int CMkLevel::Create3dElem(int TriCount,int TriStart,bool IsTile,int OtOfs)
{ {
CFace F; CFace F;
int i,ListSize; int i,ListSize;
@ -790,7 +795,6 @@ int ElemID=OutElem3d.size();
sOutElem3d &ThisElem=OutElem3d[ElemID]; sOutElem3d &ThisElem=OutElem3d[ElemID];
CFaceStore &FaceList=ThisElem.FaceStore; CFaceStore &FaceList=ThisElem.FaceStore;
FaceList.SetTexGrab(TexGrab); FaceList.SetTexGrab(TexGrab);
ThisElem.LocalGeom=Local;
for (i=0; i<TriCount; i++) for (i=0; i<TriCount; i++)
{ {
@ -839,15 +843,14 @@ CFaceStore &FaceList=ThisElem.FaceStore;
FaceList.AddFace(F,true); FaceList.AddFace(F,true);
} }
if (IsTile)
ThisElem.Model=false; ThisElem.Model=!IsTile;
else
ThisElem.Model=true;
return(ElemID); return(ElemID);
} }
//*************************************************************************** //***************************************************************************
int CMkLevel::Create2dElem(int Tile,bool Local) int CMkLevel::Create2dElem(int Tile)
{ {
CFace F; CFace F;
int i; int i;
@ -858,7 +861,6 @@ int ElemID=OutElem3d.size();
sOutElem3d &ThisElem=OutElem3d[ElemID]; sOutElem3d &ThisElem=OutElem3d[ElemID];
CFaceStore &FaceList=ThisElem.FaceStore; CFaceStore &FaceList=ThisElem.FaceStore;
FaceList.SetTexGrab(TexGrab); FaceList.SetTexGrab(TexGrab);
ThisElem.LocalGeom=Local;
for (i=0; i<2; i++) for (i=0; i<2; i++)
{ {
@ -869,7 +871,6 @@ CFaceStore &FaceList=ThisElem.FaceStore;
for (int p=0; p<3; p++) for (int p=0; p<3; p++)
{ {
// F.vtx[p]=ThisTri.vtx[p];
F.vtx[p].x=+ThisTri.vtx[p].x; F.vtx[p].x=+ThisTri.vtx[p].x;
F.vtx[p].y=-ThisTri.vtx[p].y; F.vtx[p].y=-ThisTri.vtx[p].y;
F.vtx[p].z=+ThisTri.vtx[p].z; F.vtx[p].z=+ThisTri.vtx[p].z;
@ -881,6 +882,8 @@ CFaceStore &FaceList=ThisElem.FaceStore;
FaceList.SetTPageFlag(F,0); FaceList.SetTPageFlag(F,0);
FaceList.AddFace(F,true); FaceList.AddFace(F,true);
} }
ThisElem.Model=false;
ThisElem.OTOfs=0;
return(ElemID); return(ElemID);
} }

View File

@ -58,7 +58,7 @@ bool operator ==(sUsedTile3d const &v1) {return(Tile==v1.Tile);}
struct sOutElem3d struct sOutElem3d
{ {
bool LocalGeom; // bool LocalGeom;
bool Model; bool Model;
sElem3d Elem3d; sElem3d Elem3d;
CFaceStore FaceStore; CFaceStore FaceStore;
@ -118,8 +118,8 @@ public:
protected: protected:
void BuildModel(CScene &ThisScene,GString &RootPath,int Node); void BuildModel(CScene &ThisScene,GString &RootPath,int Node);
int Create3dElem(int TriCount,int TriStart,bool Local,bool IsTile,int OtOfs); int Create3dElem(int TriCount,int TriStart,bool IsTile,int OtOfs);
int Create2dElem(int Tile,bool Local); int Create2dElem(int Tile);
CMkLevelLayer *FindLayer(int Type,int SubType); CMkLevelLayer *FindLayer(int Type,int SubType);
void LoadStrList(CList<GString> &List,char *TexPtr,int Count); void LoadStrList(CList<GString> &List,char *TexPtr,int Count);

View File

@ -11,6 +11,7 @@
#include "level\level.h" #include "level\level.h"
#include "level\layertile3d.h" #include "level\layertile3d.h"
#include "system\vid.h" #include "system\vid.h"
#include "gfx\actor.h"
#include "FX\FXfallingTile.h" #include "FX\FXfallingTile.h"
@ -60,23 +61,11 @@ void CFXFallingTile::render()
if (!canRender()) return; if (!canRender()) return;
u8 *PrimPtr=GetPrimPtr();
POLY_FT3 *TPrimPtr=(POLY_FT3*)PrimPtr;
sVtx *P0,*P1,*P2;
u32 T0,T1,T2;
s32 ClipZ;
sOT *ThisOT;
MATRIX Mtx;
DVECTOR &RenderPos=getRenderPos(); DVECTOR &RenderPos=getRenderPos();
VECTOR ThisRenderPos;
SetIdentNoTrans(&Mtx);
ThisRenderPos.vx=(INGAME_SCREENOFS_X)+RenderPos.vx;
ThisRenderPos.vy=(INGAME_SCREENOFS_Y)+RenderPos.vy;
u16 TileIdx=Tile>>2; u16 TileIdx=Tile>>2;
u16 Flip=Tile&3; CModelGfx::RenderTile(RenderPos,TileIdx);
/* u16 Flip=Tile&3;
sFlipTable *FTab=&FlipTable[Flip]; sFlipTable *FTab=&FlipTable[Flip];
sElem3d *Elem=&ElemBank3d[TileIdx]; sElem3d *Elem=&ElemBank3d[TileIdx];
int TriCount=Elem->TriCount; int TriCount=Elem->TriCount;
@ -114,5 +103,5 @@ VECTOR ThisRenderPos;
} }
SetPrimPtr((u8*)TPrimPtr); SetPrimPtr((u8*)TPrimPtr);
*/
} }

View File

@ -769,42 +769,98 @@ u8 V=Node->V;
/*****************************************************************************/ /*****************************************************************************/
/*****************************************************************************/ /*****************************************************************************/
sModel *CModelGfx::ModelTable; sModel *CModelGfx::ModelTable;
sElem3d *CModelGfx::ModelElemBank; sElem3d *CModelGfx::ElemBank;
sTri *CModelGfx::ModelTriList; sTri *CModelGfx::TriList;
sQuad *CModelGfx::ModelQuadList; sQuad *CModelGfx::QuadList;
sVtx *CModelGfx::ModelVtxList; sVtx *CModelGfx::VtxList;
u16 *CModelGfx::VtxIdxList;
/*****************************************************************************/ /*****************************************************************************/
void CModelGfx::SetData(sLevelHdr *LevelHdr) void CModelGfx::SetData(sLevelHdr *LevelHdr)
{ {
ModelTable=LevelHdr->ModelList; ModelTable=LevelHdr->ModelList;
ModelElemBank=LevelHdr->ElemBank3d; ElemBank=LevelHdr->ElemBank3d;
ModelTriList=LevelHdr->TriList; TriList=LevelHdr->TriList;
ModelQuadList=LevelHdr->QuadList; QuadList=LevelHdr->QuadList;
ModelVtxList=LevelHdr->VtxList; VtxList=LevelHdr->VtxList;
VtxIdxList=LevelHdr->VtxIdxList;
} }
/*****************************************************************************/ /*****************************************************************************/
void CModelGfx::SetModel(int Type) void CModelGfx::SetModel(int Type)
{ {
Model=&CModelGfx::ModelTable[Type]; Model=&CModelGfx::ModelTable[Type];
Elem=&ElemBank[Model->ElemID];
} }
/*****************************************************************************/ /*****************************************************************************/
void CModelGfx::Render(DVECTOR &Pos,SVECTOR *Angle,VECTOR *Scale,s32 ClipFlag) static const int ElemXMin=-(16/2);
static const int ElemXMax=+(16/2);
static const int ElemYMin=-(16/2);
static const int ElemYMax=+(16/2);
static const int ElemZMin=-(16*4);
static const int ElemZMax=+(16*4);
static VECTOR VtxTable[8]=
{
{ElemXMin,ElemYMin,ElemZMin}, // FLU
{ElemXMax,ElemYMin,ElemZMin}, // FRU
{ElemXMin,ElemYMax,ElemZMin}, // FLD
{ElemXMax,ElemYMax,ElemZMin}, // FRD
{ElemXMin,ElemYMin,ElemZMax}, // BLU
{ElemXMax,ElemYMin,ElemZMax}, // BRU
{ElemXMin,ElemYMax,ElemZMax}, // BLD
{ElemXMax,ElemYMax,ElemZMax}, // BRD
};
/*****************************************************************************/
void CModelGfx::RenderTile(DVECTOR &Pos,int TileID)
{
sElem3d *ThisElem=&ElemBank[TileID];
u32 *XYList=(u32*)SCRATCH_RAM;
u32 *OutVtx=XYList;
VECTOR *V0,*V1,*V2,*InVtx=VtxTable;
VECTOR RenderPos;
MATRIX Mtx;
SetIdentNoTrans(&Mtx);
RenderPos.vx=(INGAME_SCREENOFS_X)+Pos.vx;
RenderPos.vy=(INGAME_SCREENOFS_Y)+Pos.vy;
gte_SetRotMatrix(&Mtx);
CMX_SetTransMtxXY(&RenderPos);
V0=InVtx++;
V1=InVtx++;
V2=InVtx++;
gte_ldv3(V0,V1,V2);
for (int i=0; i<(int)((sizeof(VtxTable)/sizeof(VECTOR))+1); i++)
{
u32 *OutPtr;
gte_rtpt(); // 22 cycles
V0=InVtx++;
V1=InVtx++;
V2=InVtx++;
gte_ldv3(V0,V1,V2);
OutPtr=OutVtx;
OutVtx+=3;
gte_stsxy3c(OutPtr); // read XY back
}
XYList+=8;
RenderElem(ThisElem,Pos,0,0,0,XYList);
}
/*****************************************************************************/
void CModelGfx::RenderElem(sElem3d *ThisElem,DVECTOR &Pos,SVECTOR *Angle,VECTOR *Scale,s32 ClipFlag,u32 *TransBuffer)
{ {
#define BLOCK_MULT 16
sElem3d *Elem=&ModelElemBank[Model->ElemID];
u8 *PrimPtr=GetPrimPtr(); u8 *PrimPtr=GetPrimPtr();
POLY_FT3 *TPrimPtr=(POLY_FT3*)PrimPtr; u32 T0,T1,T2,T3;
sVtx *P0,*P1,*P2; u32 P0,P1,P2,P3;
u32 T0,T1,T2;
s32 ClipZ; s32 ClipZ;
sOT *ThisOT; sOT *ThisOT;
VECTOR RenderPos; VECTOR RenderPos;
int TriCount=Elem->TriCount;
sTri *TList=&ModelTriList[Elem->TriStart];
MATRIX Mtx; MATRIX Mtx;
u32 const *XYList=(u32*)SCRATCH_RAM;
// If has scale && angle then need to use PSX scale matrix, otherwise, force values // If has scale && angle then need to use PSX scale matrix, otherwise, force values
if (Angle) if (Angle)
@ -833,34 +889,119 @@ sTri *TList=&ModelTriList[Elem->TriStart];
gte_SetRotMatrix(&Mtx); gte_SetRotMatrix(&Mtx);
CMX_SetTransMtxXY(&RenderPos); CMX_SetTransMtxXY(&RenderPos);
// --- Cache Vtx ----------
{
int Count=ThisElem->VtxTriCount;
sVtx *V0,*V1,*V2;
u16 *IdxTable=&VtxIdxList[ThisElem->VtxIdxStart];
V0=&VtxList[*IdxTable++];
V1=&VtxList[*IdxTable++];
V2=&VtxList[*IdxTable++];
gte_ldv3(V0,V1,V2);
while (Count--)
{
u32 *OutPtr;
gte_rtpt_b(); // 22 cycles
// Preload next (when able) - Must check this
V0=&VtxList[*IdxTable++];
V1=&VtxList[*IdxTable++];
V2=&VtxList[*IdxTable++];
OutPtr=TransBuffer;
TransBuffer+=3;
gte_ldv3(V0,V1,V2);
gte_stsxy3c(OutPtr); // read XY back
}
}
// --- Render Tri's -------------
int TriCount=ThisElem->TriCount;
sTri *TList=&TriList[ThisElem->TriStart];
while (TriCount--) while (TriCount--)
{ {
P0=&ModelVtxList[TList->P0]; P1=&ModelVtxList[TList->P1]; P2=&ModelVtxList[TList->P2]; POLY_FT3 *ThisPrim=(POLY_FT3*)PrimPtr;
gte_ldv3(P0,P1,P2);
setlen(TPrimPtr, GPU_PolyFT3Tag); P0=XYList[TList->P0];
TPrimPtr->code=TList->PolyCode; P1=XYList[TList->P1];
gte_rtpt_b(); P2=XYList[TList->P2];
setShadeTex(TPrimPtr,1); gte_ldsxy0(P0);
gte_ldsxy1(P1);
gte_ldsxy2(P2);
setlen(ThisPrim, GPU_PolyFT3Tag);
ThisPrim->code=TList->PolyCode;
gte_nclip_b(); // 8 cycles
setShadeTex(ThisPrim,1);
T0=*(u32*)&TList->uv0; // Get UV0 & TPage T0=*(u32*)&TList->uv0; // Get UV0 & TPage
T1=*(u32*)&TList->uv1; // Get UV1 & Clut T1=*(u32*)&TList->uv1; // Get UV1 & Clut
T2=*(u32*)&TList->uv2; // Get UV2 T2=*(u32*)&TList->uv2; // Get UV2
*(u32*)&TPrimPtr->u0=T0; // Set UV0 *(u32*)&ThisPrim->u0=T0; // Set UV0
*(u32*)&TPrimPtr->u1=T1; // Set UV1 *(u32*)&ThisPrim->u1=T1; // Set UV1
*(u32*)&TPrimPtr->u2=T2; // Set UV2 *(u32*)&ThisPrim->u2=T2; // Set UV2
ThisOT=OtPtr+TList->OTOfs;
TList++;
gte_nclip_b();
gte_stsxy3_ft3(TPrimPtr);
gte_stopz(&ClipZ); gte_stopz(&ClipZ);
ThisOT=OtPtr+TList->OTOfs;
ClipZ|=ClipFlag; // <-- Evil!! ClipZ|=ClipFlag; // <-- Evil!!
if (ClipZ<=0) TList++;
if (ClipZ<0)
{ {
addPrim(ThisOT,TPrimPtr); *(u32*)&ThisPrim->x0=P0; // Set XY0
TPrimPtr++; *(u32*)&ThisPrim->x1=P1; // Set XY1
*(u32*)&ThisPrim->x2=P2; // Set XY2
addPrim(ThisOT,ThisPrim);
PrimPtr+=sizeof(POLY_FT3);
} }
} }
SetPrimPtr((u8*)TPrimPtr); // --- Render Quads -----------
int QuadCount=ThisElem->QuadCount;
sQuad *QList=&QuadList[ThisElem->QuadStart];
while (QuadCount--)
{
POLY_FT4 *ThisPrim=(POLY_FT4*)PrimPtr;
P0=XYList[QList->P0];
P1=XYList[QList->P1];
P2=XYList[QList->P2];
P3=XYList[QList->P3];
gte_ldsxy0(P0);
gte_ldsxy1(P1);
gte_ldsxy2(P2);
setlen(ThisPrim, GPU_PolyFT4Tag);
ThisPrim->code=QList->PolyCode;
gte_nclip_b(); // 8 cycles
setShadeTex(ThisPrim,1);
T0=*(u32*)&QList->uv0; // Get UV0 & TPage
T1=*(u32*)&QList->uv1; // Get UV1 & Clut
T2=*(u32*)&QList->uv2; // Get UV2
T3=*(u32*)&QList->uv3; // Get UV2
*(u32*)&ThisPrim->u0=T0; // Set UV0
*(u32*)&ThisPrim->u1=T1; // Set UV1
*(u32*)&ThisPrim->u2=T2; // Set UV2
*(u32*)&ThisPrim->u3=T3; // Set UV2
gte_stopz(&ClipZ);
ThisOT=OtPtr+QList->OTOfs;
ClipZ|=ClipFlag; // <-- Evil!!
QList++;
if (ClipZ<0)
{
*(u32*)&ThisPrim->x0=P0; // Set XY0
*(u32*)&ThisPrim->x1=P1; // Set XY1
*(u32*)&ThisPrim->x2=P2; // Set XY2
*(u32*)&ThisPrim->x3=P3; // Set XY3
addPrim(ThisOT,ThisPrim);
PrimPtr+=sizeof(POLY_FT4);
}
}
SetPrimPtr(PrimPtr);
} }

View File

@ -170,19 +170,28 @@ virtual ~CModelGfx(){};
static void SetData(sLevelHdr *LevelHdr); static void SetData(sLevelHdr *LevelHdr);
void SetModel(int Type); void SetModel(int Type);
void Render(DVECTOR &Pos,SVECTOR *Angle=0,VECTOR *Scale=0,s32 ClipFlag=0xffffffff); static void RenderTile(DVECTOR &Pos,int TileID);
static void RenderElem(sElem3d *Elem,DVECTOR &Pos,SVECTOR *Angle=0,VECTOR *Scale=0,s32 ClipFlag=0xffffffff,u32 *TransBuffer=(u32*)SCRATCH_RAM);
void Render(DVECTOR &Pos,SVECTOR *Angle=0,VECTOR *Scale=0,s32 ClipFlag=0xffffffff) {RenderElem(Elem,Pos,Angle,Scale,ClipFlag);}
void RenderClip(DVECTOR &Pos,SVECTOR *Angle=0,VECTOR *Scale=0) {Render(Pos,Angle,Scale,0);} void RenderClip(DVECTOR &Pos,SVECTOR *Angle=0,VECTOR *Scale=0) {Render(Pos,Angle,Scale,0);}
sBBox &GetBBox() {return(Model->BBox);} sBBox &GetBBox() {return(Model->BBox);}
protected: protected:
void CacheModelVtx();
static sModel *ModelTable; static sModel *ModelTable;
static sElem3d *ModelElemBank; static sElem3d *ElemBank;
static sTri *ModelTriList; static sTri *TriList;
static sQuad *ModelQuadList; static sQuad *QuadList;
static sVtx *ModelVtxList; static sVtx *VtxList;
static u16 *VtxIdxList;
sModel *Model; sModel *Model;
sElem3d *Elem;
}; };
/*****************************************************************************/ /*****************************************************************************/

View File

@ -317,7 +317,37 @@ s16 TCount=0,QCount=0;
CMX_SetTransMtxXY(&BlkPos); CMX_SetTransMtxXY(&BlkPos);
CMX_SetRotMatrixXY(&FTab->Mtx); CMX_SetRotMatrixXY(&FTab->Mtx);
CacheElemVtx(Elem); // --- Cache Vtx ----------
// CacheElemVtx(Elem);
{
int Count=Elem->VtxTriCount;
sVtx *V0,*V1,*V2;
u16 *IdxTable=&VtxIdxList[Elem->VtxIdxStart];
s32 *OutVtx=(s32*)SCRATCH_RAM;
s32 *OutPtr;
OutVtx+=8;
V0=&VtxList[*IdxTable++];
V1=&VtxList[*IdxTable++];
V2=&VtxList[*IdxTable++];
gte_ldv3(V0,V1,V2);
while (Count--)
{
gte_rtpt_b(); // 22 cycles
// Preload next (when able) - Must check this
V0=&VtxList[*IdxTable++];
V1=&VtxList[*IdxTable++];
V2=&VtxList[*IdxTable++];
OutPtr=OutVtx;
OutVtx+=3;
gte_ldv3(V0,V1,V2);
gte_stsxy3c(OutPtr); // read XY back
}
}
s16 FL=DeltaFX[0]+DeltaFOfs.vx; s16 FL=DeltaFX[0]+DeltaFOfs.vx;
s16 FR=DeltaFX[1]+DeltaFOfs.vx; s16 FR=DeltaFX[1]+DeltaFOfs.vx;
@ -353,6 +383,7 @@ s16 TCount=0,QCount=0;
DP3->vx=BR; DP3->vx=BR;
DP3->vy=BD; DP3->vy=BD;
// --- Render Tri's -------------
while (TriCount--) while (TriCount--)
{ {
POLY_FT3 *ThisPrim=(POLY_FT3*)PrimPtr; POLY_FT3 *ThisPrim=(POLY_FT3*)PrimPtr;
@ -396,6 +427,8 @@ s16 TCount=0,QCount=0;
} }
} }
// --- Render Quads -----------
while (QuadCount--) while (QuadCount--)
{ {
POLY_FT4 *ThisPrim=(POLY_FT4*)PrimPtr; POLY_FT4 *ThisPrim=(POLY_FT4*)PrimPtr;

Binary file not shown.