From 0cbf234fafdb037c48858590f137c8d7cf18b5fb Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 23 Jul 2022 14:33:27 +0200 Subject: [PATCH] Use string constants for material loading --- src/ObjCommon/Game/IW4/MaterialConstantsIW4.h | 169 +++++++++++++++--- .../IW4/AssetLoaders/AssetLoaderMaterial.cpp | 76 ++++---- .../IW4/AssetDumpers/AssetDumperMaterial.cpp | 81 +-------- 3 files changed, 190 insertions(+), 136 deletions(-) diff --git a/src/ObjCommon/Game/IW4/MaterialConstantsIW4.h b/src/ObjCommon/Game/IW4/MaterialConstantsIW4.h index 237380b5..56309bcc 100644 --- a/src/ObjCommon/Game/IW4/MaterialConstantsIW4.h +++ b/src/ObjCommon/Game/IW4/MaterialConstantsIW4.h @@ -362,22 +362,107 @@ namespace IW4 }; static_assert(std::extent_v == static_cast(StencilOp_e::COUNT)); + enum GdtMaterialType + { + MATERIAL_TYPE_UNKNOWN, + MATERIAL_TYPE_2D, + MATERIAL_TYPE_CUSTOM, + MATERIAL_TYPE_DISTORTION, + MATERIAL_TYPE_EFFECT, + MATERIAL_TYPE_IMPACT_MARK, + MATERIAL_TYPE_MODEL_AMBIENT, + MATERIAL_TYPE_MODEL_PHONG, + MATERIAL_TYPE_MODEL_UNLIT, + MATERIAL_TYPE_OBJECTIVE, + MATERIAL_TYPE_PARTICLE_CLOUD, + MATERIAL_TYPE_SKY, + MATERIAL_TYPE_TOOLS, + MATERIAL_TYPE_UNLIT, + MATERIAL_TYPE_WATER, + MATERIAL_TYPE_WORLD_PHONG, + MATERIAL_TYPE_WORLD_UNLIT, + + MATERIAL_TYPE_COUNT + }; + + constexpr auto GDT_MATERIAL_TYPE_UNKNOWN = ""; + constexpr auto GDT_MATERIAL_TYPE_2D = "2d"; + constexpr auto GDT_MATERIAL_TYPE_CUSTOM = "custom"; + constexpr auto GDT_MATERIAL_TYPE_DISTORTION = "distortion"; + constexpr auto GDT_MATERIAL_TYPE_EFFECT = "effect"; + constexpr auto GDT_MATERIAL_TYPE_IMPACT_MARK = "impact mark"; + constexpr auto GDT_MATERIAL_TYPE_MODEL_AMBIENT = "model ambient"; + constexpr auto GDT_MATERIAL_TYPE_MODEL_PHONG = "model phong"; + constexpr auto GDT_MATERIAL_TYPE_MODEL_UNLIT = "model unlit"; + constexpr auto GDT_MATERIAL_TYPE_OBJECTIVE = "objective"; + constexpr auto GDT_MATERIAL_TYPE_PARTICLE_CLOUD = "particle cloud"; + constexpr auto GDT_MATERIAL_TYPE_SKY = "sky"; + constexpr auto GDT_MATERIAL_TYPE_TOOLS = "tools"; + constexpr auto GDT_MATERIAL_TYPE_UNLIT = "unlit"; + constexpr auto GDT_MATERIAL_TYPE_WATER = "water"; + constexpr auto GDT_MATERIAL_TYPE_WORLD_PHONG = "world phong"; + constexpr auto GDT_MATERIAL_TYPE_WORLD_UNLIT = "world unlit"; + + inline const char* GdtMaterialTypeNames[] + { + GDT_MATERIAL_TYPE_UNKNOWN, + GDT_MATERIAL_TYPE_2D, + GDT_MATERIAL_TYPE_CUSTOM, + GDT_MATERIAL_TYPE_DISTORTION, + GDT_MATERIAL_TYPE_EFFECT, + GDT_MATERIAL_TYPE_IMPACT_MARK, + GDT_MATERIAL_TYPE_MODEL_AMBIENT, + GDT_MATERIAL_TYPE_MODEL_PHONG, + GDT_MATERIAL_TYPE_MODEL_UNLIT, + GDT_MATERIAL_TYPE_OBJECTIVE, + GDT_MATERIAL_TYPE_PARTICLE_CLOUD, + GDT_MATERIAL_TYPE_SKY, + GDT_MATERIAL_TYPE_TOOLS, + GDT_MATERIAL_TYPE_UNLIT, + GDT_MATERIAL_TYPE_WATER, + GDT_MATERIAL_TYPE_WORLD_PHONG, + GDT_MATERIAL_TYPE_WORLD_UNLIT + }; + static_assert(std::extent_v == static_cast(MATERIAL_TYPE_COUNT)); + + constexpr auto GDT_SORTKEY_OPAQUE_AMBIENT = "opaque ambient"; + constexpr auto GDT_SORTKEY_OPAQUE = "opaque"; + constexpr auto GDT_SORTKEY_SKY = "sky"; + constexpr auto GDT_SORTKEY_SKYBOX = "skybox"; + constexpr auto GDT_SORTKEY_DECAL_BOTTOM_1 = "decal - bottom 1"; + constexpr auto GDT_SORTKEY_DECAL_BOTTOM_2 = "decal - bottom 2"; + constexpr auto GDT_SORTKEY_DECAL_BOTTOM_3 = "decal - bottom 3"; + constexpr auto GDT_SORTKEY_DECAL_STATIC = "decal - static decal"; + constexpr auto GDT_SORTKEY_DECAL_MIDDLE_1 = "decal - middle 1"; + constexpr auto GDT_SORTKEY_DECAL_MIDDLE_2 = "decal - middle 2"; + constexpr auto GDT_SORTKEY_DECAL_MIDDLE_3 = "decal - middle 3"; + constexpr auto GDT_SORTKEY_DECAL_WEAPON_IMPACT = "decal - weapon impact"; + constexpr auto GDT_SORTKEY_WINDOW_INSIDE = "window inside"; + constexpr auto GDT_SORTKEY_WINDOW_OUTSIDE = "window outside"; + constexpr auto GDT_SORTKEY_DISTORTION = "distortion"; + constexpr auto GDT_SORTKEY_BLEND_ADDITIVE = "blend / additive"; + constexpr auto GDT_SORTKEY_EFFECT_AUTO_SORT = "effect - auto sort"; + constexpr auto GDT_SORTKEY_AFTER_EFFECT_BOTTOM = "after effects - bottom"; + constexpr auto GDT_SORTKEY_AFTER_EFFECT_MIDDLE = "after effects - middle"; + constexpr auto GDT_SORTKEY_AFTER_EFFECT_TOP = "after effects - top"; + constexpr auto GDT_SORTKEY_VIEWMODEL_EFFECT = "viewmodel effect"; + inline const char* SortKeyNames[] { - "opaque ambient", // 0 - "opaque", // 1 - "sky", // 2 - "skybox", // 3 + GDT_SORTKEY_OPAQUE_AMBIENT, // 0 + GDT_SORTKEY_OPAQUE, // 1 + GDT_SORTKEY_SKY, // 2 + GDT_SORTKEY_SKYBOX, // 3 "?", // 4 "?", // 5 - "decal - bottom 1", // 6 - "decal - bottom 2", // 7 - "decal - bottom 3", // 8 - "decal - static decal", // 9 - "decal - middle 1", // 10 - "decal - middle 2", // 11 - "decal - middle 3", // 12 - "decal - weapon impact", // 13 + GDT_SORTKEY_DECAL_BOTTOM_1, // 6 + GDT_SORTKEY_DECAL_BOTTOM_2, // 7 + GDT_SORTKEY_DECAL_BOTTOM_3, // 8 + GDT_SORTKEY_DECAL_STATIC, // 9 + GDT_SORTKEY_DECAL_MIDDLE_1, // 10 + GDT_SORTKEY_DECAL_MIDDLE_2, // 11 + GDT_SORTKEY_DECAL_MIDDLE_3, // 12 + GDT_SORTKEY_DECAL_WEAPON_IMPACT, // 13 "?", // 14 "?", // 15 "?", // 16 @@ -388,8 +473,8 @@ namespace IW4 "?", // 21 "-", // 22 "-", // 23 - "window inside", // 24 - "window outside", // 25 + GDT_SORTKEY_WINDOW_INSIDE, // 24 + GDT_SORTKEY_WINDOW_OUTSIDE, // 25 "?", // 26 "?", // 27 "?", // 28 @@ -407,17 +492,59 @@ namespace IW4 "?", // 40 "?", // 41 "?", // 42 - "distortion", // 43 + GDT_SORTKEY_DISTORTION, // 43 "?", // 44 "?", // 45 "-", // 46 - "blend / additive", // 47 - "effect - auto sort", // 48 - "after effects - bottom", // 49 - "after effects - middle", // 50 - "after effects - top", // 51 + GDT_SORTKEY_BLEND_ADDITIVE, // 47 + GDT_SORTKEY_EFFECT_AUTO_SORT, // 48 + GDT_SORTKEY_AFTER_EFFECT_BOTTOM, // 49 + GDT_SORTKEY_AFTER_EFFECT_MIDDLE, // 50 + GDT_SORTKEY_AFTER_EFFECT_TOP, // 51 "-", // 52 - "viewmodel effect", // 53 + GDT_SORTKEY_VIEWMODEL_EFFECT, // 53 }; static_assert(std::extent_v == static_cast(SORTKEY_MAX)); + + enum GdtCustomMaterialTypes + { + CUSTOM_MATERIAL_TYPE_NONE, + // Uses custom techset with generic options + CUSTOM_MATERIAL_TYPE_CUSTOM, + CUSTOM_MATERIAL_TYPE_PHONG_FLAG, + CUSTOM_MATERIAL_TYPE_GRAIN_OVERLAY, + CUSTOM_MATERIAL_TYPE_EFFECT_EYE_OFFSET, + CUSTOM_MATERIAL_TYPE_REFLEX_SIGHT, + CUSTOM_MATERIAL_TYPE_SHADOW_CLEAR, + CUSTOM_MATERIAL_TYPE_SHADOW_OVERLAY, + + // Not part of IW3 + CUSTOM_MATERIAL_TYPE_SPLATTER, + + CUSTOM_MATERIAL_TYPE_COUNT + }; + + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_NONE = ""; + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_CUSTOM = "mtl_custom"; + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_PHONG_FLAG = "mtl_phong_flag"; + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_GRAIN_OVERLAY = "mtl_grain_overlay"; + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_EFFECT_EYE_OFFSET = "mtl_effect_eyeoffset"; + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_REFLEXSIGHT = "mtl_reflexsight"; + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_SHADOWCLEAR = "mtl_shadowclear"; + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_SHADOWOVERLAY = "mtl_shadowoverlay"; + constexpr auto GDT_CUSTOM_MATERIAL_TYPE_SPLATTER = "mtl_splatter"; + + inline const char* GdtCustomMaterialTypeNames[] + { + GDT_CUSTOM_MATERIAL_TYPE_NONE, + GDT_CUSTOM_MATERIAL_TYPE_CUSTOM, + GDT_CUSTOM_MATERIAL_TYPE_PHONG_FLAG, + GDT_CUSTOM_MATERIAL_TYPE_GRAIN_OVERLAY, + GDT_CUSTOM_MATERIAL_TYPE_EFFECT_EYE_OFFSET, + GDT_CUSTOM_MATERIAL_TYPE_REFLEXSIGHT, + GDT_CUSTOM_MATERIAL_TYPE_SHADOWCLEAR, + GDT_CUSTOM_MATERIAL_TYPE_SHADOWOVERLAY, + GDT_CUSTOM_MATERIAL_TYPE_SPLATTER + }; + static_assert(std::extent_v == static_cast(CUSTOM_MATERIAL_TYPE_COUNT)); } diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp index a3876390..c7f499bf 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp @@ -54,55 +54,58 @@ namespace IW4 { const auto materialType = ReadStringProperty("materialType"); - if (materialType == "model phong" || materialType == "world phong" || materialType == "impact mark") + if (materialType == GDT_MATERIAL_TYPE_MODEL_PHONG + || materialType == GDT_MATERIAL_TYPE_WORLD_PHONG + || materialType == GDT_MATERIAL_TYPE_IMPACT_MARK) { mtl_phong_template(); } - else if (materialType == "model ambient") + else if (materialType == GDT_MATERIAL_TYPE_MODEL_AMBIENT) { mtl_ambient_template(); } - else if (materialType == "2d") + else if (materialType == GDT_MATERIAL_TYPE_2D) { mtl_2d_template(); } - else if (materialType == "model unlit" || materialType == "world unlit") + else if (materialType == GDT_MATERIAL_TYPE_MODEL_UNLIT + || materialType == GDT_MATERIAL_TYPE_WORLD_UNLIT) { mtl_unlit_template(); } - else if (materialType == "unlit") + else if (materialType == GDT_MATERIAL_TYPE_UNLIT) { mtl_unlit_deprecated_template(); } - else if (materialType == "effect") + else if (materialType == GDT_MATERIAL_TYPE_EFFECT) { mtl_effect_template(); } - else if (materialType == "distortion") + else if (materialType == GDT_MATERIAL_TYPE_DISTORTION) { mtl_distortion_template(); } - else if (materialType == "particle cloud") + else if (materialType == GDT_MATERIAL_TYPE_PARTICLE_CLOUD) { mtl_particlecloud_template(); } - else if (materialType == "tools") + else if (materialType == GDT_MATERIAL_TYPE_TOOLS) { mtl_tools_template(); } - else if (materialType == "sky") + else if (materialType == GDT_MATERIAL_TYPE_SKY) { mtl_sky_template(); } - else if (materialType == "water") + else if (materialType == GDT_MATERIAL_TYPE_WATER) { mtl_water_template(); } - else if (materialType == "objective") + else if (materialType == GDT_MATERIAL_TYPE_OBJECTIVE) { mtl_objective_template(); } - else if (materialType == "custom") + else if (materialType == GDT_MATERIAL_TYPE_CUSTOM) { custom_template(); } @@ -176,35 +179,35 @@ namespace IW4 { const auto customTemplate = ReadStringProperty("customTemplate"); - if (customTemplate == "mtl_custom") + if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_CUSTOM) { mtl_custom_template(); } - else if (customTemplate == "mtl_phong_flag") + else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_PHONG_FLAG) { mtl_phong_flag_template(); } - else if (customTemplate == "mtl_grain_overlay") + else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_GRAIN_OVERLAY) { mtl_grain_overlay_template(); } - else if (customTemplate == "mtl_effect_eyeoffset") + else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_EFFECT_EYE_OFFSET) { mtl_effect_eyeoffset_template(); } - else if (customTemplate == "mtl_reflexsight") + else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_REFLEXSIGHT) { mtl_reflexsight_template(); } - else if (customTemplate == "mtl_shadowclear") + else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_SHADOWCLEAR) { mtl_shadowclear_template(); } - else if (customTemplate == "mtl_shadowoverlay") + else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_SHADOWOVERLAY) { mtl_shadowoverlay_template(); } - else if (customTemplate == "mtl_splatter") + else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_SPLATTER) { mtl_splatter_template(); } @@ -280,24 +283,25 @@ namespace IW4 std::string sortKey; if (sort.empty() || sort == "") { - if (materialType == "distortion") - sortKey = SortKeyNames[SORTKEY_DISTORTION]; + if (materialType == GDT_MATERIAL_TYPE_DISTORTION) + sortKey = GDT_SORTKEY_DISTORTION; else if (polygonOffset == "Static Decal") - sortKey = SortKeyNames[SORTKEY_DECAL_STATIC_DECAL]; + sortKey = GDT_SORTKEY_DECAL_STATIC; else if (polygonOffset == "Weapon Impact") - sortKey = SortKeyNames[SORTKEY_DECAL_WEAPON_IMPACT]; - else if (materialType == "effect") - sortKey = SortKeyNames[SORTKEY_EFFECT_AUTO_SORT]; - else if (materialType == "objective" || blendFunc == "Blend" || blendFunc == "Add" || blendFunc == "Screen Add") - sortKey = SortKeyNames[SORTKEY_BLEND_ADDITIVE]; - // else if (blendFunc == "Multiply") - // sortKey = SortKeyNames[SORTKEY_MULTIPLICATIVE]; - else if (materialType == "sky") - sortKey = SortKeyNames[SORTKEY_SKY]; - else if (materialType == "model ambient") - sortKey = SortKeyNames[SORTKEY_OPAQUE_AMBIENT]; + sortKey = GDT_SORTKEY_DECAL_WEAPON_IMPACT; + else if (materialType == GDT_MATERIAL_TYPE_EFFECT) + sortKey = GDT_SORTKEY_EFFECT_AUTO_SORT; + else if (materialType == GDT_MATERIAL_TYPE_OBJECTIVE + || blendFunc == "Blend" || blendFunc == "Add" || blendFunc == "Screen Add") + sortKey = GDT_SORTKEY_BLEND_ADDITIVE; + // else if (blendFunc == "Multiply") // TODO + // sortKey = GDT_SORTKEY_MULTIPLICATIVE; + else if (materialType == GDT_MATERIAL_TYPE_SKY) + sortKey = GDT_SORTKEY_SKY; + else if (materialType == GDT_MATERIAL_TYPE_MODEL_AMBIENT) + sortKey = GDT_SORTKEY_OPAQUE_AMBIENT; else - sortKey = SortKeyNames[SORTKEY_OPAQUE]; + sortKey = GDT_SORTKEY_OPAQUE; } else sortKey = sort; diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperMaterial.cpp b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperMaterial.cpp index 17a416fa..cedde7b1 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperMaterial.cpp +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperMaterial.cpp @@ -438,91 +438,14 @@ namespace IW4 stream << std::setw(4) << j; } - enum class GdtMaterialType - { - MATERIAL_TYPE_UNKNOWN, - MATERIAL_TYPE_2D, - MATERIAL_TYPE_CUSTOM, - MATERIAL_TYPE_DISTORTION, - MATERIAL_TYPE_EFFECT, - MATERIAL_TYPE_IMPACT_MARK, - MATERIAL_TYPE_MODEL_AMBIENT, - MATERIAL_TYPE_MODEL_PHONG, - MATERIAL_TYPE_MODEL_UNLIT, - MATERIAL_TYPE_OBJECTIVE, - MATERIAL_TYPE_PARTICLE_CLOUD, - MATERIAL_TYPE_SKY, - MATERIAL_TYPE_TOOLS, - MATERIAL_TYPE_UNLIT, - MATERIAL_TYPE_WATER, - MATERIAL_TYPE_WORLD_PHONG, - MATERIAL_TYPE_WORLD_UNLIT, - - MATERIAL_TYPE_COUNT - }; - - enum class GdtCustomMaterialTypes - { - CUSTOM_MATERIAL_TYPE_NONE, - // Uses custom techset with generic options - CUSTOM_MATERIAL_TYPE_CUSTOM, - CUSTOM_MATERIAL_TYPE_PHONG_FLAG, - CUSTOM_MATERIAL_TYPE_GRAIN_OVERLAY, - CUSTOM_MATERIAL_TYPE_EFFECT_EYE_OFFSET, - CUSTOM_MATERIAL_TYPE_REFLEX_SIGHT, - CUSTOM_MATERIAL_TYPE_SHADOW_CLEAR, - CUSTOM_MATERIAL_TYPE_SHADOW_OVERLAY, - - // Not part of IW3 - CUSTOM_MATERIAL_TYPE_SPLATTER, - - CUSTOM_MATERIAL_TYPE_COUNT - }; - - const char* GdtMaterialTypeNames[] - { - "", - "2d", - "custom", - "distortion", - "effect", - "impact mark", - "model ambient", - "model phong", - "model unlit", - "objective", - "particle cloud", - "sky", - "tools", - "unlit", - "water", - "world phong", - "world unlit" - }; - static_assert(std::extent_v == static_cast(GdtMaterialType::MATERIAL_TYPE_COUNT)); - - const char* GdtCustomMaterialTypeNames[] - { - "", - "mtl_custom", - "mtl_phong_flag", - "mtl_grain_overlay", - "mtl_effect_eyeoffset", - "mtl_reflexsight", - "mtl_shadowclear", - "mtl_shadowoverlay", - "mtl_splatter" - }; - static_assert(std::extent_v == static_cast(GdtCustomMaterialTypes::CUSTOM_MATERIAL_TYPE_COUNT)); - class TechsetInfo { public: std::string m_techset_name; std::string m_techset_base_name; std::string m_techset_prefix; - GdtMaterialType m_gdt_material_type = GdtMaterialType::MATERIAL_TYPE_UNKNOWN; - GdtCustomMaterialTypes m_gdt_custom_material_type = GdtCustomMaterialTypes::CUSTOM_MATERIAL_TYPE_NONE; + GdtMaterialType m_gdt_material_type = MATERIAL_TYPE_UNKNOWN; + GdtCustomMaterialTypes m_gdt_custom_material_type = CUSTOM_MATERIAL_TYPE_NONE; std::string m_gdt_custom_string; MaterialType m_engine_material_type = MTL_TYPE_DEFAULT; bool m_no_cast_shadow = false;