From 73d6d2bf5cad503fb808cbe9a22c786b9bfe8147 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 24 Mar 2024 01:20:49 +0100 Subject: [PATCH] feat: dump t6 WeaponCamo asset as json --- src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h | 55 +++++++++ src/ObjCommon/Json/JsonCommon.h | 33 +++++ .../T6/AssetDumpers/AssetDumperWeaponCamo.cpp | 23 ++++ .../T6/AssetDumpers/AssetDumperWeaponCamo.h | 14 +++ .../T6/WeaponCamo/JsonWeaponCamoWriter.cpp | 113 ++++++++++++++++++ .../Game/T6/WeaponCamo/JsonWeaponCamoWriter.h | 11 ++ src/ObjWriting/Game/T6/ZoneDumperT6.cpp | 3 +- 7 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h create mode 100644 src/ObjCommon/Json/JsonCommon.h create mode 100644 src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponCamo.cpp create mode 100644 src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponCamo.h create mode 100644 src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.cpp create mode 100644 src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.h diff --git a/src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h b/src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h new file mode 100644 index 00000000..6f473898 --- /dev/null +++ b/src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h @@ -0,0 +1,55 @@ +#pragma once + +#include "Game/T6/T6.h" + +#include "Json/JsonCommon.h" +#include "Json/JsonOptional.h" +#include +#include +#include +#include +#include + +namespace T6 +{ + class JsonWeaponCamoSet + { + public: + std::optional solidCamoImage; + std::optional patternCamoImage; + JsonVec2 patternOffset; + float patternScale; + }; + + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonWeaponCamoSet, solidCamoImage, patternCamoImage, patternOffset, patternScale); + + class JsonWeaponCamoMaterial + { + public: + unsigned replaceFlags; + std::vector baseMaterials; + std::vector camoMaterials; + std::array shaderConsts; + }; + + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonWeaponCamoMaterial, replaceFlags, baseMaterials, camoMaterials, shaderConsts); + + class JsonWeaponCamoMaterialSet + { + public: + std::vector materials; + }; + + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonWeaponCamoMaterialSet, materials); + + class JsonWeaponCamo + { + public: + std::optional solidBaseImage; + std::optional patternBaseImage; + std::vector camoSets; + std::vector camoMaterials; + }; + + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonWeaponCamo, solidBaseImage, patternBaseImage, camoSets, camoMaterials); +} // namespace T6 diff --git a/src/ObjCommon/Json/JsonCommon.h b/src/ObjCommon/Json/JsonCommon.h new file mode 100644 index 00000000..57df18d1 --- /dev/null +++ b/src/ObjCommon/Json/JsonCommon.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +class JsonVec2 +{ +public: + float x; + float y; +}; + +NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonVec2, x, y); + +class JsonVec3 +{ +public: + float x; + float y; + float z; +}; + +NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonVec3, x, y, z); + +class JsonVec4 +{ +public: + float x; + float y; + float z; + float w; +}; + +NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonVec4, x, y, z, w); diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponCamo.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponCamo.cpp new file mode 100644 index 00000000..4631e962 --- /dev/null +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponCamo.cpp @@ -0,0 +1,23 @@ +#include "AssetDumperWeaponCamo.h" + +#include "Game/T6/WeaponCamo/JsonWeaponCamoWriter.h" + +#include + +using namespace T6; + +bool AssetDumperWeaponCamo::ShouldDump(XAssetInfo* asset) +{ + return true; +} + +void AssetDumperWeaponCamo::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) +{ + const auto fileName = std::format("camo/{}.json", asset->m_name); + const auto assetFile = context.OpenAssetFile(fileName); + + if (!assetFile) + return; + + DumpWeaponCamoAsJson(*assetFile, asset->Asset()); +} diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponCamo.h b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponCamo.h new file mode 100644 index 00000000..36b2df92 --- /dev/null +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperWeaponCamo.h @@ -0,0 +1,14 @@ +#pragma once + +#include "Dumping/AbstractAssetDumper.h" +#include "Game/T6/T6.h" + +namespace T6 +{ + class AssetDumperWeaponCamo final : public AbstractAssetDumper + { + protected: + bool ShouldDump(XAssetInfo* asset) override; + void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) override; + }; +} // namespace T6 diff --git a/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.cpp b/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.cpp new file mode 100644 index 00000000..fc43824d --- /dev/null +++ b/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.cpp @@ -0,0 +1,113 @@ +#include "JsonWeaponCamoWriter.h" + +#include "Game/T6/CommonT6.h" +#include "Game/T6/Json/JsonWeaponCamo.h" + +#include +#include + +using namespace nlohmann; +using namespace T6; + +namespace +{ + class JsonDumper + { + public: + explicit JsonDumper(std::ostream& stream) + : m_stream(stream) + { + } + + void Dump(const WeaponCamo* weaponCamo) const + { + JsonWeaponCamo jsonWeaponCamo; + CreateJsonWeaponCamo(jsonWeaponCamo, *weaponCamo); + json jRoot = jsonWeaponCamo; + + jRoot["_type"] = "weaponCamo"; + jRoot["_version"] = 1; + + m_stream << std::setw(4) << jRoot << "\n"; + } + + private: + static const char* AssetName(const char* input) + { + if (input && input[0] == ',') + return &input[1]; + + return input; + } + + static void CreateJsonWeaponCamoSet(JsonWeaponCamoSet& jWeaponCamoSet, const WeaponCamoSet& weaponCamoSet) + { + if (weaponCamoSet.solidCamoImage && weaponCamoSet.solidCamoImage->name) + jWeaponCamoSet.solidCamoImage = AssetName(weaponCamoSet.solidCamoImage->name); + + if (weaponCamoSet.patternCamoImage && weaponCamoSet.patternCamoImage->name) + jWeaponCamoSet.patternCamoImage = AssetName(weaponCamoSet.patternCamoImage->name); + + jWeaponCamoSet.patternOffset.x = weaponCamoSet.patternOffset.x; + jWeaponCamoSet.patternOffset.y = weaponCamoSet.patternOffset.y; + jWeaponCamoSet.patternScale = weaponCamoSet.patternScale; + } + + static void CreateJsonWeaponCamoMaterial(JsonWeaponCamoMaterial& jWeaponCamoMaterial, const WeaponCamoMaterial& weaponCamoMaterial) + { + jWeaponCamoMaterial.replaceFlags = weaponCamoMaterial.replaceFlags; + + jWeaponCamoMaterial.baseMaterials.resize(weaponCamoMaterial.numBaseMaterials); + for (auto i = 0u; i < weaponCamoMaterial.numBaseMaterials; i++) + { + if (weaponCamoMaterial.baseMaterials[i] && weaponCamoMaterial.baseMaterials[i]->info.name) + jWeaponCamoMaterial.baseMaterials[i] = AssetName(weaponCamoMaterial.baseMaterials[i]->info.name); + } + + jWeaponCamoMaterial.camoMaterials.resize(weaponCamoMaterial.numBaseMaterials); + for (auto i = 0u; i < weaponCamoMaterial.numBaseMaterials; i++) + { + if (weaponCamoMaterial.camoMaterials[i] && weaponCamoMaterial.camoMaterials[i]->info.name) + jWeaponCamoMaterial.camoMaterials[i] = AssetName(weaponCamoMaterial.camoMaterials[i]->info.name); + } + + for (auto i = 0u; i < std::extent_v; i++) + jWeaponCamoMaterial.shaderConsts[i] = weaponCamoMaterial.shaderConsts[i]; + } + + static void CreateJsonWeaponCamoMaterialSet(JsonWeaponCamoMaterialSet& jWeaponCamoMaterialSet, const WeaponCamoMaterialSet& weaponCamoMaterialSet) + { + jWeaponCamoMaterialSet.materials.resize(weaponCamoMaterialSet.numMaterials); + for (auto i = 0u; i < weaponCamoMaterialSet.numMaterials; i++) + CreateJsonWeaponCamoMaterial(jWeaponCamoMaterialSet.materials[i], weaponCamoMaterialSet.materials[i]); + } + + static void CreateJsonWeaponCamo(JsonWeaponCamo& jWeaponCamo, const WeaponCamo& weaponCamo) + { + if (weaponCamo.solidBaseImage && weaponCamo.solidBaseImage->name) + jWeaponCamo.solidBaseImage = AssetName(weaponCamo.solidBaseImage->name); + + if (weaponCamo.patternBaseImage && weaponCamo.patternBaseImage->name) + jWeaponCamo.patternBaseImage = AssetName(weaponCamo.patternBaseImage->name); + + jWeaponCamo.camoSets.resize(weaponCamo.numCamoSets); + for (auto i = 0u; i < weaponCamo.numCamoSets; i++) + CreateJsonWeaponCamoSet(jWeaponCamo.camoSets[i], weaponCamo.camoSets[i]); + + jWeaponCamo.camoMaterials.resize(weaponCamo.numCamoMaterials); + for (auto i = 0u; i < weaponCamo.numCamoMaterials; i++) + CreateJsonWeaponCamoMaterialSet(jWeaponCamo.camoMaterials[i], weaponCamo.camoMaterials[i]); + } + + std::ostream& m_stream; + }; +} // namespace + +namespace T6 +{ + void DumpWeaponCamoAsJson(std::ostream& stream, const WeaponCamo* weaponCamo) + { + const JsonDumper dumper(stream); + dumper.Dump(weaponCamo); + } +} // namespace T6 diff --git a/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.h b/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.h new file mode 100644 index 00000000..0da45568 --- /dev/null +++ b/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Dumping/AssetDumpingContext.h" +#include "Game/T6/T6.h" + +#include + +namespace T6 +{ + void DumpWeaponCamoAsJson(std::ostream& stream, const WeaponCamo* weaponCamo); +} // namespace T6 diff --git a/src/ObjWriting/Game/T6/ZoneDumperT6.cpp b/src/ObjWriting/Game/T6/ZoneDumperT6.cpp index f187a109..f781a54d 100644 --- a/src/ObjWriting/Game/T6/ZoneDumperT6.cpp +++ b/src/ObjWriting/Game/T6/ZoneDumperT6.cpp @@ -19,6 +19,7 @@ #include "AssetDumpers/AssetDumperWeapon.h" #include "AssetDumpers/AssetDumperWeaponAttachment.h" #include "AssetDumpers/AssetDumperWeaponAttachmentUnique.h" +#include "AssetDumpers/AssetDumperWeaponCamo.h" #include "AssetDumpers/AssetDumperXModel.h" #include "AssetDumpers/AssetDumperZBarrier.h" #include "Game/T6/GameAssetPoolT6.h" @@ -68,7 +69,7 @@ bool ZoneDumper::DumpZone(AssetDumpingContext& context) const DUMP_ASSET_POOL(AssetDumperWeapon, m_weapon, ASSET_TYPE_WEAPON) DUMP_ASSET_POOL(AssetDumperWeaponAttachment, m_attachment, ASSET_TYPE_ATTACHMENT) DUMP_ASSET_POOL(AssetDumperWeaponAttachmentUnique, m_attachment_unique, ASSET_TYPE_ATTACHMENT_UNIQUE) - // DUMP_ASSET_POOL(AssetDumperWeaponCamo, m_camo, ASSET_TYPE_WEAPON_CAMO) + DUMP_ASSET_POOL(AssetDumperWeaponCamo, m_camo, ASSET_TYPE_WEAPON_CAMO) DUMP_ASSET_POOL(AssetDumperSndDriverGlobals, m_snd_driver_globals, ASSET_TYPE_SNDDRIVER_GLOBALS) // DUMP_ASSET_POOL(AssetDumperFxEffectDef, m_fx, ASSET_TYPE_FX) // DUMP_ASSET_POOL(AssetDumperFxImpactTable, m_fx_impact_table, ASSET_TYPE_IMPACT_FX)