mirror of
https://codeberg.org/icewind/vmdl.git
synced 2026-06-04 00:54:14 +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 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))
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue