From 34e9720e263851dca0843daee75820d2b86759b3 Mon Sep 17 00:00:00 2001 From: Daveo Date: Wed, 11 Jul 2001 19:02:00 +0000 Subject: [PATCH] --- Utils/Libs/DaveLib/facestore.cpp | 5 ++- Utils/Libs/DaveLib/facestore.h | 1 + Utils/MkLevel/MkLevel.cpp | 72 ++++++++++++++++++++++++++++---- Utils/MkLevel/MkLevel.h | 10 +++-- source/level/level.cpp | 71 +++++++++++++++++++++++++++++-- source/level/level.h | 15 ++++++- tools/Data/include/dstructs.h | 2 +- 7 files changed, 159 insertions(+), 17 deletions(-) diff --git a/Utils/Libs/DaveLib/facestore.cpp b/Utils/Libs/DaveLib/facestore.cpp index 05a0f4e8d..3455da8e1 100644 --- a/Utils/Libs/DaveLib/facestore.cpp +++ b/Utils/Libs/DaveLib/facestore.cpp @@ -104,6 +104,7 @@ CFace F; F.vtx[i] = P[T.p[i]]; } F.TPageFlag=0; + F.OtOfs=0; F.TexName=Tex; F.Mat = -1; SetTPageFlag(F,MatFlag); @@ -135,7 +136,7 @@ int ListSize=FaceList.size(); } F.Normal = crossProduct( F.vtx[0], F.vtx[1], F.vtx[2] ); F.Avail = true; - + FaceList[ListSize]=F; return(F); } @@ -393,6 +394,7 @@ int ListSize=OutTriList.size(); ParseVtx4BBox(OutVtxList[OutFace.P2]); // Materials and other shit SetupUV(InFace,OutFace); + OutFace.OTOfs=InFace.OtOfs; } } @@ -421,6 +423,7 @@ int ListSize=OutQuadList.size(); // Materials and other shit SetupUV(InFace,OutFace); + OutFace.OTOfs=InFace.OtOfs; } } diff --git a/Utils/Libs/DaveLib/facestore.h b/Utils/Libs/DaveLib/facestore.h index 773261112..013ee325e 100644 --- a/Utils/Libs/DaveLib/facestore.h +++ b/Utils/Libs/DaveLib/facestore.h @@ -61,6 +61,7 @@ public: bool Avail; GString TexName; int TPageFlag; + int OtOfs; }; diff --git a/Utils/MkLevel/MkLevel.cpp b/Utils/MkLevel/MkLevel.cpp index 43da1b79e..2dfa0de94 100644 --- a/Utils/MkLevel/MkLevel.cpp +++ b/Utils/MkLevel/MkLevel.cpp @@ -54,6 +54,7 @@ sLayerNameTable LayerNameTable[]= int TSize,QSize,VSize; int Tile2dSize,Tile3dSize; const char *ModelExcludeGroupName="ModelExcludeList"; +const char *ModelOtOfsGroupName="ModelOtOfs"; //*************************************************************************** const GString ConfigFilename="MkLevel.ini"; @@ -220,7 +221,14 @@ int i,ListSize=ModelList.size(); for (i=0; iSnapXMax-SnapThresh) {V.x=SnapXMax;Count++;} + if (V.ySnapYMax-SnapThresh) {V.y=SnapYMax;Count++;} + if (V.zSnapZMax-SnapThresh) {V.z=SnapZMax;Count++;} + } + } + } + if (Count) + { + printf("Snapped %i Vtx Coords - Bad Artists\n",Count); + } +} //*************************************************************************** //*** Process *************************************************************** //*************************************************************************** @@ -521,13 +568,17 @@ CFaceStore &ThisList=ThisElem.FaceStore; } else { // Local Geom - AddDefVtx(ThisElem.LocalVtxList); - ThisList.Process(OutTriList,OutQuadList,ThisElem.LocalVtxList); - int v,VtxListSize=ThisElem.LocalVtxList.size(); + vector LocalVtxList; + AddDefVtx(LocalVtxList); + ThisList.Process(OutTriList,OutQuadList,LocalVtxList); + ThisElem.LocalVtxIdxStart=OutLocalVtxIdxList.size(); + printf("%i\n",LocalVtxList.size()); + + int v,VtxListSize=LocalVtxList.size(); for (v=0; vOtOfs) MinOT=OtOfs; if (MaxOT15) OtOfs=15; if (OtOfs<0) OtOfs=0; diff --git a/Utils/MkLevel/MkLevel.h b/Utils/MkLevel/MkLevel.h index 9579879cf..d4ab89674 100644 --- a/Utils/MkLevel/MkLevel.h +++ b/Utils/MkLevel/MkLevel.h @@ -62,8 +62,10 @@ struct sOutElem3d bool Model; sElem3d Elem3d; CFaceStore FaceStore; - vector LocalVtxList; - CList LocalVtxIdxList; +// CList LocalVtxIdxList; + int LocalVtxIdxStart; + int LocalVtxIdxCount; + int OTOfs; }; //*************************************************************************** @@ -116,7 +118,7 @@ public: protected: void BuildModel(CScene &ThisScene,GString &RootPath,int Node); - int Create3dElem(int TriCount,int TriStart,bool Local,bool IsTile); + int Create3dElem(int TriCount,int TriStart,bool Local,bool IsTile,int OtOfs); int Create2dElem(int Tile,bool Local); CMkLevelLayer *FindLayer(int Type,int SubType); @@ -126,6 +128,7 @@ protected: void LoadLayers(sExpFileHdr *FileHdr); void LoadLayer(sExpLayerHdr *LayerHdr); + void SnapTiles(); void AddDefVtx(vector &VtxList); void PreProcessLayers(); @@ -199,6 +202,7 @@ protected: vector OutTriList; vector OutQuadList; vector OutVtxList; + vector OutLocalVtxIdxList; }; diff --git a/source/level/level.cpp b/source/level/level.cpp index 8d2ab22c7..2414c1109 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -324,12 +324,13 @@ void CLevel::initLayers() sLayerHdr *Layer=(sLayerHdr*)MakePtr(LevelHdr,LevelHdr->CollisionLayer); CollisionLayer=new ("Collision Layer") CLayerCollision(Layer); CGameScene::setCollision(CollisionLayer); + CreateTileStore(); } else { ASSERT(!"Where is the collision, moron!"); } - + // Actors if (LevelHdr->ActorList) { @@ -574,6 +575,7 @@ void CLevel::respawnLevel() CThingManager::killAllThingsForRespawn(); initThings(true); + ApplyTileStore(); // Put dem tiles back } @@ -604,6 +606,7 @@ void CLevel::shutdown() if (ActorList) MemFree(ActorList); if (PlatformList) MemFree(PlatformList); if (HazardList) MemFree(HazardList); + if (m_TileStore) MemFree(m_TileStore); MemFree(LevelHdr); CActorPool::Reset(); @@ -671,8 +674,6 @@ const int ColT=COLLISION_TYPE_DESTRUCTABLE_WALL; TL.vy=Pos.vy&-16;; BR=TL; -// if (CollisionLayer->getCollisionBlock(TL.vx,TL.vy)>>COLLISION_TYPE_FLAG_SHIFT==ColT)printf ("!!"); - // Left while (CollisionLayer->getCollisionBlock(TL.vx-16,TL.vy)>>COLLISION_TYPE_FLAG_SHIFT==ColT) TL.vx-=16; // Top @@ -766,3 +767,67 @@ DVECTOR DP; } } +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +void CLevel::CreateTileStore() +{ +int MapW=CollisionLayer->getMapWidth(); +int MapH=CollisionLayer->getMapHeight(); +int X,Y; + + m_TileStoreCount=0; + m_TileStore=0; +// CountEm + for (Y=0; YgetMapPtr(X*16,Y*16); + int ColT = (*ColElem) & COLLISION_TYPE_MASK; + if ( ColT==COLLISION_TYPE_FLAG_DESTRUCTABLE_FLOOR || ColT==COLLISION_TYPE_FLAG_DESTRUCTABLE_WALL) + { + m_TileStoreCount++; + } + } + } +// StoreEm + if (m_TileStoreCount) + { + m_TileStore=(sTileStore*)MemAlloc(m_TileStoreCount*sizeof(sTileStore),"TileStoreList"); + + sTileStore *Ptr=m_TileStore; + for (Y=0; YgetMapPtr(X*16,Y*16); + int ColT = (*ColElem) & COLLISION_TYPE_MASK; + if ( ColT==COLLISION_TYPE_FLAG_DESTRUCTABLE_FLOOR || ColT==COLLISION_TYPE_FLAG_DESTRUCTABLE_WALL) + { + Ptr->X=X; + Ptr->Y=Y; + Ptr->Col=*ColElem; + Ptr->Tile=*TileLayers[CLayerTile::LAYER_TILE_TYPE_ACTION]->getMapPtr(X*16,Y*16); + Ptr++; + } + } + } + } +} + +/*****************************************************************************/ +void CLevel::ApplyTileStore() +{ +sTileStore *Ptr=m_TileStore; + + for (int i=0; igetMapPtr(Ptr->X*16,Ptr->Y*16); + sTileMapElem *MapElem=TileLayers[CLayerTile::LAYER_TILE_TYPE_ACTION]->getMapPtr(Ptr->X*16,Ptr->Y*16); + + *ColElem=Ptr->Col; + *MapElem=Ptr->Tile; + Ptr++; + } +} diff --git a/source/level/level.h b/source/level/level.h index 5129b4c4c..66c017d6d 100644 --- a/source/level/level.h +++ b/source/level/level.h @@ -28,6 +28,14 @@ struct sLvlTab extern int s_globalLevelSelectThing; extern sLvlTab LvlTable[]; +/*****************************************************************************/ +struct sTileStore +{ + u16 X,Y; + sTileMapElem Tile; + u8 Col; +}; + /*****************************************************************************/ class CLayer; class CLevel @@ -83,6 +91,7 @@ private: void DisplayLoadingScreen(sLvlTab *lvlTab); + static sLevelHdr *LevelHdr; static DVECTOR MapPos; @@ -112,7 +121,11 @@ static DVECTOR s_playerSpawnPos; static u8 m_isBossRespawn; static s32 m_bossHealth; - +// Level Repair stuff + void CreateTileStore(); + void ApplyTileStore(); + int m_TileStoreCount; + sTileStore *m_TileStore; }; /*****************************************************************************/ diff --git a/tools/Data/include/dstructs.h b/tools/Data/include/dstructs.h index 648f206f1..510b07fc3 100644 --- a/tools/Data/include/dstructs.h +++ b/tools/Data/include/dstructs.h @@ -42,7 +42,6 @@ enum PSX_COLLSION_ENUM COLLISION_TYPE_FLAG_DEATH_LIQUID =COLLISION_TYPE_DEATH_LIQUID << COLLISION_TYPE_FLAG_SHIFT, COLLISION_TYPE_FLAG_SB_NOMOVE =COLLISION_TYPE_SB_NOMOVE << COLLISION_TYPE_FLAG_SHIFT, - COLLISION_TYPE_MASK = ((0xff<