From 520d73edf61d890036f8ee592b5836d6b2a30345 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 9 Jan 2019 00:04:28 +0100 Subject: [PATCH] - moved the impact decal counter into FLevelLocals and do the counting in a less problematic fashion. This was yet another piece of code that lived or died with the assumption that there can only be one level, stored in global variables. --- src/g_levellocals.h | 1 + src/g_shared/a_decals.cpp | 28 ++++++++++++---------------- src/g_shared/a_sharedglobal.h | 3 +-- src/p_saveg.cpp | 3 ++- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 7825f5f17f..970fb03727 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -210,6 +210,7 @@ struct FLevelLocals : public FLevelData bool brightfog; bool lightadditivesurfaces; bool notexturefill; + int ImpactDecalCount; FDynamicLight *lights; diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index fcf1843919..c7a70e3b5c 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -550,37 +550,39 @@ CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) } else { - while (ImpactCount > self) + ForAllLevels([&](FLevelLocals *Level) { - DThinker *thinker = DThinker::FirstThinker (STAT_AUTODECAL); - if (thinker != NULL) + while (Level->ImpactDecalCount > self) { - thinker->Destroy(); + DThinker *thinker = DThinker::FirstThinker(STAT_AUTODECAL); + if (thinker != NULL) + { + thinker->Destroy(); + } } - } + }); } } DImpactDecal::DImpactDecal () : DBaseDecal (STAT_AUTODECAL, 0.) { - ImpactCount++; } DImpactDecal::DImpactDecal (double z) : DBaseDecal (STAT_AUTODECAL, z) { - ImpactCount++; } void DImpactDecal::CheckMax () { - if (ImpactCount >= cl_maxdecals) + if (++Level->ImpactDecalCount >= cl_maxdecals) { DThinker *thinker = DThinker::FirstThinker (STAT_AUTODECAL); if (thinker != NULL) { thinker->Destroy(); + Level->ImpactDecalCount--; } } } @@ -615,7 +617,6 @@ DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, const DVect else lowercolor = color; StaticCreate (tpl_low, pos, wall, ffloor, lowercolor); } - DImpactDecal::CheckMax(); decal = Create(pos.Z); if (decal == NULL) { @@ -626,6 +627,7 @@ DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, const DVect { return NULL; } + decal->CheckMax(); tpl->ApplyToDecal (decal, wall); if (color != 0) @@ -651,12 +653,12 @@ DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, doubl return NULL; } - DImpactDecal::CheckMax(); DImpactDecal *decal = Create(iz); if (decal != NULL) { if (decal->StickToWall (wall, ix, iy, ffloor).isValid()) { + decal->CheckMax(); tpl->ApplyToDecal (decal, wall); decal->AlphaColor = AlphaColor; decal->RenderFlags = (decal->RenderFlags & RF_DECALMASK) | @@ -671,12 +673,6 @@ DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, doubl return decal; } -void DImpactDecal::OnDestroy () -{ - ImpactCount--; - Super::OnDestroy(); -} - CCMD (countdecals) { Printf ("%d impact decals\n", ImpactCount); diff --git a/src/g_shared/a_sharedglobal.h b/src/g_shared/a_sharedglobal.h index 278d0455b8..c6d2412c6a 100644 --- a/src/g_shared/a_sharedglobal.h +++ b/src/g_shared/a_sharedglobal.h @@ -68,11 +68,10 @@ public: static DImpactDecal *StaticCreate(const FDecalTemplate *tpl, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color = 0); void BeginPlay (); - void OnDestroy() override; protected: DBaseDecal *CloneSelf(const FDecalTemplate *tpl, double x, double y, double z, side_t *wall, F3DFloor * ffloor) const; - static void CheckMax (); + void CheckMax (); private: DImpactDecal(); diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index edefa49396..c86e76f149 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -983,7 +983,8 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) ("corpsequeue", Level->CorpseQueue) ("spotstate", Level->SpotState) ("fragglethinker", Level->FraggleScriptThinker) - ("acsthinker", Level->ACSThinker); + ("acsthinker", Level->ACSThinker) + ("impactdecalcount", Level->ImpactDecalCount); // Hub transitions must keep the current total time if (!hubload)