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}