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)); 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[] inline const char* SortKeyNames[]
{ {
"opaque ambient", // 0 GDT_SORTKEY_OPAQUE_AMBIENT, // 0
"opaque", // 1 GDT_SORTKEY_OPAQUE, // 1
"sky", // 2 GDT_SORTKEY_SKY, // 2
"skybox", // 3 GDT_SORTKEY_SKYBOX, // 3
"?", // 4 "?", // 4
"?", // 5 "?", // 5
"decal - bottom 1", // 6 GDT_SORTKEY_DECAL_BOTTOM_1, // 6
"decal - bottom 2", // 7 GDT_SORTKEY_DECAL_BOTTOM_2, // 7
"decal - bottom 3", // 8 GDT_SORTKEY_DECAL_BOTTOM_3, // 8
"decal - static decal", // 9 GDT_SORTKEY_DECAL_STATIC, // 9
"decal - middle 1", // 10 GDT_SORTKEY_DECAL_MIDDLE_1, // 10
"decal - middle 2", // 11 GDT_SORTKEY_DECAL_MIDDLE_2, // 11
"decal - middle 3", // 12 GDT_SORTKEY_DECAL_MIDDLE_3, // 12
"decal - weapon impact", // 13 GDT_SORTKEY_DECAL_WEAPON_IMPACT, // 13
"?", // 14 "?", // 14
"?", // 15 "?", // 15
"?", // 16 "?", // 16
@ -388,8 +473,8 @@ namespace IW4
"?", // 21 "?", // 21
"-", // 22 "-", // 22
"-", // 23 "-", // 23
"window inside", // 24 GDT_SORTKEY_WINDOW_INSIDE, // 24
"window outside", // 25 GDT_SORTKEY_WINDOW_OUTSIDE, // 25
"?", // 26 "?", // 26
"?", // 27 "?", // 27
"?", // 28 "?", // 28
@ -407,17 +492,59 @@ namespace IW4
"?", // 40 "?", // 40
"?", // 41 "?", // 41
"?", // 42 "?", // 42
"distortion", // 43 GDT_SORTKEY_DISTORTION, // 43
"?", // 44 "?", // 44
"?", // 45 "?", // 45
"-", // 46 "-", // 46
"blend / additive", // 47 GDT_SORTKEY_BLEND_ADDITIVE, // 47
"effect - auto sort", // 48 GDT_SORTKEY_EFFECT_AUTO_SORT, // 48
"after effects - bottom", // 49 GDT_SORTKEY_AFTER_EFFECT_BOTTOM, // 49
"after effects - middle", // 50 GDT_SORTKEY_AFTER_EFFECT_MIDDLE, // 50
"after effects - top", // 51 GDT_SORTKEY_AFTER_EFFECT_TOP, // 51
"-", // 52 "-", // 52
"viewmodel effect", // 53 GDT_SORTKEY_VIEWMODEL_EFFECT, // 53
}; };
static_assert(std::extent_v<decltype(SortKeyNames)> == static_cast<size_t>(SORTKEY_MAX)); 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"); 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(); mtl_phong_template();
} }
else if (materialType == "model ambient") else if (materialType == GDT_MATERIAL_TYPE_MODEL_AMBIENT)
{ {
mtl_ambient_template(); mtl_ambient_template();
} }
else if (materialType == "2d") else if (materialType == GDT_MATERIAL_TYPE_2D)
{ {
mtl_2d_template(); 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(); mtl_unlit_template();
} }
else if (materialType == "unlit") else if (materialType == GDT_MATERIAL_TYPE_UNLIT)
{ {
mtl_unlit_deprecated_template(); mtl_unlit_deprecated_template();
} }
else if (materialType == "effect") else if (materialType == GDT_MATERIAL_TYPE_EFFECT)
{ {
mtl_effect_template(); mtl_effect_template();
} }
else if (materialType == "distortion") else if (materialType == GDT_MATERIAL_TYPE_DISTORTION)
{ {
mtl_distortion_template(); mtl_distortion_template();
} }
else if (materialType == "particle cloud") else if (materialType == GDT_MATERIAL_TYPE_PARTICLE_CLOUD)
{ {
mtl_particlecloud_template(); mtl_particlecloud_template();
} }
else if (materialType == "tools") else if (materialType == GDT_MATERIAL_TYPE_TOOLS)
{ {
mtl_tools_template(); mtl_tools_template();
} }
else if (materialType == "sky") else if (materialType == GDT_MATERIAL_TYPE_SKY)
{ {
mtl_sky_template(); mtl_sky_template();
} }
else if (materialType == "water") else if (materialType == GDT_MATERIAL_TYPE_WATER)
{ {
mtl_water_template(); mtl_water_template();
} }
else if (materialType == "objective") else if (materialType == GDT_MATERIAL_TYPE_OBJECTIVE)
{ {
mtl_objective_template(); mtl_objective_template();
} }
else if (materialType == "custom") else if (materialType == GDT_MATERIAL_TYPE_CUSTOM)
{ {
custom_template(); custom_template();
} }
@ -176,35 +179,35 @@ namespace IW4
{ {
const auto customTemplate = ReadStringProperty("customTemplate"); const auto customTemplate = ReadStringProperty("customTemplate");
if (customTemplate == "mtl_custom") if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_CUSTOM)
{ {
mtl_custom_template(); mtl_custom_template();
} }
else if (customTemplate == "mtl_phong_flag") else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_PHONG_FLAG)
{ {
mtl_phong_flag_template(); mtl_phong_flag_template();
} }
else if (customTemplate == "mtl_grain_overlay") else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_GRAIN_OVERLAY)
{ {
mtl_grain_overlay_template(); mtl_grain_overlay_template();
} }
else if (customTemplate == "mtl_effect_eyeoffset") else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_EFFECT_EYE_OFFSET)
{ {
mtl_effect_eyeoffset_template(); mtl_effect_eyeoffset_template();
} }
else if (customTemplate == "mtl_reflexsight") else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_REFLEXSIGHT)
{ {
mtl_reflexsight_template(); mtl_reflexsight_template();
} }
else if (customTemplate == "mtl_shadowclear") else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_SHADOWCLEAR)
{ {
mtl_shadowclear_template(); mtl_shadowclear_template();
} }
else if (customTemplate == "mtl_shadowoverlay") else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_SHADOWOVERLAY)
{ {
mtl_shadowoverlay_template(); mtl_shadowoverlay_template();
} }
else if (customTemplate == "mtl_splatter") else if (customTemplate == GDT_CUSTOM_MATERIAL_TYPE_SPLATTER)
{ {
mtl_splatter_template(); mtl_splatter_template();
} }
@ -280,24 +283,25 @@ namespace IW4
std::string sortKey; std::string sortKey;
if (sort.empty() || sort == "<default>") if (sort.empty() || sort == "<default>")
{ {
if (materialType == "distortion") if (materialType == GDT_MATERIAL_TYPE_DISTORTION)
sortKey = SortKeyNames[SORTKEY_DISTORTION]; sortKey = GDT_SORTKEY_DISTORTION;
else if (polygonOffset == "Static Decal") else if (polygonOffset == "Static Decal")
sortKey = SortKeyNames[SORTKEY_DECAL_STATIC_DECAL]; sortKey = GDT_SORTKEY_DECAL_STATIC;
else if (polygonOffset == "Weapon Impact") else if (polygonOffset == "Weapon Impact")
sortKey = SortKeyNames[SORTKEY_DECAL_WEAPON_IMPACT]; sortKey = GDT_SORTKEY_DECAL_WEAPON_IMPACT;
else if (materialType == "effect") else if (materialType == GDT_MATERIAL_TYPE_EFFECT)
sortKey = SortKeyNames[SORTKEY_EFFECT_AUTO_SORT]; sortKey = GDT_SORTKEY_EFFECT_AUTO_SORT;
else if (materialType == "objective" || blendFunc == "Blend" || blendFunc == "Add" || blendFunc == "Screen Add") else if (materialType == GDT_MATERIAL_TYPE_OBJECTIVE
sortKey = SortKeyNames[SORTKEY_BLEND_ADDITIVE]; || blendFunc == "Blend" || blendFunc == "Add" || blendFunc == "Screen Add")
// else if (blendFunc == "Multiply") sortKey = GDT_SORTKEY_BLEND_ADDITIVE;
// sortKey = SortKeyNames[SORTKEY_MULTIPLICATIVE]; // else if (blendFunc == "Multiply") // TODO
else if (materialType == "sky") // sortKey = GDT_SORTKEY_MULTIPLICATIVE;
sortKey = SortKeyNames[SORTKEY_SKY]; else if (materialType == GDT_MATERIAL_TYPE_SKY)
else if (materialType == "model ambient") sortKey = GDT_SORTKEY_SKY;
sortKey = SortKeyNames[SORTKEY_OPAQUE_AMBIENT]; else if (materialType == GDT_MATERIAL_TYPE_MODEL_AMBIENT)
sortKey = GDT_SORTKEY_OPAQUE_AMBIENT;
else else
sortKey = SortKeyNames[SORTKEY_OPAQUE]; sortKey = GDT_SORTKEY_OPAQUE;
} }
else else
sortKey = sort; sortKey = sort;

View File

@ -438,91 +438,14 @@ namespace IW4
stream << std::setw(4) << j; 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 class TechsetInfo
{ {
public: public:
std::string m_techset_name; std::string m_techset_name;
std::string m_techset_base_name; std::string m_techset_base_name;
std::string m_techset_prefix; std::string m_techset_prefix;
GdtMaterialType m_gdt_material_type = GdtMaterialType::MATERIAL_TYPE_UNKNOWN; GdtMaterialType m_gdt_material_type = MATERIAL_TYPE_UNKNOWN;
GdtCustomMaterialTypes m_gdt_custom_material_type = GdtCustomMaterialTypes::CUSTOM_MATERIAL_TYPE_NONE; GdtCustomMaterialTypes m_gdt_custom_material_type = CUSTOM_MATERIAL_TYPE_NONE;
std::string m_gdt_custom_string; std::string m_gdt_custom_string;
MaterialType m_engine_material_type = MTL_TYPE_DEFAULT; MaterialType m_engine_material_type = MTL_TYPE_DEFAULT;
bool m_no_cast_shadow = false; bool m_no_cast_shadow = false;