mirror of
https://codeberg.org/icewind/vmdl.git
synced 2026-06-03 16:44:11 +02:00
attachements wip
This commit is contained in:
parent
49e7c7c628
commit
317518a821
3 changed files with 52 additions and 5 deletions
|
|
@ -4,11 +4,10 @@ pub use raw::header::*;
|
||||||
pub use raw::header2::*;
|
pub use raw::header2::*;
|
||||||
pub use raw::*;
|
pub use raw::*;
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
|
use bytemuck::{Pod, Zeroable};
|
||||||
|
|
||||||
use crate::vvd::Vertex;
|
use crate::vvd::Vertex;
|
||||||
use crate::{
|
use crate::{read_relative, read_relative_iter, read_single, FixedString, ModelError, ReadRelative, Readable, Transform3x4};
|
||||||
read_relative, read_relative_iter, read_single, FixedString, ModelError, ReadRelative, Readable,
|
|
||||||
};
|
|
||||||
|
|
||||||
type Result<T> = std::result::Result<T, ModelError>;
|
type Result<T> = std::result::Result<T, ModelError>;
|
||||||
|
|
||||||
|
|
@ -26,6 +25,7 @@ pub struct Mdl {
|
||||||
pub key_values: Option<String>,
|
pub key_values: Option<String>,
|
||||||
pub local_animations: Vec<AnimationDescription>,
|
pub local_animations: Vec<AnimationDescription>,
|
||||||
pub pose_parameters: Vec<PoseParameterDescription>,
|
pub pose_parameters: Vec<PoseParameterDescription>,
|
||||||
|
pub attachments: Vec<StudioAttachment>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mdl {
|
impl Mdl {
|
||||||
|
|
@ -62,6 +62,7 @@ impl Mdl {
|
||||||
.transpose()?;
|
.transpose()?;
|
||||||
let local_animations = read_relative(data, header.local_animation_indexes())?;
|
let local_animations = read_relative(data, header.local_animation_indexes())?;
|
||||||
let pose_parameters = read_relative(data, header.local_pose_param_indexes())?;
|
let pose_parameters = read_relative(data, header.local_pose_param_indexes())?;
|
||||||
|
let attachments = read_relative(data, header.attachment_indexes())?;
|
||||||
|
|
||||||
Ok(Mdl {
|
Ok(Mdl {
|
||||||
name,
|
name,
|
||||||
|
|
@ -86,6 +87,7 @@ impl Mdl {
|
||||||
key_values,
|
key_values,
|
||||||
pose_parameters,
|
pose_parameters,
|
||||||
local_animations,
|
local_animations,
|
||||||
|
attachments,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -166,3 +168,24 @@ impl ReadRelative for TextureInfo {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct StudioAttachment {
|
||||||
|
pub name: String,
|
||||||
|
pub flags: AttachmentFlags,
|
||||||
|
pub local_bone: i32,
|
||||||
|
pub local: Transform3x4,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ReadRelative for StudioAttachment {
|
||||||
|
type Header = StudioAttachmentHeader;
|
||||||
|
|
||||||
|
fn read(data: &[u8], header: Self::Header) -> Result<Self> {
|
||||||
|
Ok(StudioAttachment {
|
||||||
|
name: String::read(&data[header.name_index as usize..], ())?.replace('\\', "/"),
|
||||||
|
flags: header.flags,
|
||||||
|
local: header.local,
|
||||||
|
local_bone: header.local_bone,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -265,7 +265,7 @@ impl StudioHeader {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn attachment_indexes(&self) -> impl Iterator<Item = usize> {
|
pub fn attachment_indexes(&self) -> impl Iterator<Item = usize> {
|
||||||
index_range(self.attachment_offset, self.attachment_count, 1)
|
index_range(self.attachment_offset, self.attachment_count, size_of::<StudioAttachmentHeader>())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn local_node_indexes(&self) -> impl Iterator<Item = usize> {
|
pub fn local_node_indexes(&self) -> impl Iterator<Item = usize> {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{index_range, FixedString};
|
use crate::{index_range, FixedString, Transform3x4};
|
||||||
use crate::{ModelError, ReadRelative, Vector};
|
use crate::{ModelError, ReadRelative, Vector};
|
||||||
use bitflags::bitflags;
|
use bitflags::bitflags;
|
||||||
use bytemuck::{Pod, Zeroable};
|
use bytemuck::{Pod, Zeroable};
|
||||||
|
|
@ -109,3 +109,27 @@ pub struct MeshTexture {
|
||||||
}
|
}
|
||||||
|
|
||||||
static_assertions::const_assert_eq!(size_of::<MeshTexture>(), 16 * 4);
|
static_assertions::const_assert_eq!(size_of::<MeshTexture>(), 16 * 4);
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
||||||
|
#[repr(C)]
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub struct StudioAttachmentHeader {
|
||||||
|
pub name_index: i32,
|
||||||
|
pub flags: AttachmentFlags,
|
||||||
|
pub local_bone: i32,
|
||||||
|
pub local: Transform3x4,
|
||||||
|
pub padding: [i32; 8],
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Zeroable, Pod, Copy, Clone, Debug)]
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct AttachmentFlags(i32);
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
impl AttachmentFlags: i32 {
|
||||||
|
/// Vector48
|
||||||
|
const ATTACHMENT_WORLD_ALIGN = 0x10000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static_assertions::const_assert_eq!(size_of::<StudioAttachmentHeader>(), 23 * 4);
|
||||||
Loading…
Add table
Add a link
Reference in a new issue