From bb845f68e9155839f9d2578ae33ca1fa19157c6f Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 19 Oct 2024 12:41:20 +0200 Subject: [PATCH] chore: use IObjWriter directly instead of indirection of ObjWriting --- src/ObjWriting/Dumping/IZoneDumper.h | 17 ---------- .../{ZoneDumperIW3.cpp => ObjWriterIW3.cpp} | 10 ++---- src/ObjWriting/Game/IW3/ObjWriterIW3.h | 11 ++++++ src/ObjWriting/Game/IW3/ZoneDumperIW3.h | 12 ------- .../{ZoneDumperIW4.cpp => ObjWriterIW4.cpp} | 10 ++---- src/ObjWriting/Game/IW4/ObjWriterIW4.h | 11 ++++++ src/ObjWriting/Game/IW4/ZoneDumperIW4.h | 12 ------- .../{ZoneDumperIW5.cpp => ObjWriterIW5.cpp} | 10 ++---- src/ObjWriting/Game/IW5/ObjWriterIW5.h | 11 ++++++ src/ObjWriting/Game/IW5/ZoneDumperIW5.h | 12 ------- .../T5/{ZoneDumperT5.cpp => ObjWriterT5.cpp} | 10 ++---- src/ObjWriting/Game/T5/ObjWriterT5.h | 11 ++++++ src/ObjWriting/Game/T5/ZoneDumperT5.h | 12 ------- .../T6/{ZoneDumperT6.cpp => ObjWriterT6.cpp} | 10 ++---- src/ObjWriting/Game/T6/ObjWriterT6.h | 11 ++++++ src/ObjWriting/Game/T6/ZoneDumperT6.h | 12 ------- src/ObjWriting/IObjWriter.cpp | 27 +++++++++++++++ src/ObjWriting/IObjWriter.h | 18 ++++++++++ src/ObjWriting/ObjWriting.cpp | 34 ------------------- src/ObjWriting/ObjWriting.h | 1 - src/Unlinker/Unlinker.cpp | 12 ++++++- 21 files changed, 121 insertions(+), 153 deletions(-) delete mode 100644 src/ObjWriting/Dumping/IZoneDumper.h rename src/ObjWriting/Game/IW3/{ZoneDumperIW3.cpp => ObjWriterIW3.cpp} (93%) create mode 100644 src/ObjWriting/Game/IW3/ObjWriterIW3.h delete mode 100644 src/ObjWriting/Game/IW3/ZoneDumperIW3.h rename src/ObjWriting/Game/IW4/{ZoneDumperIW4.cpp => ObjWriterIW4.cpp} (95%) create mode 100644 src/ObjWriting/Game/IW4/ObjWriterIW4.h delete mode 100644 src/ObjWriting/Game/IW4/ZoneDumperIW4.h rename src/ObjWriting/Game/IW5/{ZoneDumperIW5.cpp => ObjWriterIW5.cpp} (95%) create mode 100644 src/ObjWriting/Game/IW5/ObjWriterIW5.h delete mode 100644 src/ObjWriting/Game/IW5/ZoneDumperIW5.h rename src/ObjWriting/Game/T5/{ZoneDumperT5.cpp => ObjWriterT5.cpp} (94%) create mode 100644 src/ObjWriting/Game/T5/ObjWriterT5.h delete mode 100644 src/ObjWriting/Game/T5/ZoneDumperT5.h rename src/ObjWriting/Game/T6/{ZoneDumperT6.cpp => ObjWriterT6.cpp} (96%) create mode 100644 src/ObjWriting/Game/T6/ObjWriterT6.h delete mode 100644 src/ObjWriting/Game/T6/ZoneDumperT6.h create mode 100644 src/ObjWriting/IObjWriter.cpp create mode 100644 src/ObjWriting/IObjWriter.h diff --git a/src/ObjWriting/Dumping/IZoneDumper.h b/src/ObjWriting/Dumping/IZoneDumper.h deleted file mode 100644 index 8b3a30a6..00000000 --- a/src/ObjWriting/Dumping/IZoneDumper.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "AssetDumpingContext.h" - -class IZoneDumper -{ -public: - IZoneDumper() = default; - virtual ~IZoneDumper() = default; - IZoneDumper(const IZoneDumper& other) = default; - IZoneDumper(IZoneDumper&& other) noexcept = default; - IZoneDumper& operator=(const IZoneDumper& other) = default; - IZoneDumper& operator=(IZoneDumper&& other) noexcept = default; - - virtual bool CanHandleZone(AssetDumpingContext& assetDumpingContext) const = 0; - virtual bool DumpZone(AssetDumpingContext& assetDumpingContext) const = 0; -}; diff --git a/src/ObjWriting/Game/IW3/ZoneDumperIW3.cpp b/src/ObjWriting/Game/IW3/ObjWriterIW3.cpp similarity index 93% rename from src/ObjWriting/Game/IW3/ZoneDumperIW3.cpp rename to src/ObjWriting/Game/IW3/ObjWriterIW3.cpp index 9424d8ce..997f5e72 100644 --- a/src/ObjWriting/Game/IW3/ZoneDumperIW3.cpp +++ b/src/ObjWriting/Game/IW3/ObjWriterIW3.cpp @@ -1,4 +1,4 @@ -#include "ZoneDumperIW3.h" +#include "ObjWriterIW3.h" #include "AssetDumpers/AssetDumperGfxImage.h" #include "AssetDumpers/AssetDumperLoadedSound.h" @@ -10,17 +10,11 @@ #include "AssetDumpers/AssetDumperWeapon.h" #include "AssetDumpers/AssetDumperXModel.h" #include "Game/IW3/GameAssetPoolIW3.h" -#include "Game/IW3/GameIW3.h" #include "ObjWriting.h" using namespace IW3; -bool ZoneDumper::CanHandleZone(AssetDumpingContext& context) const -{ - return context.m_zone->m_game == &g_GameIW3; -} - -bool ZoneDumper::DumpZone(AssetDumpingContext& context) const +bool ObjWriter::DumpZone(AssetDumpingContext& context) const { #define DUMP_ASSET_POOL(dumperType, poolName, assetType) \ if (assetPools->poolName && ObjWriting::ShouldHandleAssetType(assetType)) \ diff --git a/src/ObjWriting/Game/IW3/ObjWriterIW3.h b/src/ObjWriting/Game/IW3/ObjWriterIW3.h new file mode 100644 index 00000000..6e6bdbe4 --- /dev/null +++ b/src/ObjWriting/Game/IW3/ObjWriterIW3.h @@ -0,0 +1,11 @@ +#pragma once +#include "IObjWriter.h" + +namespace IW3 +{ + class ObjWriter final : public IObjWriter + { + public: + bool DumpZone(AssetDumpingContext& context) const override; + }; +} // namespace IW3 diff --git a/src/ObjWriting/Game/IW3/ZoneDumperIW3.h b/src/ObjWriting/Game/IW3/ZoneDumperIW3.h deleted file mode 100644 index 4e0aa6f3..00000000 --- a/src/ObjWriting/Game/IW3/ZoneDumperIW3.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "Dumping/IZoneDumper.h" - -namespace IW3 -{ - class ZoneDumper final : public IZoneDumper - { - public: - bool CanHandleZone(AssetDumpingContext& context) const override; - bool DumpZone(AssetDumpingContext& context) const override; - }; -} // namespace IW3 diff --git a/src/ObjWriting/Game/IW4/ZoneDumperIW4.cpp b/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp similarity index 95% rename from src/ObjWriting/Game/IW4/ZoneDumperIW4.cpp rename to src/ObjWriting/Game/IW4/ObjWriterIW4.cpp index 94aa8787..9e996b97 100644 --- a/src/ObjWriting/Game/IW4/ZoneDumperIW4.cpp +++ b/src/ObjWriting/Game/IW4/ObjWriterIW4.cpp @@ -1,4 +1,4 @@ -#include "ZoneDumperIW4.h" +#include "ObjWriterIW4.h" #include "AssetDumpers/AssetDumperAddonMapEnts.h" #include "AssetDumpers/AssetDumperGfxImage.h" @@ -23,17 +23,11 @@ #include "AssetDumpers/AssetDumperWeapon.h" #include "AssetDumpers/AssetDumperXModel.h" #include "Game/IW4/GameAssetPoolIW4.h" -#include "Game/IW4/GameIW4.h" #include "ObjWriting.h" using namespace IW4; -bool ZoneDumper::CanHandleZone(AssetDumpingContext& context) const -{ - return context.m_zone->m_game == &g_GameIW4; -} - -bool ZoneDumper::DumpZone(AssetDumpingContext& context) const +bool ObjWriter::DumpZone(AssetDumpingContext& context) const { #define DUMP_ASSET_POOL(dumperType, poolName, assetType) \ if (assetPools->poolName && ObjWriting::ShouldHandleAssetType(assetType)) \ diff --git a/src/ObjWriting/Game/IW4/ObjWriterIW4.h b/src/ObjWriting/Game/IW4/ObjWriterIW4.h new file mode 100644 index 00000000..4519fc44 --- /dev/null +++ b/src/ObjWriting/Game/IW4/ObjWriterIW4.h @@ -0,0 +1,11 @@ +#pragma once +#include "IObjWriter.h" + +namespace IW4 +{ + class ObjWriter final : public IObjWriter + { + public: + bool DumpZone(AssetDumpingContext& context) const override; + }; +} // namespace IW4 diff --git a/src/ObjWriting/Game/IW4/ZoneDumperIW4.h b/src/ObjWriting/Game/IW4/ZoneDumperIW4.h deleted file mode 100644 index bfc934d7..00000000 --- a/src/ObjWriting/Game/IW4/ZoneDumperIW4.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "Dumping/IZoneDumper.h" - -namespace IW4 -{ - class ZoneDumper final : public IZoneDumper - { - public: - bool CanHandleZone(AssetDumpingContext& context) const override; - bool DumpZone(AssetDumpingContext& context) const override; - }; -} // namespace IW4 diff --git a/src/ObjWriting/Game/IW5/ZoneDumperIW5.cpp b/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp similarity index 95% rename from src/ObjWriting/Game/IW5/ZoneDumperIW5.cpp rename to src/ObjWriting/Game/IW5/ObjWriterIW5.cpp index f102023c..e618dbcc 100644 --- a/src/ObjWriting/Game/IW5/ZoneDumperIW5.cpp +++ b/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp @@ -1,4 +1,4 @@ -#include "ZoneDumperIW5.h" +#include "ObjWriterIW5.h" #include "AssetDumpers/AssetDumperAddonMapEnts.h" #include "AssetDumpers/AssetDumperGfxImage.h" @@ -15,17 +15,11 @@ #include "AssetDumpers/AssetDumperWeaponAttachment.h" #include "AssetDumpers/AssetDumperXModel.h" #include "Game/IW5/GameAssetPoolIW5.h" -#include "Game/IW5/GameIW5.h" #include "ObjWriting.h" using namespace IW5; -bool ZoneDumper::CanHandleZone(AssetDumpingContext& context) const -{ - return context.m_zone->m_game == &g_GameIW5; -} - -bool ZoneDumper::DumpZone(AssetDumpingContext& context) const +bool ObjWriter::DumpZone(AssetDumpingContext& context) const { #define DUMP_ASSET_POOL(dumperType, poolName, assetType) \ if (assetPools->poolName && ObjWriting::ShouldHandleAssetType(assetType)) \ diff --git a/src/ObjWriting/Game/IW5/ObjWriterIW5.h b/src/ObjWriting/Game/IW5/ObjWriterIW5.h new file mode 100644 index 00000000..dd38ba5d --- /dev/null +++ b/src/ObjWriting/Game/IW5/ObjWriterIW5.h @@ -0,0 +1,11 @@ +#pragma once +#include "IObjWriter.h" + +namespace IW5 +{ + class ObjWriter final : public IObjWriter + { + public: + bool DumpZone(AssetDumpingContext& context) const override; + }; +} // namespace IW5 diff --git a/src/ObjWriting/Game/IW5/ZoneDumperIW5.h b/src/ObjWriting/Game/IW5/ZoneDumperIW5.h deleted file mode 100644 index e471fe11..00000000 --- a/src/ObjWriting/Game/IW5/ZoneDumperIW5.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "Dumping/IZoneDumper.h" - -namespace IW5 -{ - class ZoneDumper final : public IZoneDumper - { - public: - bool CanHandleZone(AssetDumpingContext& context) const override; - bool DumpZone(AssetDumpingContext& context) const override; - }; -} // namespace IW5 diff --git a/src/ObjWriting/Game/T5/ZoneDumperT5.cpp b/src/ObjWriting/Game/T5/ObjWriterT5.cpp similarity index 94% rename from src/ObjWriting/Game/T5/ZoneDumperT5.cpp rename to src/ObjWriting/Game/T5/ObjWriterT5.cpp index 891fb7c7..be552546 100644 --- a/src/ObjWriting/Game/T5/ZoneDumperT5.cpp +++ b/src/ObjWriting/Game/T5/ObjWriterT5.cpp @@ -1,4 +1,4 @@ -#include "ZoneDumperT5.h" +#include "ObjWriterT5.h" #include "AssetDumpers/AssetDumperGfxImage.h" #include "AssetDumpers/AssetDumperLocalizeEntry.h" @@ -10,17 +10,11 @@ #include "AssetDumpers/AssetDumperWeapon.h" #include "AssetDumpers/AssetDumperXModel.h" #include "Game/T5/GameAssetPoolT5.h" -#include "Game/T5/GameT5.h" #include "ObjWriting.h" using namespace T5; -bool ZoneDumper::CanHandleZone(AssetDumpingContext& context) const -{ - return context.m_zone->m_game == &g_GameT5; -} - -bool ZoneDumper::DumpZone(AssetDumpingContext& context) const +bool ObjWriter::DumpZone(AssetDumpingContext& context) const { #define DUMP_ASSET_POOL(dumperType, poolName, assetType) \ if (assetPools->poolName && ObjWriting::ShouldHandleAssetType(assetType)) \ diff --git a/src/ObjWriting/Game/T5/ObjWriterT5.h b/src/ObjWriting/Game/T5/ObjWriterT5.h new file mode 100644 index 00000000..1fa6971f --- /dev/null +++ b/src/ObjWriting/Game/T5/ObjWriterT5.h @@ -0,0 +1,11 @@ +#pragma once +#include "IObjWriter.h" + +namespace T5 +{ + class ObjWriter final : public IObjWriter + { + public: + bool DumpZone(AssetDumpingContext& context) const override; + }; +} // namespace T5 diff --git a/src/ObjWriting/Game/T5/ZoneDumperT5.h b/src/ObjWriting/Game/T5/ZoneDumperT5.h deleted file mode 100644 index 6e07068d..00000000 --- a/src/ObjWriting/Game/T5/ZoneDumperT5.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "Dumping/IZoneDumper.h" - -namespace T5 -{ - class ZoneDumper final : public IZoneDumper - { - public: - bool CanHandleZone(AssetDumpingContext& context) const override; - bool DumpZone(AssetDumpingContext& context) const override; - }; -} // namespace T5 diff --git a/src/ObjWriting/Game/T6/ZoneDumperT6.cpp b/src/ObjWriting/Game/T6/ObjWriterT6.cpp similarity index 96% rename from src/ObjWriting/Game/T6/ZoneDumperT6.cpp rename to src/ObjWriting/Game/T6/ObjWriterT6.cpp index 9fe2ba76..7f344eed 100644 --- a/src/ObjWriting/Game/T6/ZoneDumperT6.cpp +++ b/src/ObjWriting/Game/T6/ObjWriterT6.cpp @@ -1,4 +1,4 @@ -#include "ZoneDumperT6.h" +#include "ObjWriterT6.h" #include "AssetDumpers/AssetDumperFontIcon.h" #include "AssetDumpers/AssetDumperGfxImage.h" @@ -24,17 +24,11 @@ #include "AssetDumpers/AssetDumperXModel.h" #include "AssetDumpers/AssetDumperZBarrier.h" #include "Game/T6/GameAssetPoolT6.h" -#include "Game/T6/GameT6.h" #include "ObjWriting.h" using namespace T6; -bool ZoneDumper::CanHandleZone(AssetDumpingContext& context) const -{ - return context.m_zone->m_game == &g_GameT6; -} - -bool ZoneDumper::DumpZone(AssetDumpingContext& context) const +bool ObjWriter::DumpZone(AssetDumpingContext& context) const { #define DUMP_ASSET_POOL(dumperType, poolName, assetType) \ if (assetPools->poolName && ObjWriting::ShouldHandleAssetType(assetType)) \ diff --git a/src/ObjWriting/Game/T6/ObjWriterT6.h b/src/ObjWriting/Game/T6/ObjWriterT6.h new file mode 100644 index 00000000..e5290738 --- /dev/null +++ b/src/ObjWriting/Game/T6/ObjWriterT6.h @@ -0,0 +1,11 @@ +#pragma once +#include "IObjWriter.h" + +namespace T6 +{ + class ObjWriter final : public IObjWriter + { + public: + bool DumpZone(AssetDumpingContext& context) const override; + }; +} // namespace T6 diff --git a/src/ObjWriting/Game/T6/ZoneDumperT6.h b/src/ObjWriting/Game/T6/ZoneDumperT6.h deleted file mode 100644 index 908b3263..00000000 --- a/src/ObjWriting/Game/T6/ZoneDumperT6.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "Dumping/IZoneDumper.h" - -namespace T6 -{ - class ZoneDumper final : public IZoneDumper - { - public: - bool CanHandleZone(AssetDumpingContext& context) const override; - bool DumpZone(AssetDumpingContext& context) const override; - }; -} // namespace T6 diff --git a/src/ObjWriting/IObjWriter.cpp b/src/ObjWriting/IObjWriter.cpp new file mode 100644 index 00000000..685e7b4d --- /dev/null +++ b/src/ObjWriting/IObjWriter.cpp @@ -0,0 +1,27 @@ +#include "IObjWriter.h" + +#include "Game/IW3/ObjWriterIW3.h" +#include "Game/IW4/ObjWriterIW4.h" +#include "Game/IW5/ObjWriterIW5.h" +#include "Game/T5/ObjWriterT5.h" +#include "Game/T6/ObjWriterT6.h" + +#include + +const IObjWriter* IObjWriter::GetObjWriterForGame(GameId game) +{ + static const IObjWriter* zoneCreators[static_cast(GameId::COUNT)]{ + new IW3::ObjWriter(), + new IW4::ObjWriter(), + new IW5::ObjWriter(), + new T5::ObjWriter(), + new T6::ObjWriter(), + }; + static_assert(std::extent_v == static_cast(GameId::COUNT)); + + assert(static_cast(game) < static_cast(GameId::COUNT)); + const auto* result = zoneCreators[static_cast(game)]; + assert(result); + + return result; +} diff --git a/src/ObjWriting/IObjWriter.h b/src/ObjWriting/IObjWriter.h new file mode 100644 index 00000000..515d5f4f --- /dev/null +++ b/src/ObjWriting/IObjWriter.h @@ -0,0 +1,18 @@ +#pragma once + +#include "Dumping/AssetDumpingContext.h" + +class IObjWriter +{ +public: + IObjWriter() = default; + virtual ~IObjWriter() = default; + IObjWriter(const IObjWriter& other) = default; + IObjWriter(IObjWriter&& other) noexcept = default; + IObjWriter& operator=(const IObjWriter& other) = default; + IObjWriter& operator=(IObjWriter&& other) noexcept = default; + + virtual bool DumpZone(AssetDumpingContext& assetDumpingContext) const = 0; + + static const IObjWriter* GetObjWriterForGame(GameId game); +}; diff --git a/src/ObjWriting/ObjWriting.cpp b/src/ObjWriting/ObjWriting.cpp index 46627e65..8ecffa1b 100644 --- a/src/ObjWriting/ObjWriting.cpp +++ b/src/ObjWriting/ObjWriting.cpp @@ -1,41 +1,7 @@ #include "ObjWriting.h" -#include "Dumping/IZoneDumper.h" -#include "Game/IW3/ZoneDumperIW3.h" -#include "Game/IW4/ZoneDumperIW4.h" -#include "Game/IW5/ZoneDumperIW5.h" -#include "Game/T5/ZoneDumperT5.h" -#include "Game/T6/ZoneDumperT6.h" - ObjWriting::Configuration_t ObjWriting::Configuration; -const IZoneDumper* const ZONE_DUMPER[]{ - new IW3::ZoneDumper(), - new IW4::ZoneDumper(), - new IW5::ZoneDumper(), - new T5::ZoneDumper(), - new T6::ZoneDumper(), -}; - -bool ObjWriting::DumpZone(AssetDumpingContext& context) -{ - for (const auto* dumper : ZONE_DUMPER) - { - if (dumper->CanHandleZone(context)) - { - if (dumper->DumpZone(context)) - { - return true; - } - - printf("Dumper for zone '%s' failed!\n", context.m_zone->m_name.c_str()); - return false; - } - } - - return false; -} - bool ObjWriting::ShouldHandleAssetType(const asset_type_t assetType) { if (assetType < 0) diff --git a/src/ObjWriting/ObjWriting.h b/src/ObjWriting/ObjWriting.h index e8796b2b..b27beb25 100644 --- a/src/ObjWriting/ObjWriting.h +++ b/src/ObjWriting/ObjWriting.h @@ -34,6 +34,5 @@ public: } Configuration; - static bool DumpZone(AssetDumpingContext& context); static bool ShouldHandleAssetType(asset_type_t assetType); }; diff --git a/src/Unlinker/Unlinker.cpp b/src/Unlinker/Unlinker.cpp index c2ff656b..a4c5df9e 100644 --- a/src/Unlinker/Unlinker.cpp +++ b/src/Unlinker/Unlinker.cpp @@ -3,6 +3,7 @@ #include "ContentLister/ContentPrinter.h" #include "ContentLister/ZoneDefWriter.h" #include "IObjLoader.h" +#include "IObjWriter.h" #include "ObjContainer/IWD/IWD.h" #include "ObjLoading.h" #include "ObjWriting.h" @@ -288,13 +289,22 @@ private: } UpdateAssetIncludesAndExcludes(context); - ObjWriting::DumpZone(context); + + const auto* objWriter = IObjWriter::GetObjWriterForGame(zone.m_game->GetId()); + + auto result = objWriter->DumpZone(context); if (m_args.m_use_gdt) { context.m_gdt->EndStream(); gdtStream.close(); } + + if (!result) + { + std::cerr << "Dumping zone failed!\n"; + return false; + } } return true;