diff --git a/src/ObjLoading/Asset/AssetCreationContext.cpp b/src/ObjLoading/Asset/AssetCreationContext.cpp index cbe5d23f..b06886e8 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.cpp +++ b/src/ObjLoading/Asset/AssetCreationContext.cpp @@ -64,6 +64,7 @@ std::unique_ptr GenericAssetRegistration::CreateXAssetInfo() AssetCreationContext::AssetCreationContext(Zone& zone, const AssetCreatorCollection* creators, const IgnoredAssetLookup* ignoredAssetLookup) : ZoneAssetCreationStateContainer(zone), + m_zone(zone), m_creators(creators), m_ignored_asset_lookup(ignoredAssetLookup) { diff --git a/src/ObjLoading/Asset/AssetCreationContext.h b/src/ObjLoading/Asset/AssetCreationContext.h index 76ffde8b..0dca991c 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.h +++ b/src/ObjLoading/Asset/AssetCreationContext.h @@ -68,6 +68,7 @@ public: private: [[nodiscard]] XAssetInfoGeneric* LoadDefaultAssetDependency(asset_type_t assetType, const std::string& assetName); + Zone& m_zone; const AssetCreatorCollection* m_creators; const IgnoredAssetLookup* m_ignored_asset_lookup; }; diff --git a/src/ObjLoading/Asset/IZoneAssetCreationState.h b/src/ObjLoading/Asset/IZoneAssetCreationState.h index f4a88340..c63b1861 100644 --- a/src/ObjLoading/Asset/IZoneAssetCreationState.h +++ b/src/ObjLoading/Asset/IZoneAssetCreationState.h @@ -6,6 +6,21 @@ #include #include +class ZoneAssetCreationStateContainer; + +class ZoneAssetCreationInjection +{ +public: + ZoneAssetCreationInjection(ZoneAssetCreationStateContainer& zoneStates, Zone& zone) + : m_zone_states(zoneStates), + m_zone(zone) + { + } + + ZoneAssetCreationStateContainer& m_zone_states; + Zone& m_zone; +}; + class IZoneAssetCreationState { protected: @@ -18,7 +33,7 @@ public: IZoneAssetCreationState& operator=(const IZoneAssetCreationState& other) = default; IZoneAssetCreationState& operator=(IZoneAssetCreationState&& other) noexcept = default; - virtual void SetZone(Zone* zone) + virtual void Inject(ZoneAssetCreationInjection& inject) { // Do nothing by default } @@ -28,7 +43,7 @@ class ZoneAssetCreationStateContainer { public: ZoneAssetCreationStateContainer(Zone& zone) - : m_zone(zone) + : m_injection(*this, zone) { } @@ -42,16 +57,14 @@ public: return *dynamic_cast(foundEntry->second.get()); auto newState = std::make_unique(); - newState->SetZone(&m_zone); + newState->Inject(m_injection); auto* newStatePtr = newState.get(); m_zone_asset_creation_states.emplace(std::make_pair>(typeid(T), std::move(newState))); return *newStatePtr; } -protected: - Zone& m_zone; - private: + ZoneAssetCreationInjection m_injection; std::unordered_map> m_zone_asset_creation_states; }; diff --git a/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.cpp b/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.cpp index 3574894f..5bded2c4 100644 --- a/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.cpp +++ b/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.cpp @@ -10,11 +10,11 @@ MenuConversionZoneState::MenuConversionZoneState() { } -void MenuConversionZoneState::SetZone(Zone* zone) +void MenuConversionZoneState::Inject(ZoneAssetCreationInjection& inject) { - auto* memory = zone->GetMemory(); + auto* memory = inject.m_zone.GetMemory(); - m_zone = zone; + m_zone = &inject.m_zone; m_supporting_data = memory->Create(); memset(m_supporting_data, 0, sizeof(ExpressionSupportingData)); } diff --git a/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.h b/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.h index b28ef3de..5c383604 100644 --- a/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.h +++ b/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.h @@ -24,7 +24,7 @@ namespace IW4 ExpressionSupportingData* m_supporting_data; MenuConversionZoneState(); - void SetZone(Zone* zone) override; + void Inject(ZoneAssetCreationInjection& inject) override; Statement_s* FindFunction(const std::string& functionName); diff --git a/src/ObjLoading/Game/IW5/Menu/MenuConversionZoneStateIW5.cpp b/src/ObjLoading/Game/IW5/Menu/MenuConversionZoneStateIW5.cpp index d6867359..89f23c85 100644 --- a/src/ObjLoading/Game/IW5/Menu/MenuConversionZoneStateIW5.cpp +++ b/src/ObjLoading/Game/IW5/Menu/MenuConversionZoneStateIW5.cpp @@ -10,11 +10,11 @@ MenuConversionZoneState::MenuConversionZoneState() { } -void MenuConversionZoneState::SetZone(Zone* zone) +void MenuConversionZoneState::Inject(ZoneAssetCreationInjection& inject) { - auto* memory = zone->GetMemory(); + auto* memory = inject.m_zone.GetMemory(); - m_zone = zone; + m_zone = &inject.m_zone; m_supporting_data = memory->Create(); memset(m_supporting_data, 0, sizeof(ExpressionSupportingData)); } diff --git a/src/ObjLoading/Game/IW5/Menu/MenuConversionZoneStateIW5.h b/src/ObjLoading/Game/IW5/Menu/MenuConversionZoneStateIW5.h index 4b2056ef..849300dd 100644 --- a/src/ObjLoading/Game/IW5/Menu/MenuConversionZoneStateIW5.h +++ b/src/ObjLoading/Game/IW5/Menu/MenuConversionZoneStateIW5.h @@ -24,7 +24,7 @@ namespace IW5 ExpressionSupportingData* m_supporting_data; MenuConversionZoneState(); - void SetZone(Zone* zone) override; + void Inject(ZoneAssetCreationInjection& inject) override; Statement_s* FindFunction(const std::string& functionName);