pub struct MdlSkin {
pub mesh: MdlMesh,
pub mdx_bone_weights_offset: i32,
pub mdx_bone_indices_offset: i32,
pub bone_weights: Vec<[f32; 4]>,
pub bone_indices: Vec<[f32; 4]>,
pub bonemap: Vec<u32>,
pub qbone_ref_inv: Vec<[f32; 4]>,
pub tbone_ref_inv: Vec<[f32; 3]>,
pub bone_constant_indices: Vec<i32>,
pub bone_node_numbers: [u16; 16],
}Expand description
Skinned mesh with bone weight data.
Extends MdlMesh with inverse bind pose data and bone index mappings
used for skeletal animation. Each bone has an inverse bind rotation
(quaternion) and translation (vector) that transform from bone space
to model space.
Binary layout: 100 extra bytes (0x64) after the 332-byte TriMesh header.
Verified via InputBinary::ResetSkin (0x004a01b0) and Ghidra struct
MdlNodeSkin (512 bytes total = 412 TriMesh + 100 extra).
See docs/notes/mdl_mdx.md §Mesh Subtype Structs.
Fields§
§mesh: MdlMeshThe base triangle mesh.
mdx_bone_weights_offset: i32MDX per-vertex bone weights byte offset (i32). Skin extra +0x0C.
Byte offset within each MDX vertex stride to the 4-float bone weights. Value -1 means not present.
mdx_bone_indices_offset: i32MDX per-vertex bone indices byte offset (i32). Skin extra +0x10.
Byte offset within each MDX vertex stride to the 4-float bone indices. Value -1 means not present.
bone_weights: Vec<[f32; 4]>Per-vertex bone weights (4 x f32, one per influence slot).
Each vertex has up to 4 bone influences. Unused slots are zero. One entry per vertex when populated, empty when no skin weights are present.
bone_indices: Vec<[f32; 4]>Per-vertex bone indices (4 x f32, one per influence slot).
Stored as f32 by engine convention (small non-negative integers). Each index references a bone in the bonemap. Unused slots are zero. One entry per vertex when populated, empty when no skin weights are present.
bonemap: Vec<u32>Bone-to-node index mapping from skin extra +0x14 pointer.
Each u32 maps a local bone index to a global skeleton node index. The engine relocates the pointer when the count (extra +0x18) > 0.
qbone_ref_inv: Vec<[f32; 4]>Inverse bind rotation per bone (quaternion: w, x, y, z).
One entry per bone. Transforms from bone space to model space. Data pointed to by CExoArrayList at skin extra +0x1C.
tbone_ref_inv: Vec<[f32; 3]>Inverse bind translation per bone (vector: x, y, z).
One entry per bone. Transforms from bone space to model space. Data pointed to by CExoArrayList at skin extra +0x28.
bone_constant_indices: Vec<i32>Bone constant indices mapping local bone index to global skeleton node index.
Data pointed to by CExoArrayList at skin extra +0x34.
bone_node_numbers: [u16; 16]Fixed-size array of 16 bone node serial numbers (u16). Skin extra +0x40.
Maps up to 16 local bone slots to node indices in the model hierarchy. Unused slots are zero.