From d0fbc8ce7da1fd0e7a87c2a9492e41f4066a00e5 Mon Sep 17 00:00:00 2001 From: Daveo Date: Wed, 27 Jun 2001 16:45:56 +0000 Subject: [PATCH] --- Utils/MkLevel/Layers/MkLevelLayerTile.cpp | 4 +- Utils/MkLevel/MkLevel.cpp | 457 +++++++++++----------- Utils/MkLevel/MkLevel.h | 103 +++-- 3 files changed, 291 insertions(+), 273 deletions(-) diff --git a/Utils/MkLevel/Layers/MkLevelLayerTile.cpp b/Utils/MkLevel/Layers/MkLevelLayerTile.cpp index 027aa47d2..54dbae4da 100644 --- a/Utils/MkLevel/Layers/MkLevelLayerTile.cpp +++ b/Utils/MkLevel/Layers/MkLevelLayerTile.cpp @@ -105,9 +105,9 @@ int Height=OutMap.GetHeight(); } else { - printf("- Writing Layer %s (%i,%i).. ",LayerName,Width,Height); +// printf("- Writing Layer %s (%i,%i).. ",LayerName,Width,Height); int LvlSize=WriteNormal(Core,File); - printf("%i bytes\n",LvlSize); +// printf("%i bytes\n",LvlSize); } PadFile(File); diff --git a/Utils/MkLevel/MkLevel.cpp b/Utils/MkLevel/MkLevel.cpp index eb74dd705..f2e57350d 100644 --- a/Utils/MkLevel/MkLevel.cpp +++ b/Utils/MkLevel/MkLevel.cpp @@ -54,18 +54,18 @@ int Tile2dSize,Tile3dSize; //*************************************************************************** const GString ConfigFilename="MkLevel.ini"; -sExpLayerTile BlankTile2d={-1,-1}; -sExpLayerTile BlankTile3d={0,0}; +sExpLayerTile BlankTile={0,0}; +//sExpLayerTile BlankTile2d={-1,-1}; +//sExpLayerTile BlankTile3d={0,0}; //*************************************************************************** CMkLevel::CMkLevel() { memset(&LevelHdr,0,sizeof(sLevelHdr)); - Tile2dList.Add(BlankTile2d); - Tile3dList.Add(BlankTile3d); - OutTile3dList.resize(1); - OutTile3dList[0].TriCount=0; - OutTile3dList[0].QuadCount=0; +// Add Blanks + AddTile2d(BlankTile); + AddTile3d(BlankTile); + OutElem3d.resize(1); } //*************************************************************************** @@ -122,13 +122,9 @@ GFName Path; TexGrab.NoSort(); TexGrab.AnimatedHeadersOnly(true); TexGrab.DontOutputBoxes(true); - //!!! TexGrab.AllowRotate(true); TexGrab.AllowRotate(false); - //!!! TexGrab.ShrinkToFit(true); TexGrab.ShrinkToFit(false); -// Setup TriList - OutFaceList.SetTexGrab(TexGrab); // Set up other stuph FlatFace[0].vtx[0].x=+0.5f; FlatFace[0].vtx[0].y=+1.0f; FlatFace[0].vtx[0].z=-4.0f; @@ -155,6 +151,7 @@ GFName Path; //*************************************************************************** int CMkLevel::AddModel(GString &Filename) { +/* GFName Path=Filename; sMkLevelModel ThisModel; int Idx; @@ -181,6 +178,8 @@ int TriStart=ModelFaceList.GetFaceCount();; ModelList.Add(ThisModel); return(Idx); +*/ + return(0); } //*************************************************************************** @@ -195,7 +194,7 @@ vector const &SceneTexList= Scene.GetTexList(); vector const &SceneUsedMatList=Scene.GetUsedMaterialIdx(); vector const &SceneMaterials=Scene.GetMaterials(); -int TriCount=NodeTriList.size(); +int TriCount=NodeTriList.size(); for (int T=0; TTexNameOfs],FileHdr->TexNameCount); +// Load Tris +sExpTri *TriPtr=(sExpTri*) &ByteHdr[FileHdr->TriOfs]; + InTriList.resize(FileHdr->TriCount); + for (i=0; iTriCount; i++) + { + InTriList[i]=TriPtr[i]; + } + // Load Tiles u8 *TilePtr=(u8*) &ByteHdr[FileHdr->TileOfs]; - InTileList.resize(FileHdr->TileCount); for (i=0; iTileCount; i++) { @@ -347,14 +357,6 @@ u8 *TilePtr=(u8*) &ByteHdr[FileHdr->TileOfs]; TilePtr+=RGBSize+sizeof(sExpTile); } -// Load Tris -sExpTri *TriPtr=(sExpTri*) &ByteHdr[FileHdr->TriOfs]; - InTriList.resize(FileHdr->TriCount); - for (i=0; iTriCount; i++) - { - InTriList[i]=TriPtr[i]; - } - // Load 2d bitmaps ListSize=InSetNameList.size(); BmpList.resize(ListSize); @@ -366,7 +368,6 @@ sExpTri *TriPtr=(sExpTri*) &ByteHdr[FileHdr->TriOfs]; BmpList[i].LoadBMP(InSetNameList[i]); } } - } //*************************************************************************** @@ -434,11 +435,10 @@ void CMkLevel::Process() PreProcessLayers(); printf("Process Models\n"); ProcessModels(); - printf("Process Tilebank\n"); - ProcessTileBanks(); + printf("Process ElemBanks\n"); + ProcessElemBanks(); printf("Process Layers\n"); ProcessLayers(); - OutFaceList.Process(); } //*************************************************************************** @@ -464,72 +464,115 @@ int LayerCount=LayerList.size(); } //*************************************************************************** -void CMkLevel::ProcessTileBanks() +int CMkLevel::AddTile2d(sExpLayerTile &InTile) { - PreProcessTileBank2d(); - PreProcessTileBank3d(); - TexGrab.Process(); - ProcessTileBank2d(); - ProcessTileBank3d(); +sUsedTile2d ThisTile; + + ThisTile.Tile=InTile.Tile; + ThisTile.Flags=InTile.Flags; + + return(UsedTile2dList.Add(ThisTile)); } //*************************************************************************** -void CMkLevel::PreProcessTileBank2d() +int CMkLevel::AddTile3d(sExpLayerTile &InTile) { -int i,ListSize=Tile2dList.size(); +sUsedTile3d ThisTile; - Tile2dList[0].Tile=-1; + ThisTile.Tile=InTile.Tile; + ThisTile.Flags=InTile.Flags; +int TileID=UsedTile3dList.Add(ThisTile); +int TileIdx=(TileID<<2) | (InTile.Flags & PC_TILE_FLAG_MIRROR_XY); + return(TileIdx); +} + +//*************************************************************************** +void CMkLevel::ProcessElemBanks() +{ + PreProcessElemBank2d(); + PreProcessElemBank3d(); + TexGrab.Process(); + ProcessElemBank2d(); + ProcessElemBank3d(); +} + +//*************************************************************************** +void CMkLevel::PreProcessElemBank2d() +{ +int i,ListSize=UsedTile2dList.size(); + +// UsedTile2dList[0].Tile=-1; // Extract Tex data from list for (i=1; i &TexInfo=TexGrab.GetTexInfo(); - OutTile2dList.resize(ListSize); + OutElem2d.resize(ListSize); for (i=1; i SortList; CList ZPosList; -sTile3d ThisTile; -int TileID=OutTile3dList.size(); +int TileID=OutElem3d.size(); + + if (SrcTile.TriCount) + { + for (i=0; iThisZPos) break; + } + SortList.insert(ListPos,ThisTri); + ZPosList.insert(ListPos,ThisZPos); + } + } + else + { + int TexID=Create2dTile(Tile,0); + + for (i=0; i<2; i++) + { + FlatFace[i].Flags=0; + FlatFace[i].TexID=TexID; + SortList.push_back(FlatFace[i]); + } + } + +// Add sorted list to main list + OutElem3d.resize(TileID+1); +CFaceStore &FaceList=OutElem3d[TileID].FaceStore; + FaceList.SetTexGrab(TexGrab); + + ListSize=SortList.size(); + for (i=0; i SortList; +CList ZPosList; +sTileBank3d ThisTile; +int TileID=OutTileBank3d.size(); +CFaceStore FaceStore; + ThisTile.TriStart=OutFaceList.GetFaceCount(); ThisTile.QuadCount=0; @@ -629,9 +753,8 @@ int TileID=OutTile3dList.size(); } else - { // create flat tile (This is WRONG, flip tex are gen, need to flip goem) -// int TexID=Create2dTex(InTile.Tile,InTile.Flags); - int TexID=Create2dTex(InTile.Tile,0); + { + int TexID=Create2dTile(Tile,0); ThisTile.TriCount=2; @@ -641,8 +764,6 @@ int TileID=OutTile3dList.size(); FlatFace[i].TexID=TexID; SortList.push_back(FlatFace[i]); } - -// InTile.Flags=0; } // Add sorted list to main list @@ -671,7 +792,7 @@ int TileID=OutTile3dList.size(); F.uvs[p].v=ThisTri.uv[p][1]; } - if (InTile.Flags & PC_TILE_FLAG_MIRROR_X) + if (Flags & PC_TILE_FLAG_MIRROR_X) { F.vtx[0].x=-F.vtx[0].x; F.vtx[1].x=-F.vtx[1].x; @@ -679,7 +800,7 @@ int TileID=OutTile3dList.size(); SwapPnt^=1; } - if (InTile.Flags & PC_TILE_FLAG_MIRROR_Y) + if (Flags & PC_TILE_FLAG_MIRROR_Y) { F.vtx[0].y =1.0-F.vtx[0].y; F.vtx[1].y =1.0-F.vtx[1].y; @@ -696,26 +817,23 @@ int TileID=OutTile3dList.size(); F.uvs[0]=F.uvs[1]; F.uvs[1]=TmpUV; } + OutFaceList.SetTPageFlag(F,ThisTri.Flags); OutFaceList.AddFace(F,true); } - OutTile3dList.push_back(ThisTile); - + OutTileBank3d.push_back(ThisTile); return(TileID); } - + */ //*************************************************************************** -int CMkLevel::Create2dTex(int Tile,int Flags) +int CMkLevel::Create2dTile(int Tile,int Flags) { sExpTile &SrcTile=InTileList[Tile]; sMkLevelTex InTex; int Idx; -// Must be new, add it -// InTex.Set=SrcTile.Set; -// InTex.XOfs=SrcTile.XOfs; -// InTex.YOfs=SrcTile.YOfs; + InTex.Tile=Tile; InTex.Flags=Flags; @@ -726,6 +844,7 @@ int Idx; return(Tex2dList[Idx].TexID); } +// Must be new, add it InTex.TexID=BuildTileTex(SrcTile,Flags); Tex2dList.push_back(InTex); return(InTex.TexID); @@ -742,8 +861,6 @@ GString TexName; int BmpW=InFrame.GetWidth(); int BmpH=InFrame.GetHeight(); int TexID; - TexGrab.ShrinkToFit(false); - TexGrab.AllowRotate(false); if (SrcTile.XOfs*16>BmpW) { @@ -794,97 +911,6 @@ GString Name=GFName(InSetNameList[SrcTile.Set]).File(); OutStr=NewName; } -//*************************************************************************** -/* -int CMkLevel::FindRGBMatch(sMkLevelTex &ThisTex) -{ -int i,ListSize=Tex2dList.size(); -int Size=TileW*TileH; -u8 *RGBPtr=ThisTex.RGB; - - if (!RGBPtr) printf("HA HA\n"); -// Create Checksum for this tile - ThisTex.RChk=0; - ThisTex.GChk=0; - ThisTex.BChk=0; - for (i=0; i %i\n",MinOT,MaxOT); // VtxList LevelHdr.VtxList=(sVtx*)WriteVtxList(); -// LevelHdr.VtxList=(sVtx*)OutFaceList.WriteVtxList(File); } //*************************************************************************** -int ZMin=9999,ZMax=0; +int ZMin=9999,ZMax=0; int CMkLevel::WriteTriList() { -vector &TriList=OutFaceList.GetOutTriList(); -vector const &VtxList=OutFaceList.GetVtxList(); int ThisPos=ftell(File); -int i,ListSize=TriList.size(); +int i,ListSize=OutTriList.size(); int ZOfs=+4*Scale; for (i=0;iOtOfs) MinOT=OtOfs; if (MaxOT15) OtOfs=15; if (OtOfs<0) OtOfs=0; -// if (OtOfs>15) OtOfs=15; T.OTOfs=OtOfs; - // Write It fwrite(&T,1,sizeof(sTri),File); } printf("%i Tris\t(%i Bytes)\n",ListSize,ListSize*sizeof(sTri)); -// printf("ZMin %i ZMax %i\n",ZMin,ZMax); - return(ThisPos); - } //*************************************************************************** int CMkLevel::WriteQuadList() { -vector &QuadList=OutFaceList.GetOutQuadList(); -vector const &VtxList=OutFaceList.GetVtxList(); int ThisPos=ftell(File); -int i,ListSize=QuadList.size(); +int i,ListSize=OutQuadList.size(); +int ZOfs=+4*Scale; for (i=0;iZ[p]) ZMin=Z[p]; + if (ZMaxOtOfs) MinOT=OtOfs; if (MaxOT63) OtOfs=63; + if (OtOfs>15) OtOfs=15; + if (OtOfs<0) OtOfs=0; + + Q.OTOfs=OtOfs; // Write It fwrite(&Q,1,sizeof(sQuad),File); } printf("%i Quads\t(%i Bytes)\n",ListSize,ListSize*sizeof(sQuad)); return(ThisPos); - } //*************************************************************************** int CMkLevel::WriteVtxList() { -vector const &VtxList=OutFaceList.GetVtxList(); -int i,ListSize=VtxList.size(); +int i,ListSize=OutVtxList.size(); int Pos=ftell(File); -//sVtx Ofs; - -// Ofs.vx=-0; -// Ofs.vy=-0; -// Ofs.vz=-4*Scale; for (i=0; i &TriList=OutFaceList.GetOutTriList(); @@ -1182,7 +1203,7 @@ int Vtx[3]; } } } - +*/ //*************************************************************************** //*** Inf File ************************************************************** //*************************************************************************** diff --git a/Utils/MkLevel/MkLevel.h b/Utils/MkLevel/MkLevel.h index 59779276e..496962eb6 100644 --- a/Utils/MkLevel/MkLevel.h +++ b/Utils/MkLevel/MkLevel.h @@ -17,44 +17,13 @@ using namespace std; //*************************************************************************** -/* struct sMkLevelTex { - int Set; - int XOfs,YOfs; -// u8 *RGB; - int Flags; -// int RChk,GChk,BChk; - int TexID; - -bool operator ==(sMkLevelTex const &v1) - { - if (Set!=v1.Set) return(false); - if (XOfs!=v1.XOfs) return(false); - if (YOfs!=v1.YOfs) return(false); - if (Flags!=v1.Flags) return(false); - return(true); - } -}; -*/ - -struct sMkLevelTex -{ -// int Set; -// int XOfs,YOfs; int Tile; int Flags; int TexID; -bool operator ==(sMkLevelTex const &v1) - { -// if (Set!=v1.Set) return(false); -// if (XOfs!=v1.XOfs) return(false); -// if (YOfs!=v1.YOfs) return(false); - if (Tile!=v1.Tile) return(false); - if (Flags!=v1.Flags) return(false); - return(true); - } +bool operator ==(sMkLevelTex const &v1) {return(Tile==v1.Tile && Flags==v1.Flags);} }; //*************************************************************************** @@ -76,6 +45,32 @@ bool operator ==(sInfItem const &v1) {return(Name==v1.Name);} }; +//*************************************************************************** +struct sUsedTile2d +{ + int Tile; + int Flags; + int TexID; + +bool operator ==(sUsedTile2d const &v1) {return(Tile==v1.Tile && Flags==v1.Flags);} +}; + +//*************************************************************************** +struct sUsedTile3d +{ + int Tile; + int Flags; + +bool operator ==(sUsedTile3d const &v1) {return(Tile==v1.Tile);} + +}; + +struct sOutElem3d +{ + sElem3d Elem3d; + CFaceStore FaceStore; +}; + //*************************************************************************** struct sMkLevelLayerThing; class CMkLevelLayer; @@ -95,16 +90,14 @@ public: void Load(); void Process(); - int AddTile3d(sExpLayerTile &Tile) {return(Tile3dList.Add(Tile));} - int AddTile2d(sExpLayerTile &Tile) {return(Tile2dList.Add(Tile));} + int AddTile2d(sExpLayerTile &Tile); + int AddTile3d(sExpLayerTile &Tile); void AddInfItem(const char *Name,int Val); void Write(); - int Create2dTex(int Tile,int Flags); - int Create3dTile(sExpLayerTile &ThisTile); -// int FindRGBMatch(sMkLevelTex &ThisTex); -// bool IsRGBSame(const sMkLevelTex &Tile0,const sMkLevelTex &Tile1); + int Create2dTile(int Tile,int Flags); + int Create3dTile(int Tile,int Flags); void MakeTexName(sExpTile &SrcTile,int Flags,GString &OutStr); int BuildTileTex(sExpTile &SrcTile,int Flags); @@ -126,16 +119,16 @@ protected: void LoadLayer(sExpLayerHdr *LayerHdr); void PreProcessLayers(); - void ProcessTileBanks(); - void PreProcessTileBank2d(); - void ProcessTileBank2d(); - void PreProcessTileBank3d(); - void ProcessTileBank3d(); + void ProcessElemBanks(); + void PreProcessElemBank2d(); + void ProcessElemBank2d(); + void PreProcessElemBank3d(); + void ProcessElemBank3d(); void ProcessLayers(); - void SetUpTileUV(sTile2d &Out, sTexOutInfo &Info); + void SetUpTileUV(sElem2d &Out, sTexOutInfo &Info); void ProcessModels(); - + void WriteLevel(); void WriteLayers(); int WriteLayer(int Type,int SubType,bool Warn=false); @@ -144,7 +137,7 @@ protected: int WriteTriList(); int WriteQuadList(); int WriteVtxList(); - void WriteTileBank(); + void WriteElemBanks(); void CalcModelBBox(sMkLevelModel &ThisModel,sBBox &BBox); void BuildTiles(); @@ -167,15 +160,15 @@ protected: CList InTileList; CList InSetNameList; CList InTexNameList; - CList UsedSetNameList; - CList UsedTexNameList; - CFaceStore OutFaceList; - CList OutTile2dList; - CList OutTile3dList; - CList Tile2dList; - CList Tile3dList; +// CFaceStore OutFaceList; + CList OutElem2d; + CList OutElem3d; + + CList UsedTile2dList; + CList UsedTile3dList; + CList Tex2dList; CTexGrab TexGrab; CList BmpList; @@ -192,6 +185,10 @@ protected: int PakW,PakH; + vector OutTriList; + vector OutQuadList; + vector OutVtxList; + }; //***************************************************************************