vmdl/mdl/raw/
header2.rs

1use crate::mdl::SourceBoneTransformHeader;
2use crate::{index_range, ReadableRelative};
3use bytemuck::{Pod, Zeroable};
4use std::mem::size_of;
5use std::ops::Range;
6
7#[derive(Debug, Clone, Copy, Zeroable, Pod)]
8#[repr(C)]
9pub struct StudioHeader2 {
10    source_bone_transform_count: i32,
11    source_bone_transform_index: i32,
12
13    pub illumination_position_attachment_index: i32,
14
15    fl_max_exe_deflection: f32,
16
17    pub linear_bone_index: i32,
18
19    pub sz_name_index: i32,
20
21    bone_flex_driver_count: i32,
22    bone_flex_driver_index: i32,
23
24    _reserved1: [i32; 32],
25    _reserved2: [i32; 24],
26}
27
28impl ReadableRelative for StudioHeader2 {}
29
30impl StudioHeader2 {
31    pub fn source_bone_transforms(&self) -> impl Iterator<Item = usize> {
32        index_range(
33            self.source_bone_transform_index,
34            self.source_bone_transform_count,
35            size_of::<SourceBoneTransformHeader>(),
36        )
37    }
38
39    pub fn bone_flex_drivers(&self) -> Range<i32> {
40        self.bone_flex_driver_index..(self.bone_flex_driver_index + self.bone_flex_driver_count)
41    }
42
43    pub fn max_eye_deflection(&self) -> f32 {
44        if self.fl_max_exe_deflection == 0.0 {
45            (30.0f32).cos()
46        } else {
47            self.fl_max_exe_deflection
48        }
49    }
50}