mirror of
https://codeberg.org/icewind/vmdl.git
synced 2026-06-03 16:44:11 +02:00
src bone transforms stuff?
This commit is contained in:
parent
0d0b3bf3ec
commit
073d5932b5
3 changed files with 45 additions and 5 deletions
|
|
@ -33,7 +33,7 @@ impl Mdl {
|
|||
let header = <StudioHeader as Readable>::read(data)?;
|
||||
let header2 = header
|
||||
.header2_index()
|
||||
.map(|index| read_single(data, index))
|
||||
.map(|index| read_single::<StudioHeader2, _>(data, index))
|
||||
.transpose()?;
|
||||
let name = header.name.try_into()?;
|
||||
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 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 key_values = (header.key_value_size > 0)
|
||||
.then(|| read_single(data, header.key_value_index))
|
||||
|
|
|
|||
|
|
@ -315,3 +315,38 @@ bitflags! {
|
|||
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,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,8 @@
|
|||
use crate::ReadableRelative;
|
||||
use std::mem::size_of;
|
||||
use crate::{index_range, ReadableRelative};
|
||||
use bytemuck::{Pod, Zeroable};
|
||||
use std::ops::Range;
|
||||
use crate::mdl::{BoneHeader, SourceBoneTransformHeader};
|
||||
|
||||
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
||||
#[repr(C)]
|
||||
|
|
@ -26,9 +28,8 @@ pub struct StudioHeader2 {
|
|||
impl ReadableRelative for StudioHeader2 {}
|
||||
|
||||
impl StudioHeader2 {
|
||||
pub fn source_bone_transforms(&self) -> Range<i32> {
|
||||
self.source_bone_transform_index
|
||||
..(self.source_bone_transform_index + self.source_bone_transform_count)
|
||||
pub fn source_bone_transforms(&self) -> impl Iterator<Item = usize> {
|
||||
index_range(self.source_bone_transform_index, self.source_bone_transform_count, size_of::<SourceBoneTransformHeader>())
|
||||
}
|
||||
|
||||
pub fn bone_flex_drivers(&self) -> Range<i32> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue