src bone transforms stuff?

This commit is contained in:
Robin Appelman 2024-06-05 22:48:17 +02:00
commit 073d5932b5
3 changed files with 45 additions and 5 deletions

View file

@ -33,7 +33,7 @@ impl Mdl {
let header = <StudioHeader as Readable>::read(data)?; let header = <StudioHeader as Readable>::read(data)?;
let header2 = header let header2 = header
.header2_index() .header2_index()
.map(|index| read_single(data, index)) .map(|index| read_single::<StudioHeader2, _>(data, index))
.transpose()?; .transpose()?;
let name = header.name.try_into()?; let name = header.name.try_into()?;
let mut textures = read_relative_iter(data, header.texture_indexes()) let mut textures = read_relative_iter(data, header.texture_indexes())
@ -52,6 +52,10 @@ impl Mdl {
let skin_table = read_relative::<u16, _>(data, header.skin_reference_indexes())?; let skin_table = read_relative::<u16, _>(data, header.skin_reference_indexes())?;
let bones = read_relative(data, header.bone_indexes())?; let bones = read_relative(data, header.bone_indexes())?;
// are these used?
let _source_bone_transforms: Vec<SourceBoneTransform> = read_relative(data, header2.unwrap().source_bone_transforms())?;
let surface_prop = read_single(data, header.surface_prop_index)?; let surface_prop = read_single(data, header.surface_prop_index)?;
let key_values = (header.key_value_size > 0) let key_values = (header.key_value_size > 0)
.then(|| read_single(data, header.key_value_index)) .then(|| read_single(data, header.key_value_index))

View file

@ -315,3 +315,38 @@ bitflags! {
const CONTENTS_HITBOX = 0x40000000; const CONTENTS_HITBOX = 0x40000000;
} }
} }
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
#[repr(C)]
pub struct SourceBoneTransformHeader {
pub sz_name_index: i32,
pub pre_transform: Transform3x4,
pub post_transform: Transform3x4,
}
#[derive(Debug, Clone)]
#[repr(C)]
pub struct SourceBoneTransform {
pub name: String,
pub pre_transform: Transform3x4,
pub post_transform: Transform3x4,
}
impl ReadRelative for SourceBoneTransform {
type Header = SourceBoneTransformHeader;
fn read(data: &[u8], header: Self::Header) -> Result<Self, ModelError> {
let name_bytes =
data.get(header.sz_name_index as usize..)
.ok_or(ModelError::OutOfBounds {
data: "source bone transform name",
offset: header.sz_name_index as usize,
})?;
Ok(SourceBoneTransform {
name: String::read(name_bytes, ())?,
pre_transform: header.pre_transform,
post_transform: header.post_transform,
})
}
}

View file

@ -1,6 +1,8 @@
use crate::ReadableRelative; use std::mem::size_of;
use crate::{index_range, ReadableRelative};
use bytemuck::{Pod, Zeroable}; use bytemuck::{Pod, Zeroable};
use std::ops::Range; use std::ops::Range;
use crate::mdl::{BoneHeader, SourceBoneTransformHeader};
#[derive(Debug, Clone, Copy, Zeroable, Pod)] #[derive(Debug, Clone, Copy, Zeroable, Pod)]
#[repr(C)] #[repr(C)]
@ -26,9 +28,8 @@ pub struct StudioHeader2 {
impl ReadableRelative for StudioHeader2 {} impl ReadableRelative for StudioHeader2 {}
impl StudioHeader2 { impl StudioHeader2 {
pub fn source_bone_transforms(&self) -> Range<i32> { pub fn source_bone_transforms(&self) -> impl Iterator<Item = usize> {
self.source_bone_transform_index index_range(self.source_bone_transform_index, self.source_bone_transform_count, size_of::<SourceBoneTransformHeader>())
..(self.source_bone_transform_index + self.source_bone_transform_count)
} }
pub fn bone_flex_drivers(&self) -> Range<i32> { pub fn bone_flex_drivers(&self) -> Range<i32> {