This is what I've learned about the FF8 MCH format, to add on to the information already collected.
Model headerOffset Length Description
0x1C 0x02 Triangle count
0x1E 0x02 Quad count
Undescribed data between vertices and facesThis appears to be texture-animations e.g. eye blinks. Its entry in the first part of the model header appears to be the length of the section, rather than the count.
Guess at structure. My names are rather rough.
struct
{
byte unknown
byte total_textures?
byte unknown
byte uSize
byte vSize
byte replacement_section_count
UV_pair original_area_coords
byte unknown[2]
UV_pair replacement_coords[replacement_section_count]
}
Face dataOffset Length Description
0x08 0x02 When bit 0x04 set, face has semi-transparency
0x36 0x02 Texture index
Undescribed data between faces and skin-objectsSeems to split up the skin-objects, triangles, and quads.
(A guess)
struct
{
uint16 start_skinobject_index
uint16 skinobject_count
byte unknown[12]
uint16 start_triangle_index
uint16 triangle_count
uint16 start_quad_index
uint16 quad_count
byte unknown2[8]
}
Some models (d049, d053, d075, and p019) have two of this data type.
AnimationsThe first 6 bytes of each animation frame are the coordinates shift (3 signed 16-bit numbers). I am only sure of the last one being the Z-shift.
Player models actually do have animation data after all, just in a different form than the one I documented in the field chara.one files. They use a simple six bytes per bone.
--
Edit: updated texture animation info