diff --git a/Utils/Libs/DaveLib/facestore.cpp b/Utils/Libs/DaveLib/facestore.cpp index e8973cba8..4810c88f8 100644 --- a/Utils/Libs/DaveLib/facestore.cpp +++ b/Utils/Libs/DaveLib/facestore.cpp @@ -266,6 +266,7 @@ int V=ThisTex.v+H; Out.TPage|=In.TPageFlag<<5; } } + } @@ -677,6 +678,7 @@ int c = FaceList.size(); FaceList[minF].Avail = false; F.Normal= FaceList[minF].Normal; F.OtOfs=FaceList[minF].OtOfs; + F.TPageFlag=FaceList[minF].TPageFlag; if (minC && MaxStrip>F.pts.size()) FollowFace( minF, F ); diff --git a/Utils/MkLevel/MkLevel.cpp b/Utils/MkLevel/MkLevel.cpp index 6d7472f5a..6eaac6458 100644 --- a/Utils/MkLevel/MkLevel.cpp +++ b/Utils/MkLevel/MkLevel.cpp @@ -244,7 +244,7 @@ int i,ListSize=ModelList.size(); if (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); LoadLayers(FileHdr); - SnapTiles(); + if (SnapThresh!=0.0f) SnapTiles(); free(FileHdr); } @@ -577,7 +577,7 @@ CFaceStore &ThisList=ThisElem.FaceStore; ThisList.setMaxStripLength(StripLength); ThisElem.Elem3d.TriStart=OutTriList.size(); ThisElem.Elem3d.QuadStart=OutQuadList.size(); - if (!ThisElem.LocalGeom) + if (!LocalGeom) { // Global Geom ThisList.Process(OutTriList,OutQuadList,OutVtxList); CalcOtOfs(OutTriList,OutVtxList,ThisElem.Elem3d.TriStart,ThisList.GetTriFaceCount()); @@ -586,30 +586,35 @@ CFaceStore &ThisList=ThisElem.FaceStore; else { // Local Geom vector LocalVtxList; - AddDefVtx(LocalVtxList); + int VtxStart=0; + + if (!ThisElem.Model) + { + AddDefVtx(LocalVtxList); + VtxStart=8; + } + ThisList.Process(OutTriList,OutQuadList,LocalVtxList); ThisElem.Elem3d.VtxIdxStart=OutLocalVtxIdxList.size(); int ListSize=LocalVtxList.size(); int LocalVtxCount=0; - for (int v=8; v &List,char *TexPtr,int Count); diff --git a/makefile.gfx b/makefile.gfx index 579fcd716..b77fa3075 100644 --- a/makefile.gfx +++ b/makefile.gfx @@ -38,7 +38,7 @@ TEMP_FILE := $(TEMP_BUILD_DIR)/build.tmp #---------------------------------------------------------------------------- #--- Levels ----------------------------------------------------------------- #---------------------------------------------------------------------------- -LEVELS_OPTS := -t:8,4,1 -s:16 -l -z:0.1 +LEVELS_OPTS := -t:8,4,1 -s:16 -l -z:0.1 LEVELS_IN_DIR := $(GRAF_DIR)/levels LEVELS_OUT_DIR := $(DATA_OUT)/levels LEVELS_MAKEFILE_DIR := $(TEMP_BUILD_DIR)/levels diff --git a/source/fx/fxfallingtile.cpp b/source/fx/fxfallingtile.cpp index 8ce5a8f64..86e8fd529 100644 --- a/source/fx/fxfallingtile.cpp +++ b/source/fx/fxfallingtile.cpp @@ -11,6 +11,7 @@ #include "level\level.h" #include "level\layertile3d.h" #include "system\vid.h" +#include "gfx\actor.h" #include "FX\FXfallingTile.h" @@ -60,23 +61,11 @@ void CFXFallingTile::render() 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(); -VECTOR ThisRenderPos; - - SetIdentNoTrans(&Mtx); - - ThisRenderPos.vx=(INGAME_SCREENOFS_X)+RenderPos.vx; - ThisRenderPos.vy=(INGAME_SCREENOFS_Y)+RenderPos.vy; u16 TileIdx=Tile>>2; - u16 Flip=Tile&3; + CModelGfx::RenderTile(RenderPos,TileIdx); +/* u16 Flip=Tile&3; sFlipTable *FTab=&FlipTable[Flip]; sElem3d *Elem=&ElemBank3d[TileIdx]; int TriCount=Elem->TriCount; @@ -114,5 +103,5 @@ VECTOR ThisRenderPos; } SetPrimPtr((u8*)TPrimPtr); - +*/ } diff --git a/source/gfx/actor.cpp b/source/gfx/actor.cpp index e885ebd90..330a000d7 100644 --- a/source/gfx/actor.cpp +++ b/source/gfx/actor.cpp @@ -769,42 +769,98 @@ u8 V=Node->V; /*****************************************************************************/ /*****************************************************************************/ sModel *CModelGfx::ModelTable; -sElem3d *CModelGfx::ModelElemBank; -sTri *CModelGfx::ModelTriList; -sQuad *CModelGfx::ModelQuadList; -sVtx *CModelGfx::ModelVtxList; +sElem3d *CModelGfx::ElemBank; +sTri *CModelGfx::TriList; +sQuad *CModelGfx::QuadList; +sVtx *CModelGfx::VtxList; +u16 *CModelGfx::VtxIdxList; /*****************************************************************************/ void CModelGfx::SetData(sLevelHdr *LevelHdr) { ModelTable=LevelHdr->ModelList; - ModelElemBank=LevelHdr->ElemBank3d; - ModelTriList=LevelHdr->TriList; - ModelQuadList=LevelHdr->QuadList; - ModelVtxList=LevelHdr->VtxList; + ElemBank=LevelHdr->ElemBank3d; + TriList=LevelHdr->TriList; + QuadList=LevelHdr->QuadList; + VtxList=LevelHdr->VtxList; + VtxIdxList=LevelHdr->VtxIdxList; } /*****************************************************************************/ void CModelGfx::SetModel(int 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(); -POLY_FT3 *TPrimPtr=(POLY_FT3*)PrimPtr; -sVtx *P0,*P1,*P2; -u32 T0,T1,T2; +u32 T0,T1,T2,T3; +u32 P0,P1,P2,P3; s32 ClipZ; sOT *ThisOT; 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 (Angle) @@ -833,34 +889,119 @@ sTri *TList=&ModelTriList[Elem->TriStart]; gte_SetRotMatrix(&Mtx); CMX_SetTransMtxXY(&RenderPos); - while (TriCount--) +// --- Cache Vtx ---------- { - P0=&ModelVtxList[TList->P0]; P1=&ModelVtxList[TList->P1]; P2=&ModelVtxList[TList->P2]; - gte_ldv3(P0,P1,P2); - setlen(TPrimPtr, GPU_PolyFT3Tag); - TPrimPtr->code=TList->PolyCode; - gte_rtpt_b(); - setShadeTex(TPrimPtr,1); - T0=*(u32*)&TList->uv0; // Get UV0 & TPage - T1=*(u32*)&TList->uv1; // Get UV1 & Clut - T2=*(u32*)&TList->uv2; // Get UV2 - *(u32*)&TPrimPtr->u0=T0; // Set UV0 - *(u32*)&TPrimPtr->u1=T1; // Set UV1 - *(u32*)&TPrimPtr->u2=T2; // Set UV2 - ThisOT=OtPtr+TList->OTOfs; - TList++; - gte_nclip_b(); - gte_stsxy3_ft3(TPrimPtr); - gte_stopz(&ClipZ); - ClipZ|=ClipFlag; // <-- Evil!! - if (ClipZ<=0) + 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--) { - addPrim(ThisOT,TPrimPtr); - TPrimPtr++; + 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 } } - SetPrimPtr((u8*)TPrimPtr); +// --- Render Tri's ------------- + + int TriCount=ThisElem->TriCount; + sTri *TList=&TriList[ThisElem->TriStart]; + while (TriCount--) + { + POLY_FT3 *ThisPrim=(POLY_FT3*)PrimPtr; + + P0=XYList[TList->P0]; + P1=XYList[TList->P1]; + P2=XYList[TList->P2]; + 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 + T1=*(u32*)&TList->uv1; // Get UV1 & Clut + T2=*(u32*)&TList->uv2; // Get UV2 + *(u32*)&ThisPrim->u0=T0; // Set UV0 + *(u32*)&ThisPrim->u1=T1; // Set UV1 + *(u32*)&ThisPrim->u2=T2; // Set UV2 + + gte_stopz(&ClipZ); + ThisOT=OtPtr+TList->OTOfs; + ClipZ|=ClipFlag; // <-- Evil!! + TList++; + if (ClipZ<0) + { + *(u32*)&ThisPrim->x0=P0; // Set XY0 + *(u32*)&ThisPrim->x1=P1; // Set XY1 + *(u32*)&ThisPrim->x2=P2; // Set XY2 + addPrim(ThisOT,ThisPrim); + PrimPtr+=sizeof(POLY_FT3); + } + } + +// --- 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); } diff --git a/source/gfx/actor.h b/source/gfx/actor.h index adbd46d4d..cefb5d819 100644 --- a/source/gfx/actor.h +++ b/source/gfx/actor.h @@ -170,19 +170,28 @@ virtual ~CModelGfx(){}; static void SetData(sLevelHdr *LevelHdr); 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);} + sBBox &GetBBox() {return(Model->BBox);} protected: + void CacheModelVtx(); static sModel *ModelTable; -static sElem3d *ModelElemBank; -static sTri *ModelTriList; -static sQuad *ModelQuadList; -static sVtx *ModelVtxList; +static sElem3d *ElemBank; +static sTri *TriList; +static sQuad *QuadList; +static sVtx *VtxList; +static u16 *VtxIdxList; + sModel *Model; + sElem3d *Elem; + }; /*****************************************************************************/ diff --git a/source/level/layertile3d.cpp b/source/level/layertile3d.cpp index 96ecd6500..5769e8fda 100644 --- a/source/level/layertile3d.cpp +++ b/source/level/layertile3d.cpp @@ -317,7 +317,37 @@ s16 TCount=0,QCount=0; CMX_SetTransMtxXY(&BlkPos); 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 FR=DeltaFX[1]+DeltaFOfs.vx; @@ -353,6 +383,7 @@ s16 TCount=0,QCount=0; DP3->vx=BR; DP3->vy=BD; +// --- Render Tri's ------------- while (TriCount--) { POLY_FT3 *ThisPrim=(POLY_FT3*)PrimPtr; @@ -396,6 +427,8 @@ s16 TCount=0,QCount=0; } } + +// --- Render Quads ----------- while (QuadCount--) { POLY_FT4 *ThisPrim=(POLY_FT4*)PrimPtr; diff --git a/tools/Data/bin/MkLevel.exe b/tools/Data/bin/MkLevel.exe index ca0325b54..c3696d836 100644 Binary files a/tools/Data/bin/MkLevel.exe and b/tools/Data/bin/MkLevel.exe differ