#pragma once
#include <whiteout/models/wem/materials/common.h>
namespace whiteout {
namespace models {
namespace wem {
namespace m2_core {
enum class M2PixelShader : u8 {
Combiners_Opaque = 0,
Combiners_Mod,
Combiners_Opaque_Mod,
Combiners_Opaque_Mod2x,
Combiners_Opaque_Mod2xNA,
Combiners_Opaque_Opaque,
Combiners_Mod_Mod,
Combiners_Mod_Mod2x,
Combiners_Mod_Add,
Combiners_Mod_Mod2xNA,
Combiners_Mod_AddNA,
Combiners_Mod_Opaque,
Combiners_Opaque_Mod2xNA_Alpha,
Combiners_Opaque_AddAlpha,
Combiners_Opaque_AddAlpha_Alpha,
Combiners_Opaque_Mod2xNA_Alpha_Add,
Combiners_Mod_AddAlpha,
Combiners_Mod_AddAlpha_Alpha,
Combiners_Opaque_Alpha_Alpha,
Combiners_Opaque_Mod2xNA_Alpha_3s,
Combiners_Opaque_AddAlpha_Wgt,
Combiners_Mod_Add_Alpha,
Combiners_Opaque_ModNA_Alpha,
Combiners_Mod_AddAlpha_Wgt,
Combiners_Opaque_Mod_Add_Wgt,
Combiners_Opaque_Mod2xNA_Alpha_UnshAlpha,
Combiners_Mod_Dual_Crossfade,
Combiners_Opaque_Mod2xNA_Alpha_Alpha,
Combiners_Mod_Masked_Dual_Crossfade,
Combiners_Opaque_Alpha,
Guild,
Guild_NoBorder,
Guild_Opaque,
Combiners_Mod_Depth,
Illum,
Combiners_Unnamed_35,
Combiners_Mod_Mod_Depth,
Count,
};
const char* ToString(M2PixelShader shader);
inline constexpr u32 kNumShaderEffects = 36;
constexpr bool IsExplicitCombo(u16 shaderId) {
return (shaderId & 0x8000u) != 0;
}
struct Chain {
u8 stageCount = 1;
CombinerOp rgb[4] = {CombinerOp::Opaque, CombinerOp::Opaque, CombinerOp::Opaque,
CombinerOp::Opaque};
CombinerOp alpha[4] = {CombinerOp::Opaque, CombinerOp::Opaque, CombinerOp::Opaque,
CombinerOp::Opaque};
const char* unexpressed = nullptr;
};
M2PixelShader PixelShaderFor(u32 textureCount, u16 shaderId, bool& outOfTable);
Chain ChainOf(M2PixelShader shader);
enum class M2UvSource : u8 { T1 = 0, T2, Env };
struct UvSources {
u8 count = 1;
M2UvSource unit[4] = {M2UvSource::T1, M2UvSource::T1, M2UvSource::T1, M2UvSource::T1};
bool edgeFade = false;
};
UvSources UvSourcesFor(u32 textureCount, u16 shaderId);
} } } }