From d9abf12b16a5586917cd6911b91365896afd7972 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 28 Mar 2021 10:20:24 +0200 Subject: [PATCH] Move unlinked gdt files to source_data and reference unlinked gdts in zone definition file --- src/Linker/LinkerArgs.h | 2 +- src/Unlinker/ContentLister/ZoneDefWriter.cpp | 13 ++++++++++--- src/Unlinker/ContentLister/ZoneDefWriter.h | 10 ++++++---- src/Unlinker/Game/IW4/ZoneDefWriterIW4.cpp | 4 ++-- src/Unlinker/Game/IW4/ZoneDefWriterIW4.h | 4 ++-- src/Unlinker/Game/T6/ZoneDefWriterT6.cpp | 5 ++--- src/Unlinker/Game/T6/ZoneDefWriterT6.h | 4 ++-- src/Unlinker/Unlinker.cpp | 14 +++++++++----- 8 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/Linker/LinkerArgs.h b/src/Linker/LinkerArgs.h index 60b040c1..b173231a 100644 --- a/src/Linker/LinkerArgs.h +++ b/src/Linker/LinkerArgs.h @@ -17,7 +17,7 @@ public: static constexpr const char* DEFAULT_BASE_FOLDER_MOD_TOOLS = ".."; static constexpr const char* DEFAULT_OUTPUT_FOLDER = "?base?/zone_out/?zone?"; static constexpr const char* DEFAULT_ASSET_SEARCH_PATH = "?base?/raw;?base?/zone_raw/?zone?"; - static constexpr const char* DEFAULT_GDT_SEARCH_PATH = "?base?/source_data"; + static constexpr const char* DEFAULT_GDT_SEARCH_PATH = "?base?/source_data;?base?/zone_raw/?zone?/source_data"; static constexpr const char* DEFAULT_SOURCE_SEARCH_PATH = "?base?/zone_source;?base?/zone_raw/?zone?/zone_source"; private: diff --git a/src/Unlinker/ContentLister/ZoneDefWriter.cpp b/src/Unlinker/ContentLister/ZoneDefWriter.cpp index 76168546..a7627d5a 100644 --- a/src/Unlinker/ContentLister/ZoneDefWriter.cpp +++ b/src/Unlinker/ContentLister/ZoneDefWriter.cpp @@ -1,6 +1,6 @@ #include "ZoneDefWriter.h" -void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, Zone* zone) const +void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const UnlinkerArgs* args, Zone* zone) const { ZoneDefinitionOutputStream out(stream); @@ -8,6 +8,13 @@ void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, Zone* zone) const out.WriteMetaData(META_DATA_KEY_GAME, zone->m_game->GetShortName()); out.EmptyLine(); - WriteMetaData(out, zone); - WriteContent(out, zone); + if(args->m_use_gdt) + { + out.WriteComment("Load asset gdt files"); + out.WriteMetaData(META_DATA_KEY_GDT, zone->m_name); + out.EmptyLine(); + } + + WriteMetaData(out, args, zone); + WriteContent(out, args, zone); } \ No newline at end of file diff --git a/src/Unlinker/ContentLister/ZoneDefWriter.h b/src/Unlinker/ContentLister/ZoneDefWriter.h index 50f12708..a3e86557 100644 --- a/src/Unlinker/ContentLister/ZoneDefWriter.h +++ b/src/Unlinker/ContentLister/ZoneDefWriter.h @@ -1,5 +1,6 @@ #pragma once +#include "UnlinkerArgs.h" #include "Zone/Zone.h" #include "Zone/Definition/ZoneDefinitionStream.h" @@ -14,17 +15,18 @@ public: IZoneDefWriter& operator=(IZoneDefWriter&& other) noexcept = default; virtual bool CanHandleZone(Zone* zone) const = 0; - virtual void WriteZoneDef(std::ostream& stream, Zone* zone) const = 0; + virtual void WriteZoneDef(std::ostream& stream, const UnlinkerArgs* args, Zone* zone) const = 0; }; class AbstractZoneDefWriter : public IZoneDefWriter { protected: static constexpr const char* META_DATA_KEY_GAME = "game"; + static constexpr const char* META_DATA_KEY_GDT = "gdt"; - virtual void WriteMetaData(ZoneDefinitionOutputStream& stream, Zone* zone) const = 0; - virtual void WriteContent(ZoneDefinitionOutputStream& stream, Zone* zone) const = 0; + virtual void WriteMetaData(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const = 0; + virtual void WriteContent(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const = 0; public: - void WriteZoneDef(std::ostream& stream, Zone* zone) const override; + void WriteZoneDef(std::ostream& stream, const UnlinkerArgs* args, Zone* zone) const override; }; \ No newline at end of file diff --git a/src/Unlinker/Game/IW4/ZoneDefWriterIW4.cpp b/src/Unlinker/Game/IW4/ZoneDefWriterIW4.cpp index 56c90076..76be5b7c 100644 --- a/src/Unlinker/Game/IW4/ZoneDefWriterIW4.cpp +++ b/src/Unlinker/Game/IW4/ZoneDefWriterIW4.cpp @@ -12,11 +12,11 @@ bool ZoneDefWriter::CanHandleZone(Zone* zone) const return zone->m_game == &g_GameIW4; } -void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, Zone* zone) const +void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const { } -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, Zone* zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const { const auto* pools = dynamic_cast(zone->m_pools.get()); diff --git a/src/Unlinker/Game/IW4/ZoneDefWriterIW4.h b/src/Unlinker/Game/IW4/ZoneDefWriterIW4.h index 60b6114f..6f9e1b82 100644 --- a/src/Unlinker/Game/IW4/ZoneDefWriterIW4.h +++ b/src/Unlinker/Game/IW4/ZoneDefWriterIW4.h @@ -7,8 +7,8 @@ namespace IW4 class ZoneDefWriter final : public AbstractZoneDefWriter { protected: - void WriteMetaData(::ZoneDefinitionOutputStream& stream, ::Zone* zone) const override; - void WriteContent(::ZoneDefinitionOutputStream& stream, ::Zone* zone) const override; + void WriteMetaData(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const override; public: bool CanHandleZone(Zone* zone) const override; diff --git a/src/Unlinker/Game/T6/ZoneDefWriterT6.cpp b/src/Unlinker/Game/T6/ZoneDefWriterT6.cpp index d5f197e3..0584cfbb 100644 --- a/src/Unlinker/Game/T6/ZoneDefWriterT6.cpp +++ b/src/Unlinker/Game/T6/ZoneDefWriterT6.cpp @@ -54,10 +54,9 @@ void ZoneDefWriter::WriteKeyValuePair(ZoneDefinitionOutputStream& stream, KeyVal stream.WriteMetaData(str.str(), kvp->value); } -void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, Zone* zone) const +void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const { auto* assetPoolT6 = dynamic_cast(zone->m_pools.get()); - if (assetPoolT6 && !assetPoolT6->m_key_value_pairs->m_asset_lookup.empty()) { for (const auto* kvpAsset : *assetPoolT6->m_key_value_pairs) @@ -73,7 +72,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, Zone* zone } } -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, Zone* zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const { const auto* pools = dynamic_cast(zone->m_pools.get()); diff --git a/src/Unlinker/Game/T6/ZoneDefWriterT6.h b/src/Unlinker/Game/T6/ZoneDefWriterT6.h index 95f7cd30..73c247d8 100644 --- a/src/Unlinker/Game/T6/ZoneDefWriterT6.h +++ b/src/Unlinker/Game/T6/ZoneDefWriterT6.h @@ -10,8 +10,8 @@ namespace T6 static void WriteKeyValuePair(ZoneDefinitionOutputStream& stream, KeyValuePair* kvp); protected: - void WriteMetaData(ZoneDefinitionOutputStream& stream, Zone* zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, Zone* zone) const override; + void WriteMetaData(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const UnlinkerArgs* args, Zone* zone) const override; public: bool CanHandleZone(Zone* zone) const override; diff --git a/src/Unlinker/Unlinker.cpp b/src/Unlinker/Unlinker.cpp index 425fe675..af6b6a48 100644 --- a/src/Unlinker/Unlinker.cpp +++ b/src/Unlinker/Unlinker.cpp @@ -152,7 +152,7 @@ class Unlinker::Impl return true; } - static bool WriteZoneDefinitionFile(Zone* zone, const fs::path& zoneDefinitionFileFolder) + bool WriteZoneDefinitionFile(Zone* zone, const fs::path& zoneDefinitionFileFolder) const { auto zoneDefinitionFilePath(zoneDefinitionFileFolder); zoneDefinitionFilePath.append(zone->m_name); @@ -170,7 +170,7 @@ class Unlinker::Impl { if (zoneDefWriter->CanHandleZone(zone)) { - zoneDefWriter->WriteZoneDef(zoneDefinitionFile, zone); + zoneDefWriter->WriteZoneDef(zoneDefinitionFile, &m_args, zone); result = true; break; } @@ -185,9 +185,13 @@ class Unlinker::Impl return result; } - static bool OpenGdtFile(Zone* zone, const fs::path& zoneDefinitionFileFolder, std::ofstream& stream) + static bool OpenGdtFile(Zone* zone, const fs::path& outputFolder, std::ofstream& stream) { - auto gdtFilePath(zoneDefinitionFileFolder); + auto gdtFilePath(outputFolder); + gdtFilePath.append("source_data"); + + fs::create_directories(gdtFilePath); + gdtFilePath.append(zone->m_name); gdtFilePath.replace_extension(".gdt"); @@ -232,7 +236,7 @@ class Unlinker::Impl if (m_args.m_use_gdt) { - if (!OpenGdtFile(zone, zoneDefinitionFileFolder, gdtStream)) + if (!OpenGdtFile(zone, outputFolderPath, gdtStream)) return false; auto gdt = std::make_unique(gdtStream); gdt->BeginStream();