diff --git a/src/Common/Game/T6/T6_Assets.h b/src/Common/Game/T6/T6_Assets.h index 3cc64a64..11e55fc0 100644 --- a/src/Common/Game/T6/T6_Assets.h +++ b/src/Common/Game/T6/T6_Assets.h @@ -6666,6 +6666,13 @@ namespace T6 const char* flameCooldownSound; }; + enum WeaponCamoMaterialFlags + { + WCM_REPLACE_COLOR = 0x1, + WCM_REPLACE_NORMAL = 0x2, + WCM_REPLACE_SPECULAR = 0x4, + }; + struct WeaponCamoMaterial { uint16_t replaceFlags; diff --git a/src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h b/src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h index 6f473898..d8d89f53 100644 --- a/src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h +++ b/src/ObjCommon/Game/T6/Json/JsonWeaponCamo.h @@ -23,16 +23,26 @@ namespace T6 NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonWeaponCamoSet, solidCamoImage, patternCamoImage, patternOffset, patternScale); + class JsonWeaponCamoMaterialOverride + { + public: + std::string baseMaterial; + std::string camoMaterial; + }; + + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonWeaponCamoMaterialOverride, baseMaterial, camoMaterial); + class JsonWeaponCamoMaterial { public: - unsigned replaceFlags; - std::vector baseMaterials; - std::vector camoMaterials; + bool useColorMap; + bool useNormalMap; + bool useSpecularMap; + std::vector materialOverrides; std::array shaderConsts; }; - NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonWeaponCamoMaterial, replaceFlags, baseMaterials, camoMaterials, shaderConsts); + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(JsonWeaponCamoMaterial, useColorMap, useNormalMap, useSpecularMap, materialOverrides, shaderConsts); class JsonWeaponCamoMaterialSet { diff --git a/src/ObjLoading/Game/T6/WeaponCamo/JsonWeaponCamoLoader.cpp b/src/ObjLoading/Game/T6/WeaponCamo/JsonWeaponCamoLoader.cpp index 9c527f21..f929540f 100644 --- a/src/ObjLoading/Game/T6/WeaponCamo/JsonWeaponCamoLoader.cpp +++ b/src/ObjLoading/Game/T6/WeaponCamo/JsonWeaponCamoLoader.cpp @@ -86,16 +86,15 @@ namespace WeaponCamoMaterial& weaponCamoMaterial, const WeaponCamo& weaponCamo) const { - weaponCamoMaterial.replaceFlags = static_cast(jWeaponCamoMaterial.replaceFlags); + if (jWeaponCamoMaterial.useColorMap) + weaponCamoMaterial.replaceFlags |= WCM_REPLACE_COLOR; + if (jWeaponCamoMaterial.useNormalMap) + weaponCamoMaterial.replaceFlags |= WCM_REPLACE_NORMAL; + if (jWeaponCamoMaterial.useSpecularMap) + weaponCamoMaterial.replaceFlags |= WCM_REPLACE_SPECULAR; - if (jWeaponCamoMaterial.baseMaterials.size() != jWeaponCamoMaterial.camoMaterials.size()) - { - PrintError(weaponCamo, "baseMaterials and camoMaterials arrays must have the same amount of entries"); - return false; - } - - weaponCamoMaterial.numBaseMaterials = static_cast(jWeaponCamoMaterial.baseMaterials.size()); - if (weaponCamoMaterial.numBaseMaterials > 0) + weaponCamoMaterial.numBaseMaterials = static_cast(jWeaponCamoMaterial.materialOverrides.size()); + if (!jWeaponCamoMaterial.materialOverrides.empty()) { weaponCamoMaterial.baseMaterials = static_cast(m_memory.Alloc(sizeof(Material*) * weaponCamoMaterial.numBaseMaterials)); weaponCamoMaterial.camoMaterials = static_cast(m_memory.Alloc(sizeof(Material*) * weaponCamoMaterial.numBaseMaterials)); @@ -104,10 +103,9 @@ namespace for (auto i = 0u; i < weaponCamoMaterial.numBaseMaterials; i++) { - auto* baseMaterial = - static_cast*>(m_manager.LoadDependency(ASSET_TYPE_MATERIAL, jWeaponCamoMaterial.baseMaterials[i])); - auto* camoMaterial = - static_cast*>(m_manager.LoadDependency(ASSET_TYPE_MATERIAL, jWeaponCamoMaterial.camoMaterials[i])); + const auto& materialOverride = jWeaponCamoMaterial.materialOverrides[i]; + auto* baseMaterial = static_cast*>(m_manager.LoadDependency(ASSET_TYPE_MATERIAL, materialOverride.baseMaterial)); + auto* camoMaterial = static_cast*>(m_manager.LoadDependency(ASSET_TYPE_MATERIAL, materialOverride.camoMaterial)); if (!baseMaterial) { diff --git a/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.cpp b/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.cpp index fc43824d..ad40d536 100644 --- a/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.cpp +++ b/src/ObjWriting/Game/T6/WeaponCamo/JsonWeaponCamoWriter.cpp @@ -55,20 +55,17 @@ namespace static void CreateJsonWeaponCamoMaterial(JsonWeaponCamoMaterial& jWeaponCamoMaterial, const WeaponCamoMaterial& weaponCamoMaterial) { - jWeaponCamoMaterial.replaceFlags = weaponCamoMaterial.replaceFlags; + jWeaponCamoMaterial.useColorMap = weaponCamoMaterial.replaceFlags & WCM_REPLACE_COLOR; + jWeaponCamoMaterial.useNormalMap = weaponCamoMaterial.replaceFlags & WCM_REPLACE_NORMAL; + jWeaponCamoMaterial.useSpecularMap = weaponCamoMaterial.replaceFlags & WCM_REPLACE_SPECULAR; - jWeaponCamoMaterial.baseMaterials.resize(weaponCamoMaterial.numBaseMaterials); + jWeaponCamoMaterial.materialOverrides.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++) - { + jWeaponCamoMaterial.materialOverrides[i].baseMaterial = AssetName(weaponCamoMaterial.baseMaterials[i]->info.name); if (weaponCamoMaterial.camoMaterials[i] && weaponCamoMaterial.camoMaterials[i]->info.name) - jWeaponCamoMaterial.camoMaterials[i] = AssetName(weaponCamoMaterial.camoMaterials[i]->info.name); + jWeaponCamoMaterial.materialOverrides[i].camoMaterial = AssetName(weaponCamoMaterial.camoMaterials[i]->info.name); } for (auto i = 0u; i < std::extent_v; i++)