diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 5f9aeec42..72536e7cd 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -63,6 +63,10 @@ #include "r_renderer.h" #include "serializer.h" +static TStaticArray loadsectors; +static TArray loadlines; +static TArray loadsides; + //========================================================================== // @@ -988,4 +992,20 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) } +// Create a backup of the map data so the savegame code can toss out all fields that haven't changed in order to reduce processing time and file size. +void P_BackupMapData() +{ + loadsectors = level.sectors; + loadlines.Resize(numlines); + memcpy(&loadlines[0], lines, numlines * sizeof(line_t)); + loadsides.Resize(numsides); + memcpy(&loadsides[0], sides, numsides * sizeof(side_t)); +} + +void P_FreeMapDataBackup() +{ + loadsectors.Clear(); + loadlines.Clear(); + loadsides.Clear(); +} \ No newline at end of file diff --git a/src/p_saveg.h b/src/p_saveg.h index 6c4c74f46..715fd6a19 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -46,4 +46,7 @@ void P_WriteACSDefereds (FSerializer &); void G_SerializeLevel(FSerializer &arc, bool hubLoad); +void P_BackupMapData(); +void P_FreeMapDataBackup(); + #endif // __P_SAVEG_H__ diff --git a/src/p_setup.cpp b/src/p_setup.cpp index e03b7ac23..34b6909c9 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -73,6 +73,7 @@ #include "p_blockmap.h" #include "r_utility.h" #include "p_spec.h" +#include "p_saveg.h" #ifndef NO_EDATA #include "edata.h" #endif @@ -122,10 +123,6 @@ int numsegs; seg_t* segs; glsegextra_t* glsegextras; -//int numsectors; -//sector_t* sectors; -TArray loadsectors; - int numsubsectors; subsector_t* subsectors; @@ -134,11 +131,9 @@ node_t* nodes; int numlines; line_t* lines; -TArray loadlines; int numsides; side_t* sides; -TArray loadsides; TArray Zones; @@ -3431,6 +3426,7 @@ extern polyblock_t **PolyBlockMap; void P_FreeLevelData () { + P_FreeMapDataBackup(); interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. Renderer->CleanLevelData(); FPolyObj::ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. @@ -4193,12 +4189,7 @@ void P_SetupLevel (const char *lumpname, int position) MapThingsUserDataIndex.Clear(); MapThingsUserData.Clear(); - loadsectors.Resize(level.sectors.Size()); - memcpy(&loadsectors[0], &level.sectors[0], loadsectors.Size() * sizeof(sector_t)); - loadlines.Resize(numlines); - memcpy(&loadlines[0], lines, numlines * sizeof(line_t)); - loadsides.Resize(numsides); - memcpy(&loadsides[0], sides, numsides * sizeof(side_t)); + P_BackupMapData(); if (glsegextras != NULL) { diff --git a/src/serializer.h b/src/serializer.h index 4797a4bce..e4dc8f226 100644 --- a/src/serializer.h +++ b/src/serializer.h @@ -15,10 +15,6 @@ struct usercmd_t; struct FWriter; struct FReader; -extern TArray loadsectors; -extern TArray loadlines; -extern TArray loadsides; - inline bool nullcmp(const void *buffer, size_t length) { const char *p = (const char *)buffer; diff --git a/src/tarray.h b/src/tarray.h index 7e6affb97..5b9752d0f 100644 --- a/src/tarray.h +++ b/src/tarray.h @@ -573,6 +573,12 @@ public: this->Array = new T[amount]; this->Count = amount; } + TStaticArray &operator=(const TStaticArray &other) + { + Alloc(other.Size()); + memcpy(Array, other.Array, Count * sizeof(T)); + return *this; + } };