//----------------------------------------------------------------------------- // // Copyright 1993-1996 id Software // Copyright 1999-2016 Randy Heit // Copyright 2002-2016 Christoph Oelckers // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see http://www.gnu.org/licenses/ // //----------------------------------------------------------------------------- // // DESCRIPTION: // Setup a game, startup stuff. // //----------------------------------------------------------------------------- #ifndef __P_SETUP__ #define __P_SETUP__ #include "resourcefiles/resourcefile.h" #include "doomdata.h" #include "r_defs.h" #include "nodebuild.h" struct MapData { private: struct ResourceHolder { FResourceFile *data = nullptr; ~ResourceHolder() { delete data; } ResourceHolder &operator=(FResourceFile *other) { data = other; return *this; } FResourceFile *operator->() { return data; } operator FResourceFile *() const { return data; } }; // The order of members here is important // Resource should be destructed after MapLumps as readers may share FResourceLump objects // For example, this is the case when map .wad is loaded from .pk3 file ResourceHolder resource; struct MapLump { char Name[8] = { 0 }; FileReader Reader; } MapLumps[ML_MAX]; FileReader nofile; public: bool HasBehavior = false; bool Encrypted = false; bool isText = false; bool InWad = false; int lumpnum = -1; /* void Seek(unsigned int lumpindex) { if (lumpindexSeek(0, FileReader::SeekSet); } } */ FileReader &Reader(unsigned int lumpindex) { if (lumpindex < countof(MapLumps)) { auto &file = MapLumps[lumpindex].Reader; file.Seek(0, FileReader::SeekSet); return file; } return nofile; } void Read(unsigned int lumpindex, void * buffer, int size = -1) { if (lumpindex 0) { auto &file = MapLumps[lumpindex].Reader; file.Seek(0, FileReader::SeekSet); file.Read(buffer, size); } } } TArray Read(unsigned lumpindex) { TArray buffer(Size(lumpindex), true); Read(lumpindex, buffer.Data(), (int)buffer.Size()); return buffer; } uint32_t Size(unsigned int lumpindex) { if (lumpindex MapThingsConverted; extern bool ForceNodeBuild; struct FMissingCount { int Count = 0; }; typedef TMap FMissingTextureTracker; struct FLevelLocals; class MapLoader { friend class UDMFParser; void *level; // this is to hide the global variable and produce an error for referencing it. FLevelLocals *Level; int firstglvertex; // helpers for loading GL nodes from GWA files. bool format5; TArray vertexdatas; TMap MapThingsUserDataIndex; // from mapthing idx -> user data idx TArray MapThingsUserData; int sidecount; TArray linemap; TMap EDLines; TMap EDSectors; TMap EDThings; void SlopeLineToPoint(int lineid, const DVector3 &pos, bool slopeCeil); void CopyPlane(int tag, sector_t *dest, bool copyCeil); void CopyPlane(int tag, const DVector2 &pos, bool copyCeil); void SetSlope(secplane_t *plane, bool setCeil, int xyangi, int zangi, const DVector3 &pos); void VavoomSlope(sector_t * sec, int id, const DVector3 &pos, int which); void SetSlopesFromVertexHeights(FMapThing *firstmt, FMapThing *lastmt, const int *oldvertextable); void AlignPlane(sector_t *sec, line_t *line, int which); void InitED(); void ProcessEDMapthing(FMapThing *mt, int recordnum); void ProcessEDLinedef(line_t *line, int recordnum); void ProcessEDSector(sector_t *sec, int recordnum); int checkGLVertex(int num); int checkGLVertex3(int num); int CheckForMissingSegs(); bool LoadGLVertexes(FileReader &lump); bool LoadGLSegs(FileReader &lump); bool LoadGLSubsectors(FileReader &lump); bool LoadNodes(FileReader &lump); bool DoLoadGLNodes(FileReader * lumps); void CreateCachedNodes(MapData *map); void SetTexture(side_t *side, int position, const char *name, FMissingTextureTracker &track); void SetTexture(sector_t *sector, int index, int position, const char *name, FMissingTextureTracker &track, bool truncate); void SetTexture(side_t *side, int position, uint32_t *blend, const char *name); void SetTextureNoErr(side_t *side, int position, uint32_t *color, const char *name, bool *validcolor, bool isFog); void FloodZone(sector_t *sec, int zonenum); void LoadGLZSegs(FileReader &data, int type); void LoadZSegs(FileReader &data); void LoadZNodes(FileReader &data, int glnodes); int DetermineTranslucency(int lumpnum); void SetLineID(int i, line_t *ld); void SaveLineSpecial(line_t *ld); void FinishLoadingLineDef(line_t *ld, int alpha); void SetSideNum(side_t **sidenum_p, uint16_t sidenum); void AllocateSideDefs(MapData *map, int count); void ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec, intmapsidedef_t *msd, int special, int tag, short *alpha, FMissingTextureTracker &missingtex); void SetMapThingUserData(AActor *actor, unsigned udi); void CreateBlockMap(); void AddToList(uint8_t *hitlist, FTextureID texid, int bitmask); public: void LoadMapinfoACSLump(); void ProcessEDSectors(); void FloodZones(); void LoadVertexes(MapData * map); void LoadExtendedNodes(FileReader &dalump, uint32_t id); template void LoadSegs(MapData * map); template void LoadSubsectors(MapData * map); template void LoadNodes(MapData * map); bool LoadGLNodes(MapData * map); bool CheckCachedNodes(MapData *map); bool CheckNodes(MapData * map, bool rebuilt, int buildtime); bool CheckForGLNodes(); void LoadSectors(MapData *map, FMissingTextureTracker &missingtex); void LoadThings(MapData * map); void LoadThings2(MapData * map); void SpawnThings(int position); void FinishLoadingLineDefs(); void LoadLineDefs(MapData * map); void LoadLineDefs2(MapData * map); void LoopSidedefs(bool firstloop); void LoadSideDefs2(MapData *map, FMissingTextureTracker &missingtex); void LoadBlockMap(MapData * map); void LoadReject(MapData * map, bool junk); void LoadBehavior(MapData * map); void GetPolySpots(MapData * map, TArray &spots, TArray &anchors); void GroupLines(bool buildmap); void PrecacheLevel(); void ParseTextMap(MapData *map, FMissingTextureTracker &missingtex); void SummarizeMissingTextures(const FMissingTextureTracker &missing); void SetRenderSector(); void SpawnSlopeMakers(FMapThing *firstmt, FMapThing *lastmt, const int *oldvertextable); void SetSlopes(); void CopySlopes(); MapLoader(FLevelLocals *lev) { Level = lev; } }; #endif