#pragma once #include "AssetCreatorCollection.h" #include "AssetLoading/IZoneAssetLoaderState.h" #include "AssetRegistration.h" #include "Game/IAsset.h" #include "Pool/XAssetInfo.h" #include "Zone/AssetList/AssetList.h" #include "Zone/ZoneTypes.h" #include #include #include #include #include #include class AssetCreatorCollection; class IgnoredAssetLookup { public: explicit IgnoredAssetLookup(const AssetList& assetList); [[nodiscard]] bool IsAssetIgnored(asset_type_t assetType, const std::string& name) const; std::unordered_multimap m_ignored_asset_lookup; }; class AssetCreationContext { public: AssetCreationContext(Zone* zone, const AssetCreatorCollection* creators, const IgnoredAssetLookup* ignoredAssetLookup); template XAssetInfo* AddAsset(AssetRegistration registration) { static_assert(std::is_base_of_v); return static_cast*>(AddAssetGeneric(std::move(registration))); } XAssetInfoGeneric* AddAssetGeneric(GenericAssetRegistration registration) const; template XAssetInfo* LoadDependency(const std::string& assetName) { static_assert(std::is_base_of_v); return static_cast*>(LoadDependencyInternal(AssetType::EnumEntry, assetName)); } XAssetInfoGeneric* LoadDependencyGeneric(asset_type_t assetType, const std::string& assetName); template IndirectAssetReference LoadIndirectAssetReference(const std::string& assetName) { static_assert(std::is_base_of_v); return LoadIndirectAssetReferenceInternal(AssetType::EnumEntry, assetName); } IndirectAssetReference LoadIndirectAssetReferenceGeneric(asset_type_t assetType, const std::string& assetName); template T* GetZoneAssetLoaderState() { static_assert(std::is_base_of_v, "T must inherit IZoneAssetLoaderState"); // T must also have a public default constructor const auto foundEntry = m_zone_asset_loader_states.find(typeid(T)); if (foundEntry != m_zone_asset_loader_states.end()) return dynamic_cast(foundEntry->second.get()); auto newState = std::make_unique(); newState->SetZone(&m_zone); auto* newStatePtr = newState.get(); m_zone_asset_loader_states.emplace(std::make_pair>(typeid(T), std::move(newState))); return newStatePtr; } private: [[nodiscard]] XAssetInfoGeneric* LoadDefaultAssetDependency(asset_type_t assetType, const std::string& assetName) const; Zone* m_zone; const AssetCreatorCollection* m_creators; const IgnoredAssetLookup* m_ignored_asset_lookup; std::unordered_map> m_zone_asset_loader_states; };