diff --git a/src/ObjLoading/Asset/AssetCreationContext.cpp b/src/ObjLoading/Asset/AssetCreationContext.cpp index 7624716c..268f7479 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.cpp +++ b/src/ObjLoading/Asset/AssetCreationContext.cpp @@ -104,7 +104,7 @@ XAssetInfoGeneric* AssetCreationContext::LoadDefaultAssetDependency(const asset_ return nullptr; } -XAssetInfoGeneric* AssetCreationContext::LoadDependencyGeneric(const asset_type_t assetType, const std::string& assetName) +XAssetInfoGeneric* AssetCreationContext::LoadDependencyGeneric(const asset_type_t assetType, const std::string& assetName, bool required) { auto* alreadyLoadedAsset = m_zone.m_pools->GetAssetOrAssetReference(assetType, assetName); if (alreadyLoadedAsset) @@ -131,7 +131,7 @@ XAssetInfoGeneric* AssetCreationContext::LoadDependencyGeneric(const asset_type_ con::error("Could not load asset \"{}\" of type \"{}\"", assetName, *m_zone.m_pools->GetAssetTypeName(assetType)); } - else + else if (required) { con::error("Missing asset \"{}\" of type \"{}\"", assetName, *m_zone.m_pools->GetAssetTypeName(assetType)); } diff --git a/src/ObjLoading/Asset/AssetCreationContext.h b/src/ObjLoading/Asset/AssetCreationContext.h index 59c00098..c83446c5 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.h +++ b/src/ObjLoading/Asset/AssetCreationContext.h @@ -54,7 +54,7 @@ public: return static_cast*>(LoadDependencyGeneric(AssetType::EnumEntry, assetName)); } - XAssetInfoGeneric* LoadDependencyGeneric(asset_type_t assetType, const std::string& assetName); + XAssetInfoGeneric* LoadDependencyGeneric(asset_type_t assetType, const std::string& assetName, bool required = true); template IndirectAssetReference LoadIndirectAssetReference(const std::string& assetName) { diff --git a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp index 5cd4ec2f..d812fb5e 100644 --- a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp +++ b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp @@ -11,19 +11,32 @@ GlobalAssetPoolsAssetStealer::GlobalAssetPoolsAssetStealer(GenericAssetRegistrat std::optional GlobalAssetPoolsAssetStealer::Visit_Dependency(const asset_type_t assetType, const char* assetName) { - auto assetNameToLoad = assetName; - if (assetNameToLoad && assetNameToLoad[0] == ',') - assetNameToLoad = &assetNameToLoad[1]; - - auto* newDependency = m_context.LoadDependencyGeneric(assetType, assetNameToLoad); - if (!newDependency) + if (assetName && assetName[0] == ',') { - m_failure = true; - return std::nullopt; + /* + Try to load the actual asset when the asset from the global asset pools just references one. + If that fails, keep the reference to not destroy previous existing behaviour of just being able to use assets from the global pools + without ignores. + */ + auto* nonReferenceAssetName = &assetName[1]; + + auto* assetDependency = m_context.LoadDependencyGeneric(assetType, nonReferenceAssetName, false); + if (assetDependency) + { + m_registration.AddDependency(assetDependency); + return assetDependency; + } } - m_registration.AddDependency(newDependency); - return newDependency; + auto* newDependency = m_context.LoadDependencyGeneric(assetType, assetName); + if (newDependency) + { + m_registration.AddDependency(newDependency); + return newDependency; + } + + m_failure = true; + return std::nullopt; } std::optional GlobalAssetPoolsAssetStealer::Visit_ScriptString(scr_string_t scriptString)