2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-12-27 12:31:50 +00:00

chore: adjust asset data when taking from global asset pools

This commit is contained in:
Jan Laupetin
2025-12-18 14:49:43 +00:00
parent 7bf7bf93de
commit 8eb79da8a2
14 changed files with 92 additions and 29 deletions

View File

@@ -0,0 +1,43 @@
#include "GlobalAssetPoolsLoader.h"
GlobalAssetPoolsAssetStealer::GlobalAssetPoolsAssetStealer(GenericAssetRegistration& registration, Zone& zone, Zone& foreignZone, AssetCreationContext& context)
: m_registration(registration),
m_zone(zone),
m_foreign_zone(foreignZone),
m_context(context),
m_failure(false)
{
}
std::optional<XAssetInfoGeneric*> 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)
{
m_failure = true;
return std::nullopt;
}
m_registration.AddDependency(newDependency);
return newDependency;
}
std::optional<scr_string_t> GlobalAssetPoolsAssetStealer::Visit_ScriptString(scr_string_t scriptString)
{
// Make sure any used script string is available in the created zone
return m_zone.m_script_strings.AddOrGetScriptString(m_foreign_zone.m_script_strings.CValue(scriptString));
}
void GlobalAssetPoolsAssetStealer::Visit_IndirectAssetRef(const asset_type_t assetType, const char* assetName)
{
m_registration.AddIndirectAssetReference(m_context.LoadIndirectAssetReferenceGeneric(assetType, assetName));
}
bool GlobalAssetPoolsAssetStealer::Failed() const
{
return m_failure;
}

View File

@@ -1,7 +1,30 @@
#pragma once
#include "Asset/IAssetCreator.h"
#include "Marking/AssetVisitor.h"
#include "Marking/BaseAssetMarker.h"
#include "Pool/GlobalAssetPool.h"
class GlobalAssetPoolsAssetStealer : public AssetVisitor
{
public:
GlobalAssetPoolsAssetStealer(GenericAssetRegistration& registration, Zone& zone, Zone& foreignZone, AssetCreationContext& context);
std::optional<XAssetInfoGeneric*> Visit_Dependency(asset_type_t assetType, const char* assetName) override;
std::optional<scr_string_t> Visit_ScriptString(scr_string_t scriptString) override;
void Visit_IndirectAssetRef(asset_type_t assetType, const char* assetName) override;
[[nodiscard]] bool Failed() const;
private:
GenericAssetRegistration& m_registration;
Zone& m_zone;
Zone& m_foreign_zone;
AssetCreationContext& m_context;
bool m_failure;
};
template<typename AssetType> class GlobalAssetPoolsLoader : public AssetCreator<AssetType>
{
public:
@@ -21,28 +44,12 @@ public:
AssetRegistration<AssetType> registration(assetName, existingAsset->Asset());
for (const auto* dependency : existingAsset->m_dependencies)
{
auto* newDependency = context.LoadDependencyGeneric(dependency->m_type, dependency->m_name);
if (newDependency)
registration.AddDependency(newDependency);
else
return AssetCreationResult::Failure();
}
for (const auto& indirectAssetReference : existingAsset->m_indirect_asset_references)
registration.AddIndirectAssetReference(context.LoadIndirectAssetReferenceGeneric(indirectAssetReference.m_type, indirectAssetReference.m_name));
// Make sure any used script string is available in the created zone
// The replacement of the scr_string_t values will be done upon writing
for (const auto scrString : existingAsset->m_used_script_strings)
m_zone.m_script_strings.AddOrGetScriptString(existingAsset->m_zone->m_script_strings.CValue(scrString));
GlobalAssetPoolsAssetStealer stealer(registration, m_zone, *existingAsset->m_zone, context);
AssetMarker<AssetType> marker(stealer);
marker.Mark(existingAsset->Asset());
auto* newAsset = context.AddAsset(std::move(registration));
// Make sure we remember this asset came from another zone
newAsset->m_zone = existingAsset->m_zone;
return AssetCreationResult::Success(newAsset);
}

View File

@@ -1,6 +1,7 @@
#include "ObjLoaderIW3.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/IW3/AssetMarkerIW3.h"
#include "Game/IW3/GameIW3.h"
#include "Game/IW3/IW3.h"
#include "Game/IW3/XModel/LoaderXModelIW3.h"
@@ -65,7 +66,7 @@ namespace
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSound>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSoundCurve>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetLoadedSound>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMap>>(zone));
// collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMap>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMapPvs>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetComWorld>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetGameWorldSp>>(zone));
@@ -78,7 +79,7 @@ namespace
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetMenu>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetLocalize>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetWeapon>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSoundDriverGlobals>>(zone));
// collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSoundDriverGlobals>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetFx>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetImpactFx>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetRawFile>>(zone));

View File

@@ -1,6 +1,7 @@
#include "ObjLoaderIW4.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/IW4/AssetMarkerIW4.h"
#include "Game/IW4/GameIW4.h"
#include "Game/IW4/IW4.h"
#include "Game/IW4/XModel/LoaderXModelIW4.h"
@@ -79,7 +80,7 @@ namespace
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetPhysPreset>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetPhysCollMap>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetXAnim>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetXModelSurfs>>(zone));
// collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetXModelSurfs>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetXModel>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetMaterial>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetPixelShader>>(zone));
@@ -90,7 +91,7 @@ namespace
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSound>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSoundCurve>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetLoadedSound>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMapSp>>(zone));
// collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMapSp>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMapMp>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetComWorld>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetGameWorldSp>>(zone));

View File

@@ -1,6 +1,7 @@
#include "ObjLoaderIW5.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/IW5/AssetMarkerIW5.h"
#include "Game/IW5/GameIW5.h"
#include "Game/IW5/IW5.h"
#include "Game/IW5/XModel/LoaderXModelIW5.h"

View File

@@ -1,6 +1,7 @@
#include "ObjLoaderT5.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/T5/AssetMarkerT5.h"
#include "Game/T5/GameT5.h"
#include "Game/T5/T5.h"
#include "Game/T5/XModel/LoaderXModelT5.h"
@@ -71,7 +72,7 @@ namespace
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetImage>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSoundBank>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSoundPatch>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMap>>(zone));
// collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMap>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMapPvs>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetComWorld>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetGameWorldSp>>(zone));

View File

@@ -3,6 +3,7 @@
#include "Asset/GlobalAssetPoolsLoader.h"
#include "FontIcon/CsvLoaderFontIconT6.h"
#include "FontIcon/JsonLoaderFontIconT6.h"
#include "Game/T6/AssetMarkerT6.h"
#include "Game/T6/CommonT6.h"
#include "Game/T6/GameAssetPoolT6.h"
#include "Game/T6/GameT6.h"
@@ -340,7 +341,7 @@ namespace T6
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetImage>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSoundBank>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetSoundPatch>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMap>>(zone));
// collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMap>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetClipMapPvs>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetComWorld>>(zone));
collection.AddAssetCreator(std::make_unique<GlobalAssetPoolsLoader<AssetGameWorldSp>>(zone));

View File

@@ -10,6 +10,7 @@ function ZoneCommon:include(includes)
ObjCommon:include(includes)
Parser:include(includes)
Cryptography:include(includes)
ZoneCode:include(includes)
end
end
@@ -21,6 +22,7 @@ function ZoneCommon:link(links)
links:linkto(Parser)
links:linkto(Utils)
links:linkto(lzx)
ZoneCode:use()
end
function ZoneCommon:use()

View File

@@ -10,7 +10,7 @@ class AssetVisitor
public:
virtual ~AssetVisitor() = default;
virtual std::optional<XAssetInfoGeneric> Visit_Dependency(asset_type_t assetType, const char* assetName)
virtual std::optional<XAssetInfoGeneric*> Visit_Dependency(asset_type_t assetType, const char* assetName)
{
// Do nothing by default
return std::nullopt;

View File

@@ -25,6 +25,9 @@ void BaseAssetMarker::MarkArray_ScriptString(scr_string_t* scriptStringArray, co
void BaseAssetMarker::Mark_IndirectAssetRef(const asset_type_t assetType, const char* assetName) const
{
if (!assetName)
return;
m_visitor.Visit_IndirectAssetRef(assetType, assetName);
}

View File

@@ -17,7 +17,7 @@ protected:
const auto result = m_visitor.Visit_Dependency(AssetType::EnumEntry, AssetName<AssetType>(*asset));
if (result.has_value())
asset = static_cast<std::add_pointer_t<typename AssetType::Type>>(result->m_ptr);
asset = static_cast<std::add_pointer_t<typename AssetType::Type>>((*result)->m_ptr);
}
void Mark_ScriptString(scr_string_t& scriptString) const;

View File

@@ -49,7 +49,7 @@ std::vector<IndirectAssetReference> AssetInfoCollector::GetIndirectAssetReferenc
return assetReferences;
}
std::optional<XAssetInfoGeneric> AssetInfoCollector::Visit_Dependency(const asset_type_t assetType, const char* assetName)
std::optional<XAssetInfoGeneric*> AssetInfoCollector::Visit_Dependency(const asset_type_t assetType, const char* assetName)
{
auto* assetInfo = m_zone.m_pools->GetAsset(assetType, assetName);
if (assetInfo == nullptr)

View File

@@ -18,7 +18,7 @@ public:
[[nodiscard]] std::vector<scr_string_t> GetUsedScriptStrings() const;
[[nodiscard]] std::vector<IndirectAssetReference> GetIndirectAssetReferences() const;
std::optional<XAssetInfoGeneric> Visit_Dependency(asset_type_t assetType, const char* assetName) override;
std::optional<XAssetInfoGeneric*> Visit_Dependency(asset_type_t assetType, const char* assetName) override;
std::optional<scr_string_t> Visit_ScriptString(scr_string_t scriptString) override;
void Visit_IndirectAssetRef(asset_type_t assetType, const char* assetName) override;

View File

@@ -17,6 +17,9 @@ scr_string_t AssetWriter::UseScriptString(const scr_string_t scrString) const
if (m_asset->m_zone == &m_zone)
return scrString;
// This swap should have already been performed in GlobalAssetPoolsLoader
assert(false);
const auto strValue = m_asset->m_zone->m_script_strings.CValue(scrString);
return m_zone.m_script_strings.GetScriptString(strValue);
}