Model Material Set - .mmat¶
.mmat
represents all the materials for a model, it is a set of materials. It describes the textures to use, and the shaders linked to a material.
This file is a FlatBuffer file.
Header¶
Field Name | Type | Description |
---|---|---|
magic | uint | Should be 20230727 , explicitly checked. Might correspond to a date, 2023/07/27. |
materials | Material[] | List of all materials in the material set. |
constant_buffers | ConstantBuffer | List of constant buffers. |
shader_param_float_data_pool | float[] | Float data for materials when their parameters uses floats/Vectors. |
byte5 | byte | Unknown. em files seem to use this. |
bool6 | bool | Unknown. |
bool7 | bool | Unknown. |
Material¶
Field Name | Type | Description |
---|---|---|
shader_params | ShaderParamInfo[] | Shader parameters, which shaders to use. |
texture_maps | TextureMapInfo[] | Textures to use. |
constant_buffer_indices | uint | Indices of which constant buffers to use. |
granite_params | GraniteVirtualTextureStreamingInfo | Granite SDK Texture streaming info. If not present, will load textures loose. |
unique_material_name_hash_maybe | XXHash32Custom(str) | Hash of the name of this material. |
shader_type | byte | Type of shader to use. |
shader_sub_type | byte | Sub-type of shader. |
unk_8 | byte | Unknown. Should be 0 to 3. |
bool9 | bool | Unknown. |
bool10 | bool | Unknown. |
bool11 | bool | Unknown. |
bool12 | bool | Unknown. |
Shader Type
Each shader type uses a different type of shader where different parameters and texture maps may be required to be provided. Refer to files which uses these types in the first place to provide the proper parameters to avoid a potential game crash.
- 0 = player_silhouette? (sub-types: 7, 8)
- 1 = player_silhouette2? (sub-types: 7, 8)
- 2 = Eye shaders? (sub-types: 7, 8)
- 3 = Face shaders? (sub-types: 0, 3, 7, 8)
- 4 = Hair shaders? (sub-types: 0, 3, 7, 8)
- 5 = Metal shaders (sub-types: 0, 3, 4, 5, 7, 8)
- 7 =
elementallookdev
(sub-types: 7, 8) - 8 =
flowmap
(sub-types: 7, 8) - 9 =
foilage
(sub-types: 7, 8) - 10 =
glowingground
(sub-types: 7, 8) - 11 =
glowingmountain
(sub-types: 7, 8) - 12 =
ice
(sub-types: 2, 3, 7, 8) - 13 =
ice_2layer
(sub-types: 7, 8) - 14 =
lavafall
(sub-types: 7, 8) - 15 =
lucilius
(sub-types: 7, 8) - 16 = Not supported
- 17 =
plantbillboard
(sub-types: 7, 8) - 18 =
plantmiddleview
(sub-types: 4, 7, 8) - 19 =
plantshake
(sub-types: 4, 7, 8) - 20 =
skycloud
(sub-types: 1, 7, 8) - 21 =
uberenv
(sub-types: 1, 7, 8) - 22 =
uberenv_layer2
(sub-types: 1, 7, 8) - 23 =
uberenv_layer2_plantpivotpainter
(sub-types: 1, 7, 8) - 24 =
uberenv_layer3
(sub-types: 1, 7, 8) - 25 =
uberenv_layer4
(sub-types: 1, 7, 8) - 26 =
uberenv_plantpivotpainter
? (sub-types: 4, 7, 8) - 27 =
uberenvtextureless
? (sub-types: 7, 8) - 28 = Not supported
- 29 =
grid
(sub-types: 7, 8)
Shader Sub-Type
The sub-types supported depend on the main shader type.
- 0 = vs_pbs_xxxxx/vs_pbs_sxxxx8_anime/vs_pbs_sxxxx/vs_pbs_sxxxx_anime
- 1 = ?
- 3 = outline (skinning)
- 4 = shadow
- 5 = shadow skinning mask (dp)
- 6 = pointlight_shadow_mask
- 7 = player silhouette or regular texture?
- 8 = "foward" shaders?
ShaderParamInfo¶
Field Name | Type | Description |
---|---|---|
param_hash | XXHash32Custom(str) | Hashed shader parameter name. NOTE: Structures should be ordered by this. |
value_or_offset | uint | Value for the parameter. Note that when the type is float/Vec2/Vec3/Vec4 , the value becomes an offset to shader_param_float_data_pool . |
value_type | ShaderParamValueType | Parameter value type. |
Value Types
U8
= 0,U16
= 1,F32
= 2,Vec2
= 3Vec3
= 4,Vec4
= 5
TextureMapInfo¶
Field Name | Type | Description |
---|---|---|
shader_map_name_hash | XXHash32Custom(str) | Hashed map name passed to the shader. NOTE: Structures should be ordered by this. |
texture_name | string | Texture name. When granite is not in use, this will be mapped to texture/4k/<name>.texture or texture/<name>.texture . |
GraniteVirtualTextureStreamingInfo¶
Field Name | Type | Description |
---|---|---|
page_file | string | Granite page file where textures for this material are located. |
layer_to_shader_map_name_hash | XXHash32Custom(str)[] | Shader map names. Each element will map to one layer in the granite file. For instance if element 0 is the hash of g_AlbedoMap , that means that g_AlbedoMap is located at layer 0. |
unk3 | byte | Unknown. |
unk4 | byte | Unknown. |
tile_set_number | byte | Tile set number where the page file is located. Up to 11 is supported, 0-2 is used. Reminder - a new minor update always adds 3 new tile sets, so 0-11 for 1.0 through 1.3. |
ConstantBuffer¶
Unknown. This is indexed by constant_buffer_indices
within materials.
Field Name | Type | Description |
---|---|---|
buffer | uint[] | Float buffer. |
unk_unique_param_name_hash | XXHash32Custom(str) | Unique name hash. |
Known Hashes¶
Shader Maps
Strings can be found inside shaders.
enum ShaderMapTypeHash : uint
{
Unk = 0,
g_5A2C820C = 0x5A2C820C,
g_8A0507FB = 0x8A0507FB,
g_AlbedoMap = 0x3F2B4D59,
g_AlbedoMapFar = 0x7847F758,
g_AlbedoMapMiddle = 0x56C35C30,
g_AlbedoTex = 0xE9AEA597,
g_AlbedoTex0 = 0x7D82DDEA,
g_AlbedoTex1 = 0x8FC0A070,
g_AlbedoTex2 = 0x19615C52,
g_AlbedoTex3 = 0xA697D782,
g_AreaMaskMap = 0xD52525E5,
g_Base0Map = 0x9EE04147,
g_Base1Map = 0x46C247DB,
g_BottomErosion0Map = 0xAD237ACF,
g_BottomErosion1Map = 0x47DA21A1,
g_BumpMap = 0xE19336DE,
g_BumpMaskMap = 0x707A6889,
g_BumpNormalMap = 0x9B7115C3,
g_Color0Map = 0x7AF0C744,
g_Color1Map = 0xC5089B10,
g_ContainerMap = 0x6C92581E,
g_DetailNormalMap = 0x71F4A50E,
g_DitherMap = 0x0C914331,
g_EmissiveMap = 0x5CDF6E8F,
g_EyeHighLightTexture = 0x00B36A70,
g_EyeIrisTexture = 0x637A19F3,
g_EyeWhiteTexture = 0xAEDB57AE,
g_FlowMap = 0x983C09F6,
g_IBLTexture = 0x330CF7B7,
g_Large0Map = 0xC56364D9,
g_Large1Map = 0x9FEF4F43,
g_Layer1Map = 0x7373F664,
g_Layer2Map = 0x3779219E,
g_LowDetailMap = 0xF8E10DF2,
g_LUT = 0x69DF53A1,
g_Mask0Map = 0xDB972A87,
g_Mask1 = 0x847A6CBD,
g_Mask1Map = 0x42904E14,
g_Mask2 = 0x6137BA13,
g_Mask2Map = 0x2D04F715,
g_Mask3 = 0x35091AFA,
g_Mask4 = 0x393263EF,
g_MaskMap = 0x63C1ED71,
g_MaskMap1 = 0x3DCC2032,
g_MaskTex = 0xD19EA412,
g_MaskTex0 = 0xAE860AB0,
g_MaskTex1 = 0x3069DB65,
g_MaskTex2 = 0xEDD2D2AF,
g_MaskTex3 = 0x4CC0E7B6,
g_Middle0Map = 0x38054382,
g_Middle1Map = 0xB70FDCD5,
g_MROEMap = 0x4905E4E4,
g_MROMap = 0x7852D3FE,
g_Noise0Map = 0x451D0F3A,
g_Noise1Map = 0x62F4BBF8,
g_NoiseGradationMap = 0xB21CCD8B,
g_NoiseMap = 0x7159CBC3,
g_NoiseMaskMap = 0x010A5EFA,
g_NormalMap = 0xADBA7C37,
g_NormalMap1 = 0x1470B2FB,
g_NormalTex = 0xE752FF91,
g_NormalTex0 = 0xB55D7961,
g_NormalTex1 = 0xFB542B74,
g_NormalTex2 = 0x295ED71A,
g_NormalTex3 = 0x82A0AA5A,
g_OffsetMask0Map = 0x6ECBBABD,
g_OffsetMask1Map = 0xAD768A4F,
g_ParallaxTexture = 0x1EE34406,
g_SideErosion0Map = 0x1EC206C2,
g_SideErosion1Map = 0xE21BFE74,
g_SideNoiseMap = 0xA7D31F31,
g_SparkleNormalMap = 0x64E256E8,
g_UberColorNoiseMap = 0xC19A4B09,
g_WindMaskMap = 0x1DD2F116,
}
Shader Parameters
Strings can be found inside shaders.
enum ShaderParameterTypeNameHash : uint
{
Unk = 0,
g_037BE4E5 = 0x037BE4E5,
g_EmissivePower = 0x06CFE5A4,
g_0A05A26F = 0x0A05A26F,
g_11664BFC = 0x11664BFC,
g_EnableDiscardMask = 0x24C1ABA9,
g_2AEDA6AD = 0x2AEDA6AD,
g_2B5C866C = 0x2B5C866C,
g_372C03F0 = 0x372C03F0,
g_UseIceEmissive0 = 0x3C966EE3,
g_4298F7E4 = 0x4298F7E4,
g_EnableOutLine = 0x49D8C1B9,
g_53F49792 = 0x53F49792,
g_56346692 = 0x56346692,
g_IsUseAlbedoAlphaClip = 0x60F31A22,
g_IsUseDetailNormal = 0x6C5CB9AC,
g_IsUseDitherMap = 0x7920C84F,
g_EnableBooleanMask = 0x920821E1,
g_92339519 = 0x92339519,
g_93D9F63A = 0x93D9F63A,
g_SwayAmplitude = 0x98EBBEC2,
g_9C83F56F = 0x9C83F56F,
g_ContainerUse = 0x9F1DA064,
g_A6EB1B34 = 0xA6EB1B34,
g_AB261CFA = 0xAB261CFA,
g_AC6F995D = 0xAC6F995D,
g_B0EA41D9 = 0xB0EA41D9,
g_B460A0F0 = 0xB460A0F0,
g_BAEF6920 = 0xBAEF6920,
g_C5BD3DED = 0xC5BD3DED,
g_C9762248 = 0xC9762248,
g_UseIceEmissive = 0xCA06A6B6,
g_TwoSided = 0xD94F2821,
g_UseColorNoise = 0xE208C4C4,
g_E56343C0 = 0xE56343C0,
g_EB6F1AE7 = 0xEB6F1AE7,
}