From d05f4fd43eff3c670a87c88c5d091a87a3745765 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Wed, 30 Jul 2025 23:29:08 +0100 Subject: [PATCH] refactor: streamline tracer dumper --- src/ObjCommon/Tracer/TracerCommon.cpp | 11 +++ src/ObjCommon/Tracer/TracerCommon.h | 8 ++ .../Game/T6/Tracer/RawLoaderTracerT6.cpp | 4 +- src/ObjWriting/Game/IW4/ObjWriterIW4.cpp | 4 +- .../Game/IW4/Tracer/AssetDumperTracer.cpp | 79 ---------------- .../Game/IW4/Tracer/TracerDumperIW4.cpp | 84 +++++++++++++++++ ...{AssetDumperTracer.h => TracerDumperIW4.h} | 6 +- src/ObjWriting/Game/T6/ObjWriterT6.cpp | 4 +- .../Game/T6/Tracer/AssetDumperTracer.cpp | 87 ------------------ .../Game/T6/Tracer/TracerDumperT6.cpp | 92 +++++++++++++++++++ .../{AssetDumperTracer.h => TracerDumperT6.h} | 8 +- 11 files changed, 207 insertions(+), 180 deletions(-) create mode 100644 src/ObjCommon/Tracer/TracerCommon.cpp create mode 100644 src/ObjCommon/Tracer/TracerCommon.h delete mode 100644 src/ObjWriting/Game/IW4/Tracer/AssetDumperTracer.cpp create mode 100644 src/ObjWriting/Game/IW4/Tracer/TracerDumperIW4.cpp rename src/ObjWriting/Game/IW4/Tracer/{AssetDumperTracer.h => TracerDumperIW4.h} (66%) delete mode 100644 src/ObjWriting/Game/T6/Tracer/AssetDumperTracer.cpp create mode 100644 src/ObjWriting/Game/T6/Tracer/TracerDumperT6.cpp rename src/ObjWriting/Game/T6/Tracer/{AssetDumperTracer.h => TracerDumperT6.h} (62%) diff --git a/src/ObjCommon/Tracer/TracerCommon.cpp b/src/ObjCommon/Tracer/TracerCommon.cpp new file mode 100644 index 00000000..d48a0740 --- /dev/null +++ b/src/ObjCommon/Tracer/TracerCommon.cpp @@ -0,0 +1,11 @@ +#include "TracerCommon.h" + +#include + +namespace tracer +{ + std::string GetFileNameForAssetName(const std::string& assetName) + { + return std::format("tracer/{}", assetName); + } +} // namespace tracer diff --git a/src/ObjCommon/Tracer/TracerCommon.h b/src/ObjCommon/Tracer/TracerCommon.h new file mode 100644 index 00000000..d95136b7 --- /dev/null +++ b/src/ObjCommon/Tracer/TracerCommon.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +namespace tracer +{ + std::string GetFileNameForAssetName(const std::string& assetName); +} diff --git a/src/ObjLoading/Game/T6/Tracer/RawLoaderTracerT6.cpp b/src/ObjLoading/Game/T6/Tracer/RawLoaderTracerT6.cpp index 16eb7ea9..2361a4ed 100644 --- a/src/ObjLoading/Game/T6/Tracer/RawLoaderTracerT6.cpp +++ b/src/ObjLoading/Game/T6/Tracer/RawLoaderTracerT6.cpp @@ -4,12 +4,14 @@ #include "Game/T6/T6.h" #include "InfoString/InfoString.h" #include "InfoStringLoaderTracerT6.h" +#include "Tracer/TracerCommon.h" #include #include #include using namespace T6; +using namespace ::tracer; namespace { @@ -24,7 +26,7 @@ namespace AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override { - const auto fileName = std::format("tracer/{}", assetName); + const auto fileName = GetFileNameForAssetName(assetName); const auto file = m_search_path.Open(fileName); if (!file.IsOpen()) return AssetCreationResult::NoAction(); diff --git a/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp b/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp index 9bf0047c..858846f1 100644 --- a/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp +++ b/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp @@ -22,7 +22,7 @@ #include "StringTable/StringTableDumperIW4.h" #include "StructuredDataDef/AssetDumperStructuredDataDefSet.h" #include "Techset/TechsetDumperIW4.h" -#include "Tracer/AssetDumperTracer.h" +#include "Tracer/TracerDumperIW4.h" #include "Vehicle/AssetDumperVehicle.h" #include "Weapon/AssetDumperWeapon.h" @@ -74,7 +74,7 @@ bool ObjWriter::DumpZone(AssetDumpingContext& context) const DUMP_ASSET_POOL(string_table::Dumper, m_string_table, ASSET_TYPE_STRINGTABLE) DUMP_ASSET_POOL(leaderboard::JsonDumper, m_leaderboard, ASSET_TYPE_LEADERBOARD) DUMP_ASSET_POOL(AssetDumperStructuredDataDefSet, m_structed_data_def_set, ASSET_TYPE_STRUCTURED_DATA_DEF) - DUMP_ASSET_POOL(AssetDumperTracer, m_tracer, ASSET_TYPE_TRACER) + DUMP_ASSET_POOL(tracer::Dumper, m_tracer, ASSET_TYPE_TRACER) DUMP_ASSET_POOL(AssetDumperVehicle, m_vehicle, ASSET_TYPE_VEHICLE) DUMP_ASSET_POOL(addon_map_ents::Dumper, m_addon_map_ents, ASSET_TYPE_ADDON_MAP_ENTS) diff --git a/src/ObjWriting/Game/IW4/Tracer/AssetDumperTracer.cpp b/src/ObjWriting/Game/IW4/Tracer/AssetDumperTracer.cpp deleted file mode 100644 index 3a903ebc..00000000 --- a/src/ObjWriting/Game/IW4/Tracer/AssetDumperTracer.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "AssetDumperTracer.h" - -#include "Game/IW4/CommonIW4.h" -#include "Game/IW4/InfoString/InfoStringFromStructConverter.h" -#include "Game/IW4/ObjConstantsIW4.h" -#include "Game/IW4/Tracer/TracerFields.h" - -#include -#include -#include - -using namespace IW4; - -namespace IW4 -{ - class InfoStringFromTracerConverter final : public InfoStringFromStructConverter - { - protected: - void FillFromExtensionField(const cspField_t& field) override - { - assert(false); - } - - public: - InfoStringFromTracerConverter(const TracerDef* structure, - const cspField_t* fields, - const size_t fieldCount, - std::function scriptStringValueCallback) - : InfoStringFromStructConverter(structure, fields, fieldCount, std::move(scriptStringValueCallback)) - { - } - }; -} // namespace IW4 - -InfoString AssetDumperTracer::CreateInfoString(XAssetInfo* asset) -{ - InfoStringFromTracerConverter converter(asset->Asset(), - tracer_fields, - std::extent_v, - [asset](const scr_string_t scrStr) -> std::string - { - assert(scrStr < asset->m_zone->m_script_strings.Count()); - if (scrStr >= asset->m_zone->m_script_strings.Count()) - return ""; - - return asset->m_zone->m_script_strings[scrStr]; - }); - - return converter.Convert(); -} - -bool AssetDumperTracer::ShouldDump(XAssetInfo* asset) -{ - return true; -} - -void AssetDumperTracer::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) -{ - // Only dump raw when no gdt available - if (context.m_gdt) - { - const auto infoString = CreateInfoString(asset); - GdtEntry gdtEntry(asset->m_name, ObjConstants::GDF_FILENAME_TRACER); - infoString.ToGdtProperties(ObjConstants::INFO_STRING_PREFIX_TRACER, gdtEntry); - context.m_gdt->WriteEntry(gdtEntry); - } - else - { - const auto assetFile = context.OpenAssetFile("tracer/" + asset->m_name); - - if (!assetFile) - return; - - auto& stream = *assetFile; - const auto infoString = CreateInfoString(asset); - const auto stringValue = infoString.ToString(ObjConstants::INFO_STRING_PREFIX_TRACER); - stream.write(stringValue.c_str(), stringValue.size()); - } -} diff --git a/src/ObjWriting/Game/IW4/Tracer/TracerDumperIW4.cpp b/src/ObjWriting/Game/IW4/Tracer/TracerDumperIW4.cpp new file mode 100644 index 00000000..1cf1eb84 --- /dev/null +++ b/src/ObjWriting/Game/IW4/Tracer/TracerDumperIW4.cpp @@ -0,0 +1,84 @@ +#include "TracerDumperIW4.h" + +#include "Game/IW4/CommonIW4.h" +#include "Game/IW4/InfoString/InfoStringFromStructConverter.h" +#include "Game/IW4/ObjConstantsIW4.h" +#include "Game/IW4/Tracer/TracerFields.h" +#include "Tracer/TracerCommon.h" + +#include +#include +#include + +using namespace IW4; +using namespace ::tracer; + +namespace +{ + class InfoStringFromTracerConverter final : public InfoStringFromStructConverter + { + protected: + void FillFromExtensionField(const cspField_t& field) override + { + assert(false); + } + + public: + InfoStringFromTracerConverter(const TracerDef* structure, + const cspField_t* fields, + const size_t fieldCount, + std::function scriptStringValueCallback) + : InfoStringFromStructConverter(structure, fields, fieldCount, std::move(scriptStringValueCallback)) + { + } + }; + + InfoString CreateInfoString(XAssetInfo* asset) + { + InfoStringFromTracerConverter converter(asset->Asset(), + tracer_fields, + std::extent_v, + [asset](const scr_string_t scrStr) -> std::string + { + assert(scrStr < asset->m_zone->m_script_strings.Count()); + if (scrStr >= asset->m_zone->m_script_strings.Count()) + return ""; + + return asset->m_zone->m_script_strings[scrStr]; + }); + + return converter.Convert(); + } +} // namespace + +namespace IW4::tracer +{ + bool Dumper::ShouldDump(XAssetInfo* asset) + { + return true; + } + + void Dumper::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) + { + // Only dump raw when no gdt available + if (context.m_gdt) + { + const auto infoString = CreateInfoString(asset); + GdtEntry gdtEntry(asset->m_name, ObjConstants::GDF_FILENAME_TRACER); + infoString.ToGdtProperties(ObjConstants::INFO_STRING_PREFIX_TRACER, gdtEntry); + context.m_gdt->WriteEntry(gdtEntry); + } + else + { + const auto assetFile = context.OpenAssetFile(GetFileNameForAssetName(asset->m_name)); + + if (!assetFile) + return; + + auto& stream = *assetFile; + const auto infoString = CreateInfoString(asset); + const auto stringValue = infoString.ToString(ObjConstants::INFO_STRING_PREFIX_TRACER); + stream.write(stringValue.c_str(), stringValue.size()); + } + } +} // namespace IW4::tracer diff --git a/src/ObjWriting/Game/IW4/Tracer/AssetDumperTracer.h b/src/ObjWriting/Game/IW4/Tracer/TracerDumperIW4.h similarity index 66% rename from src/ObjWriting/Game/IW4/Tracer/AssetDumperTracer.h rename to src/ObjWriting/Game/IW4/Tracer/TracerDumperIW4.h index 6e32b860..b141a586 100644 --- a/src/ObjWriting/Game/IW4/Tracer/AssetDumperTracer.h +++ b/src/ObjWriting/Game/IW4/Tracer/TracerDumperIW4.h @@ -4,12 +4,10 @@ #include "Game/IW4/IW4.h" #include "InfoString/InfoString.h" -namespace IW4 +namespace IW4::tracer { - class AssetDumperTracer final : public AbstractAssetDumper + class Dumper final : public AbstractAssetDumper { - static InfoString CreateInfoString(XAssetInfo* asset); - protected: bool ShouldDump(XAssetInfo* asset) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) override; diff --git a/src/ObjWriting/Game/T6/ObjWriterT6.cpp b/src/ObjWriting/Game/T6/ObjWriterT6.cpp index 937ea121..3e89711e 100644 --- a/src/ObjWriting/Game/T6/ObjWriterT6.cpp +++ b/src/ObjWriting/Game/T6/ObjWriterT6.cpp @@ -19,7 +19,7 @@ #include "Sound/AssetDumperSndDriverGlobals.h" #include "StringTable/StringTableDumperT6.h" #include "Techset/TechsetDumperT6.h" -#include "Tracer/AssetDumperTracer.h" +#include "Tracer/TracerDumperT6.h" #include "Vehicle/AssetDumperVehicle.h" #include "Weapon/AssetDumperWeapon.h" #include "Weapon/AssetDumperWeaponAttachment.h" @@ -87,7 +87,7 @@ bool ObjWriter::DumpZone(AssetDumpingContext& context) const DUMP_ASSET_POOL(AssetDumperVehicle, m_vehicle, ASSET_TYPE_VEHICLEDEF) // DUMP_ASSET_POOL(AssetDumperMemoryBlock, m_memory_block, ASSET_TYPE_MEMORYBLOCK) // DUMP_ASSET_POOL(AssetDumperAddonMapEnts, m_addon_map_ents, ASSET_TYPE_ADDON_MAP_ENTS) - DUMP_ASSET_POOL(AssetDumperTracer, m_tracer, ASSET_TYPE_TRACER) + DUMP_ASSET_POOL(tracer::Dumper, m_tracer, ASSET_TYPE_TRACER) // DUMP_ASSET_POOL(AssetDumperSkinnedVertsDef, m_skinned_verts, ASSET_TYPE_SKINNEDVERTS) DUMP_ASSET_POOL(qdb::Dumper, m_qdb, ASSET_TYPE_QDB) DUMP_ASSET_POOL(slug::Dumper, m_slug, ASSET_TYPE_SLUG) diff --git a/src/ObjWriting/Game/T6/Tracer/AssetDumperTracer.cpp b/src/ObjWriting/Game/T6/Tracer/AssetDumperTracer.cpp deleted file mode 100644 index 0c87e4ee..00000000 --- a/src/ObjWriting/Game/T6/Tracer/AssetDumperTracer.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "AssetDumperTracer.h" - -#include "Game/T6/InfoString/InfoStringFromStructConverter.h" -#include "Game/T6/ObjConstantsT6.h" -#include "Game/T6/Tracer/TracerFields.h" - -#include -#include - -using namespace T6; - -namespace T6 -{ - class InfoStringFromTracerConverter final : public InfoStringFromStructConverter - { - protected: - void FillFromExtensionField(const cspField_t& field) override - { - switch (static_cast(field.iFieldType)) - { - case TFT_TRACERTYPE: - FillFromEnumInt(std::string(field.szName), field.iOffset, tracerTypeNames, std::extent_v); - break; - - case TFT_NUM_FIELD_TYPES: - default: - assert(false); - break; - } - } - - public: - InfoStringFromTracerConverter(const TracerDef* structure, - const cspField_t* fields, - const size_t fieldCount, - std::function scriptStringValueCallback) - : InfoStringFromStructConverter(structure, fields, fieldCount, std::move(scriptStringValueCallback)) - { - } - }; -} // namespace T6 - -InfoString AssetDumperTracer::CreateInfoString(XAssetInfo* asset) -{ - InfoStringFromTracerConverter converter(asset->Asset(), - tracer_fields, - std::extent_v, - [asset](const scr_string_t scrStr) -> std::string - { - assert(scrStr < asset->m_zone->m_script_strings.Count()); - if (scrStr >= asset->m_zone->m_script_strings.Count()) - return ""; - - return asset->m_zone->m_script_strings[scrStr]; - }); - - return converter.Convert(); -} - -bool AssetDumperTracer::ShouldDump(XAssetInfo* asset) -{ - return true; -} - -void AssetDumperTracer::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) -{ - // Only dump raw when no gdt available - if (context.m_gdt) - { - const auto infoString = CreateInfoString(asset); - GdtEntry gdtEntry(asset->m_name, ObjConstants::GDF_FILENAME_TRACER); - infoString.ToGdtProperties(ObjConstants::INFO_STRING_PREFIX_TRACER, gdtEntry); - context.m_gdt->WriteEntry(gdtEntry); - } - else - { - const auto assetFile = context.OpenAssetFile("tracer/" + asset->m_name); - - if (!assetFile) - return; - - auto& stream = *assetFile; - const auto infoString = CreateInfoString(asset); - const auto stringValue = infoString.ToString(ObjConstants::INFO_STRING_PREFIX_TRACER); - stream.write(stringValue.c_str(), stringValue.size()); - } -} diff --git a/src/ObjWriting/Game/T6/Tracer/TracerDumperT6.cpp b/src/ObjWriting/Game/T6/Tracer/TracerDumperT6.cpp new file mode 100644 index 00000000..6a3b1cab --- /dev/null +++ b/src/ObjWriting/Game/T6/Tracer/TracerDumperT6.cpp @@ -0,0 +1,92 @@ +#include "TracerDumperT6.h" + +#include "Game/T6/InfoString/InfoStringFromStructConverter.h" +#include "Game/T6/ObjConstantsT6.h" +#include "Game/T6/Tracer/TracerFields.h" +#include "Tracer/TracerCommon.h" + +#include +#include + +using namespace T6; +using namespace ::tracer; + +namespace +{ + class InfoStringFromTracerConverter final : public InfoStringFromStructConverter + { + protected: + void FillFromExtensionField(const cspField_t& field) override + { + switch (static_cast(field.iFieldType)) + { + case TFT_TRACERTYPE: + FillFromEnumInt(std::string(field.szName), field.iOffset, tracerTypeNames, std::extent_v); + break; + + case TFT_NUM_FIELD_TYPES: + default: + assert(false); + break; + } + } + + public: + InfoStringFromTracerConverter(const TracerDef* structure, + const cspField_t* fields, + const size_t fieldCount, + std::function scriptStringValueCallback) + : InfoStringFromStructConverter(structure, fields, fieldCount, std::move(scriptStringValueCallback)) + { + } + }; + + InfoString CreateInfoString(XAssetInfo* asset) + { + InfoStringFromTracerConverter converter(asset->Asset(), + tracer_fields, + std::extent_v, + [asset](const scr_string_t scrStr) -> std::string + { + assert(scrStr < asset->m_zone->m_script_strings.Count()); + if (scrStr >= asset->m_zone->m_script_strings.Count()) + return ""; + + return asset->m_zone->m_script_strings[scrStr]; + }); + + return converter.Convert(); + } +} // namespace + +namespace T6::tracer +{ + bool Dumper::ShouldDump(XAssetInfo* asset) + { + return true; + } + + void Dumper::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) + { + // Only dump raw when no gdt available + if (context.m_gdt) + { + const auto infoString = CreateInfoString(asset); + GdtEntry gdtEntry(asset->m_name, ObjConstants::GDF_FILENAME_TRACER); + infoString.ToGdtProperties(ObjConstants::INFO_STRING_PREFIX_TRACER, gdtEntry); + context.m_gdt->WriteEntry(gdtEntry); + } + else + { + const auto assetFile = context.OpenAssetFile(GetFileNameForAssetName(asset->m_name)); + + if (!assetFile) + return; + + auto& stream = *assetFile; + const auto infoString = CreateInfoString(asset); + const auto stringValue = infoString.ToString(ObjConstants::INFO_STRING_PREFIX_TRACER); + stream.write(stringValue.c_str(), stringValue.size()); + } + } +} // namespace T6::tracer diff --git a/src/ObjWriting/Game/T6/Tracer/AssetDumperTracer.h b/src/ObjWriting/Game/T6/Tracer/TracerDumperT6.h similarity index 62% rename from src/ObjWriting/Game/T6/Tracer/AssetDumperTracer.h rename to src/ObjWriting/Game/T6/Tracer/TracerDumperT6.h index 51c25c02..b3a54052 100644 --- a/src/ObjWriting/Game/T6/Tracer/AssetDumperTracer.h +++ b/src/ObjWriting/Game/T6/Tracer/TracerDumperT6.h @@ -4,14 +4,12 @@ #include "Game/T6/T6.h" #include "InfoString/InfoString.h" -namespace T6 +namespace T6::tracer { - class AssetDumperTracer final : public AbstractAssetDumper + class Dumper final : public AbstractAssetDumper { - static InfoString CreateInfoString(XAssetInfo* asset); - protected: bool ShouldDump(XAssetInfo* asset) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) override; }; -} // namespace T6 +} // namespace T6::tracer