diff --git a/src/ObjCommon/Game/T6/Material/JsonMaterial.h b/src/ObjCommon/Game/T6/Json/JsonMaterial.h similarity index 99% rename from src/ObjCommon/Game/T6/Material/JsonMaterial.h rename to src/ObjCommon/Game/T6/Json/JsonMaterial.h index b5fd2ae9..83762f74 100644 --- a/src/ObjCommon/Game/T6/Material/JsonMaterial.h +++ b/src/ObjCommon/Game/T6/Json/JsonMaterial.h @@ -1,8 +1,8 @@ #pragma once #include "Game/T6/T6.h" -#include "Utils/JsonOptional.h" +#include "Json/JsonOptional.h" #include #include #include 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/Game/T6/Material/JsonMaterial.cpp b/src/ObjCommon/Game/T6/Material/JsonMaterial.cpp deleted file mode 100644 index e69de29b..00000000 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/ObjCommon/Utils/JsonOptional.h b/src/ObjCommon/Json/JsonOptional.h similarity index 100% rename from src/ObjCommon/Utils/JsonOptional.h rename to src/ObjCommon/Json/JsonOptional.h diff --git a/src/ObjLoading/Game/T6/Material/JsonMaterialLoader.cpp b/src/ObjLoading/Game/T6/Material/JsonMaterialLoader.cpp index 16975cd8..db3d8f61 100644 --- a/src/ObjLoading/Game/T6/Material/JsonMaterialLoader.cpp +++ b/src/ObjLoading/Game/T6/Material/JsonMaterialLoader.cpp @@ -1,7 +1,7 @@ #include "JsonMaterialLoader.h" #include "Game/T6/CommonT6.h" -#include "Game/T6/Material/JsonMaterial.h" +#include "Game/T6/Json/JsonMaterial.h" #include #include 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/Material/JsonMaterialWriter.cpp b/src/ObjWriting/Game/T6/Material/JsonMaterialWriter.cpp index c31b075c..75075265 100644 --- a/src/ObjWriting/Game/T6/Material/JsonMaterialWriter.cpp +++ b/src/ObjWriting/Game/T6/Material/JsonMaterialWriter.cpp @@ -1,15 +1,16 @@ #include "JsonMaterialWriter.h" #include "Game/T6/CommonT6.h" -#include "Game/T6/Material/JsonMaterial.h" +#include "Game/T6/Json/JsonMaterial.h" #include "MaterialConstantZoneState.h" #include #include using namespace nlohmann; +using namespace T6; -namespace T6 +namespace { class JsonDumper { @@ -236,7 +237,10 @@ namespace T6 std::ostream& m_stream; const MaterialConstantZoneState& m_material_constants; }; +} // namespace +namespace T6 +{ void DumpMaterialAsJson(std::ostream& stream, const Material* material, AssetDumpingContext& context) { const JsonDumper dumper(context, stream); 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)