MdlSkin

Struct MdlSkin 

Source
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: MdlMesh

The base triangle mesh.

§mdx_bone_weights_offset: i32

MDX 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: i32

MDX 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.

Trait Implementations§

Source§

impl Clone for MdlSkin

Source§

fn clone(&self) -> MdlSkin

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MdlSkin

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MdlSkin

Source§

fn default() -> Self

Defaults with MDX bone offsets set to -1 (not present).

Source§

impl PartialEq for MdlSkin

Source§

fn eq(&self, other: &MdlSkin) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for MdlSkin

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Az for T

Source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

Source§

fn cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> CheckedAs for T

Source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

Source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> OverflowingAs for T

Source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

Source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
Source§

impl<T> SaturatingAs for T

Source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

Source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> StrictAs for T

Source§

fn strict_as<Dst>(self) -> Dst
where T: StrictCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> StrictCastFrom<Src> for Dst
where Src: StrictCast<Dst>,

Source§

fn strict_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> UnwrappedAs for T

Source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

Source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> WrappingAs for T

Source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

Source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.