From d55409645fd275d19a9109f42719bfc900d12b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Wed, 11 Jun 2025 11:26:45 -0300 Subject: [PATCH] iterate over non-thinking statnums for static models --- src/g_levellocals.h | 5 +++++ src/playsim/dthinker.cpp | 16 +++++++++++----- src/playsim/dthinker.h | 7 ++++--- src/rendering/hwrenderer/doom_levelmesh.cpp | 16 ++++++---------- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 954d3c3bf..5c893411b 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -304,6 +304,11 @@ public: { return TThinkerIterator(this, subtype, statnum, prev); } + template TThinkerIterator GetThinkerIterator(PClass * subtype, int statnum = MAX_STATNUM+1, bool forceSearch = false) + { + assert(subtype); + return TThinkerIterator(this, subtype, statnum, forceSearch); + } FActorIterator GetActorIterator(int tid) { return FActorIterator(TIDHash, tid); diff --git a/src/playsim/dthinker.cpp b/src/playsim/dthinker.cpp index 635f27e87..0829ae840 100644 --- a/src/playsim/dthinker.cpp +++ b/src/playsim/dthinker.cpp @@ -933,17 +933,19 @@ size_t DThinker::PropagateMark() // //========================================================================== -FThinkerIterator::FThinkerIterator (FLevelLocals *l, const PClass *type, int statnum) : Level(l) +FThinkerIterator::FThinkerIterator (FLevelLocals *l, const PClass *type, int statnum, bool forceSearch) : Level(l) { if ((unsigned)statnum > MAX_STATNUM) { m_Stat = STAT_FIRST_THINKING; m_SearchStats = true; + m_SkipOne = false; } else { m_Stat = statnum; - m_SearchStats = false; + m_SearchStats = forceSearch; + m_SkipOne = (forceSearch && statnum <= STAT_FIRST_THINKING); } m_ParentType = type; Reinit(); @@ -955,17 +957,19 @@ FThinkerIterator::FThinkerIterator (FLevelLocals *l, const PClass *type, int sta // //========================================================================== -FThinkerIterator::FThinkerIterator (FLevelLocals *l, const PClass *type, int statnum, DThinker *prev) : Level(l) +FThinkerIterator::FThinkerIterator (FLevelLocals *l, const PClass *type, int statnum, DThinker *prev, bool forceSearch) : Level(l) { if ((unsigned)statnum > MAX_STATNUM) { m_Stat = STAT_FIRST_THINKING; m_SearchStats = true; + m_SkipOne = false; } else { m_Stat = statnum; - m_SearchStats = false; + m_SearchStats = forceSearch; + m_SkipOne = (forceSearch && statnum <= STAT_FIRST_THINKING); } m_ParentType = type; if (prev == nullptr || (prev->NextThinker->ObjectFlags & OF_Sentinel)) @@ -1005,6 +1009,8 @@ DThinker *FThinkerIterator::Next (bool exact) } do { + if(m_SkipOne && m_Stat == STAT_FIRST_THINKING) m_SkipOne = false; + do { if (m_CurrThinker != nullptr) @@ -1041,7 +1047,7 @@ DThinker *FThinkerIterator::Next (bool exact) } m_CurrThinker = Level->Thinkers.Thinkers[m_Stat].GetHead(); m_SearchingFresh = false; - } while (m_SearchStats && m_Stat != STAT_FIRST_THINKING); + } while (m_SearchStats && (m_SkipOne || m_Stat != STAT_FIRST_THINKING)); return nullptr; } diff --git a/src/playsim/dthinker.h b/src/playsim/dthinker.h index 03e9ecc91..49622648d 100644 --- a/src/playsim/dthinker.h +++ b/src/playsim/dthinker.h @@ -137,10 +137,11 @@ private: uint8_t m_Stat; bool m_SearchStats; bool m_SearchingFresh; + bool m_SkipOne; public: - FThinkerIterator (FLevelLocals *Level, const PClass *type, int statnum=MAX_STATNUM+1); - FThinkerIterator (FLevelLocals *Level, const PClass *type, int statnum, DThinker *prev); + FThinkerIterator (FLevelLocals *Level, const PClass *type, int statnum=MAX_STATNUM+1, bool forceSearch = false); + FThinkerIterator (FLevelLocals *Level, const PClass *type, int statnum, DThinker *prev, bool forceSearch = false); DThinker *Next (bool exact = false); void Reinit (); }; @@ -154,7 +155,7 @@ public: TThinkerIterator (FLevelLocals *Level, int statnum, DThinker *prev) : FThinkerIterator (Level, RUNTIME_CLASS(T), statnum, prev) { } - TThinkerIterator (FLevelLocals *Level, const PClass *subclass, int statnum=MAX_STATNUM+1) : FThinkerIterator(Level, subclass, statnum) + TThinkerIterator (FLevelLocals *Level, const PClass *subclass, int statnum=MAX_STATNUM+1, bool forceSearch = false) : FThinkerIterator(Level, subclass, statnum, forceSearch) { } TThinkerIterator (FLevelLocals *Level, FName subclass, int statnum=MAX_STATNUM+1) : FThinkerIterator(Level, PClass::FindClass(subclass), statnum) diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 6e698d2c9..45338be82 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -283,20 +283,16 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals& doomMap) // Collect all the models we want to bake into the level mesh if (lm_models) { - PClass * cls = PClass::FindClass("StaticMapModel"); - auto it = doomMap.GetThinkerIterator(); + TThinkerIterator it(&doomMap, PClass::FindClass("StaticMapModel"), STAT_STATIC, true); AActor* thing; while ((thing = it.Next()) != nullptr) { - if(thing->GetClass()->IsDescendantOf(cls)) + bool isPicnumOverride = thing->picnum.isValid(); + int spritenum = thing->sprite; + FSpriteModelFrame* modelframe = isPicnumOverride ? nullptr : FindModelFrame(thing, spritenum, thing->frame, !!(thing->flags & MF_DROPPED)); + if (modelframe && modelframe->modelIDs.size() != 0) { - bool isPicnumOverride = thing->picnum.isValid(); - int spritenum = thing->sprite; - FSpriteModelFrame* modelframe = isPicnumOverride ? nullptr : FindModelFrame(thing, spritenum, thing->frame, !!(thing->flags & MF_DROPPED)); - if (modelframe && modelframe->modelIDs.size() != 0) - { - CreateModelSurfaces(thing, modelframe); - } + CreateModelSurfaces(thing, modelframe); } } }