struct MaterialArgumentCodeConst
{
unsigned __int16 index;
char firstRow;
char rowCount;
};
union MaterialArgumentDef
{
const float *literalConst;
MaterialArgumentCodeConst codeConst;
unsigned int codeSampler;
unsigned int nameHash;
};
/* MaterialShaderArgument->type */
#define MTL_ARG_MATERIAL_VERTEX_CONST 0x0
#define MTL_ARG_LITERAL_VERTEX_CONST 0x1
#define MTL_ARG_MATERIAL_PIXEL_SAMPLER 0x2
#define MTL_ARG_CODE_PRIM_BEGIN 0x3
#define MTL_ARG_CODE_VERTEX_CONST 0x3
#define MTL_ARG_CODE_PIXEL_SAMPLER 0x4
#define MTL_ARG_CODE_PIXEL_CONST 0x5
#define MTL_ARG_MATERIAL_PIXEL_CONST 0x6
#define MTL_ARG_CODE_PRIM_END 0x6
#define MTL_ARG_LITERAL_PIXEL_CONST 0x7
#define MLT_ARG_COUNT 0x8
struct MaterialShaderArgument
{
unsigned __int16 type;
unsigned __int16 dest;
MaterialArgumentDef u;
};
struct MaterialVertexDeclaration
{
#ifdef COD4 || WAW || BO1 || BO2
char unknown[0x22];
#elif defined MW2 || MW3
char unknown[0x1C];
#elif defined GHOSTS
char unknown[0x20];
#endif
};
#pragma pack(push, 4)
struct MaterialPass
{
MaterialVertexDeclaration *vertexDecl;
MaterialVertexShader *vertexShader;
MaterialPixelShader *pixelShader;
char perPrimArgCount;
char perObjArgCount;
char stableArgCount;
char customSamplerFlags;
char precompiledIndex;
#ifdef BO2
char unknown[0x13];
#endif
MaterialShaderArgument *args;
};
#pragma pack(pop)
struct MaterialTechnique
{
const char *name;
unsigned __int16 flags;
unsigned __int16 passCount;
MaterialPass passArray[1]; // count = passCount
};
/* MaterialTechniqueSet->worldVertFormat */
enum MaterialWorldVertexFormat : char
{
MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,
MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,
MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,
MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,
MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,
MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,
MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,
MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,
MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,
MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,
MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,
MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,
};
#ifdef PS3
#ifdef COD4
#define MAX_TECHNIQUES 26
#elif defined WAW
#define MAX_TECHNIQUES 51
#elif defined MW2
#define MAX_TECHNIQUES 37
#elif defined BO1
#define MAX_TECHNIQUES 71
#elif defined MW3
#define MAX_TECHNIQUES 41
#elif defined BO2
#define MAX_TECHNIQUES 32
#elif defined GHOSTS
#define MAX_TECHNIQUES 39
#endif
#endif
#ifdef XBOX
#ifdef COD4
#define MAX_TECHNIQUES 26
#elif defined WAW
#define MAX_TECHNIQUES 51
#elif defined MW2
#define MAX_TECHNIQUES 33
#elif defined BO1
#define MAX_TECHNIQUES 71
#elif defined MW3
#define MAX_TECHNIQUES 37
#elif defined BO2
#define MAX_TECHNIQUES 36
#elif defined GHOSTS
#define MAX_TECHNIQUES 36
#endif
#endif
#ifdef PC
#ifdef COD4
#define MAX_TECHNIQUES 34
#elif defined MW2
#define MAX_TECHNIQUES 48
#elif defined BO1
#define MAX_TECHNIQUES 130
#elif defined MW3
#define MAX_TECHNIQUES 54
#elif defined BO2
#define MAX_TECHNIQUES 36
#endif
#endif
struct MaterialTechniqueSet
{
char *name;
MaterialWorldVertexFormat worldVertFormat;
MaterialTechnique *techniques[MAX_TECHNIQUES];
};