mirror of
https://codeberg.org/icewind/vmdl.git
synced 2026-06-04 00:54:14 +02:00
use bytemuck for most reading
This commit is contained in:
parent
526efa83dc
commit
473d6eecc5
7 changed files with 109 additions and 69 deletions
|
|
@ -4,7 +4,7 @@ pub use raw::header::*;
|
|||
pub use raw::header2::*;
|
||||
|
||||
use crate::mdl::raw::{BodyPartHeader, Bone, MeshHeader, ModelHeader};
|
||||
use crate::{read_indexes, read_relative, FixedString, ModelError, ReadRelative};
|
||||
use crate::{read_indexes, read_relative, FixedString, ModelError, ReadRelative, Readable};
|
||||
use binrw::BinReaderExt;
|
||||
use std::io::Cursor;
|
||||
|
||||
|
|
@ -31,8 +31,7 @@ impl Mdl {
|
|||
data: "BodyPart",
|
||||
offset: index,
|
||||
})?;
|
||||
let mut reader = Cursor::new(data);
|
||||
let header = reader.read_le()?;
|
||||
let header = <BodyPartHeader as Readable>::read(data)?;
|
||||
BodyPart::read(data, header)
|
||||
})
|
||||
.collect::<Result<_>>()?,
|
||||
|
|
@ -73,7 +72,7 @@ impl ReadRelative for Model {
|
|||
fn read(data: &[u8], header: Self::Header) -> Result<Self> {
|
||||
Ok(Model {
|
||||
meshes: read_relative(data, header.mesh_indexes())?,
|
||||
name: header.name,
|
||||
name: header.name.try_into()?,
|
||||
ty: header.ty,
|
||||
bounding_radius: header.bounding_radius,
|
||||
vertex_offset: header.vertex_index,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
use crate::{index_range, FixedString};
|
||||
use crate::{index_range, FixedString, Pod};
|
||||
use crate::{Quaternion, RadianEuler, Vector};
|
||||
use binrw::BinRead;
|
||||
use bitflags::bitflags;
|
||||
use bytemuck::Zeroable;
|
||||
use std::mem::size_of;
|
||||
|
||||
pub mod header;
|
||||
|
|
@ -62,7 +63,8 @@ bitflags! {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, BinRead)]
|
||||
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
||||
#[repr(C)]
|
||||
pub struct BodyPartHeader {
|
||||
pub name_index: i32,
|
||||
model_count: i32,
|
||||
|
|
@ -80,10 +82,11 @@ impl BodyPartHeader {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, BinRead)]
|
||||
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct ModelHeader {
|
||||
pub name: FixedString<64>,
|
||||
pub name: [u8; 64],
|
||||
pub ty: i32,
|
||||
pub bounding_radius: f32,
|
||||
mesh_count: i32,
|
||||
|
|
@ -99,7 +102,7 @@ pub struct ModelHeader {
|
|||
padding: [i32; 8],
|
||||
}
|
||||
|
||||
static_assertions::const_assert_eq!(size_of::<ModelHeader>() - size_of::<FixedString<0>>(), 148);
|
||||
static_assertions::const_assert_eq!(size_of::<ModelHeader>(), 148);
|
||||
|
||||
impl ModelHeader {
|
||||
pub fn mesh_indexes(&self) -> impl Iterator<Item = usize> {
|
||||
|
|
@ -107,7 +110,8 @@ impl ModelHeader {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, BinRead)]
|
||||
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct ModelVertexData {
|
||||
// these are pointers?
|
||||
|
|
@ -115,7 +119,8 @@ pub struct ModelVertexData {
|
|||
tangent_data: i32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, BinRead)]
|
||||
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct MeshHeader {
|
||||
material: i32,
|
||||
|
|
@ -132,7 +137,8 @@ pub struct MeshHeader {
|
|||
padding: [i32; 8],
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, BinRead)]
|
||||
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
||||
#[repr(C)]
|
||||
#[allow(dead_code)]
|
||||
pub struct MeshVertexData {
|
||||
// these are pointers?
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue