mirror of
https://codeberg.org/icewind/vmdl.git
synced 2026-06-03 08:34:23 +02:00
header cleanup
This commit is contained in:
parent
2cb245f838
commit
cfba159890
5 changed files with 43 additions and 54 deletions
|
|
@ -83,6 +83,7 @@
|
||||||
clippy
|
clippy
|
||||||
cargo-audit
|
cargo-audit
|
||||||
cargo-msrv
|
cargo-msrv
|
||||||
|
cargo-semver-checks
|
||||||
] ++ exampleBuildInputs;
|
] ++ exampleBuildInputs;
|
||||||
|
|
||||||
LD_LIBRARY_PATH = with pkgs; "/run/opengl-driver/lib/:${lib.makeLibraryPath ([libGL libGLU])}";
|
LD_LIBRARY_PATH = with pkgs; "/run/opengl-driver/lib/:${lib.makeLibraryPath ([libGL libGLU])}";
|
||||||
|
|
|
||||||
22
src/lib.rs
22
src/lib.rs
|
|
@ -119,20 +119,10 @@ impl Model {
|
||||||
|
|
||||||
/// Calculate bounding coordinates of the model
|
/// Calculate bounding coordinates of the model
|
||||||
pub fn bounding_box(&self) -> (Vector, Vector) {
|
pub fn bounding_box(&self) -> (Vector, Vector) {
|
||||||
let mut min = Vector::from([f32::MAX, f32::MAX, f32::MAX]);
|
(
|
||||||
let mut max = Vector::from([f32::MIN, f32::MIN, f32::MIN]);
|
self.mdl.header.bounding_box[0],
|
||||||
|
self.mdl.header.bounding_box[1],
|
||||||
for point in self.vertices() {
|
)
|
||||||
let p = point.position;
|
|
||||||
min.x = f32::min(min.x, p.x);
|
|
||||||
min.y = f32::min(min.y, p.y);
|
|
||||||
min.z = f32::min(min.z, p.z);
|
|
||||||
|
|
||||||
max.x = f32::max(max.x, p.x);
|
|
||||||
max.y = f32::max(max.y, p.y);
|
|
||||||
max.z = f32::max(max.z, p.z);
|
|
||||||
}
|
|
||||||
(min, max)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn name(&self) -> &str {
|
pub fn name(&self) -> &str {
|
||||||
|
|
@ -147,8 +137,8 @@ impl Model {
|
||||||
self.bones()
|
self.bones()
|
||||||
.next()
|
.next()
|
||||||
.map(|bone| Quaternion::from(bone.rot))
|
.map(|bone| Quaternion::from(bone.rot))
|
||||||
.map(|rotation| Matrix4::from(rotation))
|
.map(Matrix4::from)
|
||||||
.unwrap_or_else(|| Matrix4::identity())
|
.unwrap_or_else(Matrix4::identity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ pub struct BoneHeader {
|
||||||
pub proc_index: i32, // procedural rule
|
pub proc_index: i32, // procedural rule
|
||||||
pub physics_bone: i32, // index into physically simulated bone
|
pub physics_bone: i32, // index into physically simulated bone
|
||||||
pub surface_prop_idx: i32, // index into string table for property name
|
pub surface_prop_idx: i32, // index into string table for property name
|
||||||
pub contents: BoneContentFlags,
|
pub contents: ContentFlags,
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
reserved: [i32; 8], // remove as appropriate
|
reserved: [i32; 8], // remove as appropriate
|
||||||
|
|
@ -51,7 +51,7 @@ pub struct Bone {
|
||||||
pub procedural_rules: Option<ProceduralBone>,
|
pub procedural_rules: Option<ProceduralBone>,
|
||||||
pub physics_bone: i32, // index into physically simulated bone
|
pub physics_bone: i32, // index into physically simulated bone
|
||||||
pub surface_prop: String,
|
pub surface_prop: String,
|
||||||
pub contents: BoneContentFlags,
|
pub contents: ContentFlags,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ReadRelative for Bone {
|
impl ReadRelative for Bone {
|
||||||
|
|
@ -60,22 +60,22 @@ impl ReadRelative for Bone {
|
||||||
fn read(data: &[u8], header: Self::Header) -> Result<Self, ModelError> {
|
fn read(data: &[u8], header: Self::Header) -> Result<Self, ModelError> {
|
||||||
let name_bytes =
|
let name_bytes =
|
||||||
data.get(header.sz_name_index as usize..)
|
data.get(header.sz_name_index as usize..)
|
||||||
.ok_or_else(|| ModelError::OutOfBounds {
|
.ok_or(ModelError::OutOfBounds {
|
||||||
data: "bone name",
|
data: "bone name",
|
||||||
offset: header.sz_name_index as usize,
|
offset: header.sz_name_index as usize,
|
||||||
})?;
|
})?;
|
||||||
let surface_prop_bytes = data
|
let surface_prop_bytes =
|
||||||
.get(header.surface_prop_idx as usize..)
|
data.get(header.surface_prop_idx as usize..)
|
||||||
.ok_or_else(|| ModelError::OutOfBounds {
|
.ok_or(ModelError::OutOfBounds {
|
||||||
data: "bone surface property",
|
data: "bone surface property",
|
||||||
offset: header.surface_prop_idx as usize,
|
offset: header.surface_prop_idx as usize,
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let prop_type = ProceduralBoneType::try_from(header.proc_type).ok();
|
let prop_type = ProceduralBoneType::try_from(header.proc_type).ok();
|
||||||
let proc_bytes = (header.proc_index != 0)
|
let proc_bytes = (header.proc_index != 0)
|
||||||
.then(|| {
|
.then(|| {
|
||||||
data.get(header.proc_index as usize..)
|
data.get(header.proc_index as usize..)
|
||||||
.ok_or_else(|| ModelError::OutOfBounds {
|
.ok_or(ModelError::OutOfBounds {
|
||||||
data: "bone surface property",
|
data: "bone surface property",
|
||||||
offset: header.proc_index as usize,
|
offset: header.proc_index as usize,
|
||||||
})
|
})
|
||||||
|
|
@ -272,10 +272,10 @@ bitflags! {
|
||||||
|
|
||||||
#[derive(Zeroable, Pod, Copy, Clone, Debug)]
|
#[derive(Zeroable, Pod, Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct BoneContentFlags(u32);
|
pub struct ContentFlags(u32);
|
||||||
|
|
||||||
bitflags! {
|
bitflags! {
|
||||||
impl BoneContentFlags: u32 {
|
impl ContentFlags: u32 {
|
||||||
const CONTENTS_SOLID = 0x01;
|
const CONTENTS_SOLID = 0x01;
|
||||||
const CONTENTS_WINDOW = 0x02;
|
const CONTENTS_WINDOW = 0x02;
|
||||||
const CONTENTS_AUX = 0x04;
|
const CONTENTS_AUX = 0x04;
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,8 @@ pub struct StudioHeader {
|
||||||
|
|
||||||
pub eye_position: Vector, // Position of player viewpoint relative to model origin
|
pub eye_position: Vector, // Position of player viewpoint relative to model origin
|
||||||
pub illumination_position: Vector, // Position (relative to model origin) used to calculate ambient light contribution and cubemap reflections for the entire model.
|
pub illumination_position: Vector, // Position (relative to model origin) used to calculate ambient light contribution and cubemap reflections for the entire model.
|
||||||
pub hull_min: Vector, // Corner of model hull box with the least X/Y/Z values
|
pub bounding_box: [Vector; 2],
|
||||||
pub hull_max: Vector, // Opposite corner of model hull box
|
pub view_bounding_box: [Vector; 2],
|
||||||
pub view_bb_min: Vector,
|
|
||||||
pub view_bb_max: Vector,
|
|
||||||
|
|
||||||
pub flags: ModelFlags,
|
pub flags: ModelFlags,
|
||||||
|
|
||||||
|
|
@ -43,8 +41,8 @@ pub struct StudioHeader {
|
||||||
local_seq_count: i32,
|
local_seq_count: i32,
|
||||||
local_seq_offset: i32,
|
local_seq_offset: i32,
|
||||||
|
|
||||||
pub activity_list_version: i32, // ??
|
activity_list_version: i32, // ??
|
||||||
pub events_indexed: i32, // ??
|
events_indexed: i32, // ??
|
||||||
|
|
||||||
// VMT texture filenames
|
// VMT texture filenames
|
||||||
// mstudiotexture_t
|
// mstudiotexture_t
|
||||||
|
|
@ -58,9 +56,9 @@ pub struct StudioHeader {
|
||||||
texture_dir_offset: i32,
|
texture_dir_offset: i32,
|
||||||
|
|
||||||
// Each skin-family assigns a texture-id to a skin location
|
// Each skin-family assigns a texture-id to a skin location
|
||||||
pub skin_reference_count: i32,
|
pub(crate) skin_reference_count: i32,
|
||||||
pub skin_family_count: i32,
|
pub(crate) skin_family_count: i32,
|
||||||
pub skin_reference_offset: i32,
|
pub(crate) skin_reference_offset: i32,
|
||||||
|
|
||||||
// mstudiobodyparts_t
|
// mstudiobodyparts_t
|
||||||
body_part_count: i32,
|
body_part_count: i32,
|
||||||
|
|
@ -109,7 +107,7 @@ pub struct StudioHeader {
|
||||||
* from the start of the file.
|
* from the start of the file.
|
||||||
*/
|
*/
|
||||||
// Surface property value (single null-terminated string)
|
// Surface property value (single null-terminated string)
|
||||||
pub surface_prop_index: i32,
|
surface_prop_index: i32,
|
||||||
|
|
||||||
// Unusual: In this one index comes first, then count.
|
// Unusual: In this one index comes first, then count.
|
||||||
// Key-value mdl is a series of strings. If you can't find
|
// Key-value mdl is a series of strings. If you can't find
|
||||||
|
|
@ -122,8 +120,8 @@ pub struct StudioHeader {
|
||||||
ik_lock_count: i32,
|
ik_lock_count: i32,
|
||||||
ik_lock_index: i32,
|
ik_lock_index: i32,
|
||||||
|
|
||||||
pub mass: f32, // Mass of object (4-bytes)
|
pub mass: f32, // Mass of object (4-bytes)
|
||||||
pub contents: i32, // ??
|
pub contents: ContentFlags, // ??
|
||||||
|
|
||||||
// Other models can be referenced for re-used sequences and animations
|
// Other models can be referenced for re-used sequences and animations
|
||||||
// (See also: The $includemodel QC option.)
|
// (See also: The $includemodel QC option.)
|
||||||
|
|
@ -131,7 +129,7 @@ pub struct StudioHeader {
|
||||||
include_model_count: i32,
|
include_model_count: i32,
|
||||||
include_model_index: i32,
|
include_model_index: i32,
|
||||||
|
|
||||||
pub virtual_model: i32, // Placeholder for mutable-void*
|
virtual_model: i32, // Placeholder for mutable-void*
|
||||||
// Note that the SDK only compiles as 32-bit, so an int and a pointer are the same size (4 bytes)
|
// Note that the SDK only compiles as 32-bit, so an int and a pointer are the same size (4 bytes)
|
||||||
|
|
||||||
// mstudioanimblock_t
|
// mstudioanimblock_t
|
||||||
|
|
@ -139,35 +137,35 @@ pub struct StudioHeader {
|
||||||
anim_blocks_count: i32,
|
anim_blocks_count: i32,
|
||||||
anim_blocks_index: i32,
|
anim_blocks_index: i32,
|
||||||
|
|
||||||
pub anim_block_model: i32, // Placeholder for mutable-void*
|
anim_block_model: i32, // Placeholder for mutable-void*
|
||||||
|
|
||||||
// Points to a series of bytes?
|
// Points to a series of bytes?
|
||||||
pub bone_table_name_index: i32,
|
bone_table_name_index: i32,
|
||||||
|
|
||||||
pub vertex_base: i32, // Placeholder for void*
|
vertex_base: i32, // Placeholder for void*
|
||||||
pub offset_base: i32, // Placeholder for void*
|
offset_base: i32, // Placeholder for void*
|
||||||
|
|
||||||
// Used with $constantdirectionallight from the QC
|
// Used with $constantdirectionallight from the QC
|
||||||
// Model should have flag #13 set if enabled
|
// Model should have flag #13 set if enabled
|
||||||
pub directional_dot_product: u8,
|
directional_dot_product: u8,
|
||||||
|
|
||||||
pub root_lod: u8, // Preferred rather than clamped
|
root_lod: u8, // Preferred rather than clamped
|
||||||
|
|
||||||
// 0 means any allowed, N means Lod 0 -> (N-1)
|
// 0 means any allowed, N means Lod 0 -> (N-1)
|
||||||
pub num_allowed_root_lods: u8,
|
num_allowed_root_lods: u8,
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
unused0: u8, // ??
|
unused0: u8, // ??
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
unused1: i32, // ??
|
unused1: i32, // ??
|
||||||
|
|
||||||
pub flex_controller_ui_count: i32,
|
flex_controller_ui_count: i32,
|
||||||
pub flex_controller_ui_index: i32,
|
flex_controller_ui_index: i32,
|
||||||
|
|
||||||
pub vert_anim_fixed_point_scale: f32,
|
vert_anim_fixed_point_scale: f32,
|
||||||
pub unused2: i32,
|
unused2: i32,
|
||||||
|
|
||||||
pub studio_hdr2_index: i32,
|
studio_hdr2_index: i32,
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
unused3: i32,
|
unused3: i32,
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use std::fmt;
|
||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
use std::ops::{Add, Mul};
|
use std::ops::{Add, Mul};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, Zeroable, Pod)]
|
#[derive(Debug, Clone, Copy, Zeroable, Pod, PartialEq)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct Vector {
|
pub struct Vector {
|
||||||
pub x: f32,
|
pub x: f32,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue