diff --git a/Source/Contents/World/World.h b/Source/Contents/World/World.h index 9d2682a3..865ed06e 100644 --- a/Source/Contents/World/World.h +++ b/Source/Contents/World/World.h @@ -29,6 +29,7 @@ public: CWorld(const CWorld&) = delete; CWorld& operator=(const CWorld&) = delete; void Clear(); + void OnExitFrame(); bool FindActorInCell(const float* position, std::function predicate) const; CRenderObject* GetGameActorByAID(std::uint32_t aid) const; CRenderObject* GetGameActorByAidIncludeMe(std::uint32_t aid) const; diff --git a/Source/Contents/World/WorldModelLoading.h b/Source/Contents/World/WorldModelLoading.h index 11d397c1..130df133 100644 --- a/Source/Contents/World/WorldModelLoading.h +++ b/Source/Contents/World/WorldModelLoading.h @@ -23,6 +23,9 @@ static_assert(sizeof(DeferredWorldModel) == 8); static_assert(offsetof(DeferredWorldModel, placement) == 4); #endif +extern HANDLE hObject; +extern std::vector g_deferredWorldModels; + struct WorldModelLoading { ResourceMgr& resources; BinkMovies& movies; diff --git a/Source/Contents/World/WorldObjects.cpp b/Source/Contents/World/WorldObjects.cpp index 318c917b..bd529928 100644 --- a/Source/Contents/World/WorldObjects.cpp +++ b/Source/Contents/World/WorldObjects.cpp @@ -22,12 +22,21 @@ #include "UI/Window/UIWindowMgr.h" #include "Utility/Text/FormatString.h" #include "Utility/Text/HexString.h" +#include "Contents/World/WorldModelLoading.h" +#include "Contents/Ground/GroundGeometry.h" +#include "Contents/Models/ModelActor.h" +#include "Render/Textures/TextureCache.h" #include #include #include #include +// GLOBAL: gl_24371 +HANDLE hObject; +// GLOBAL: gl_24757 +std::vector g_deferredWorldModels; + // OFFSET: 0x00AC8220 // FUNCTION: fn_17667 CRenderObject* CWorld::GetGameActorByAidIncludeMe(std::uint32_t aid) const { @@ -63,6 +72,31 @@ std::uint32_t g_worldOverlayColor; // GLOBAL: gl_24695 float g_fogDensity; +// OFFSET: 0x00AC9CA0 +// FUNCTION: fn_17685 +void CWorld::OnExitFrame() { + if (hObject) { + WaitForSingleObject(hObject, INFINITE); + CloseHandle(hObject); + hObject = nullptr; + } + + g_deferredWorldModels.clear(); + this->pending = 0; + this->spatial.ClearChildren(); + this->Clear(); + + for (C3dActor* model : this->models) { + delete model; + } + + this->models.clear(); + delete this->ground; + this->ground = nullptr; + ResourceMgr::Instance().ClearExpired(); + g_texMgr.ClearUnused(); +} + // OFFSET: 0x00ACA320 // FUNCTION: fn_17691 void CWorld::Clear() {