Use string constants for material loading

This commit is contained in:
Jan 2022-07-23 14:33:27 +02:00
parent 92d808b7a4
commit 0cbf234faf
3 changed files with 190 additions and 136 deletions

View File

@ -362,22 +362,107 @@ namespace IW4
};
static_assert(std::extent_v<decltype(GdtStencilOpNames)> == static_cast<size_t>(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 = "<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<decltype(GdtMaterialTypeNames)> == static_cast<size_t>(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<decltype(SortKeyNames)> == static_cast<size_t>(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<decltype(GdtCustomMaterialTypeNames)> == static_cast<size_t>(CUSTOM_MATERIAL_TYPE_COUNT));
}

View File

@ -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 == "<default>")
{
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;

View File

@ -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[]
{
"<unknown>",
"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<decltype(GdtMaterialTypeNames)> == static_cast<size_t>(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<decltype(GdtCustomMaterialTypeNames)> == static_cast<size_t>(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;