mirror of
https://github.com/redstrate/Physis.git
synced 2025-04-23 21:17:45 +00:00
Begin work on implementing MDL write support
This commit is contained in:
parent
09c0d199f2
commit
3d621d3588
1 changed files with 27 additions and 11 deletions
38
src/model.rs
38
src/model.rs
|
@ -2,8 +2,9 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
use std::io::{Cursor, Seek, SeekFrom};
|
use std::io::{Cursor, Seek, SeekFrom};
|
||||||
|
use std::ptr::write;
|
||||||
|
|
||||||
use binrw::{BinResult, binrw};
|
use binrw::{BinResult, binrw, BinWrite};
|
||||||
use binrw::BinRead;
|
use binrw::BinRead;
|
||||||
use binrw::BinReaderExt;
|
use binrw::BinReaderExt;
|
||||||
use half::f16;
|
use half::f16;
|
||||||
|
@ -40,7 +41,7 @@ pub struct ModelFileHeader {
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[brw(repr = u8)]
|
#[brw(repr = u8)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
enum ModelFlags1 {
|
enum ModelFlags1 {
|
||||||
DustOcclusionEnabled = 0x80,
|
DustOcclusionEnabled = 0x80,
|
||||||
SnowOcclusionEnabled = 0x40,
|
SnowOcclusionEnabled = 0x40,
|
||||||
|
@ -54,7 +55,7 @@ enum ModelFlags1 {
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[brw(repr = u8)]
|
#[brw(repr = u8)]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
enum ModelFlags2 {
|
enum ModelFlags2 {
|
||||||
None = 0x0,
|
None = 0x0,
|
||||||
Unknown2 = 0x80,
|
Unknown2 = 0x80,
|
||||||
|
@ -68,7 +69,7 @@ enum ModelFlags2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub struct ModelHeader {
|
pub struct ModelHeader {
|
||||||
#[br(pad_after = 2)]
|
#[br(pad_after = 2)]
|
||||||
|
@ -113,7 +114,7 @@ pub struct ModelHeader {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
struct MeshLod {
|
struct MeshLod {
|
||||||
mesh_index: u16,
|
mesh_index: u16,
|
||||||
|
@ -148,7 +149,7 @@ struct MeshLod {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
struct Mesh {
|
struct Mesh {
|
||||||
#[br(pad_after = 2)]
|
#[br(pad_after = 2)]
|
||||||
|
@ -169,7 +170,7 @@ struct Mesh {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
struct Submesh {
|
struct Submesh {
|
||||||
index_offset: i32,
|
index_offset: i32,
|
||||||
|
@ -182,7 +183,7 @@ struct Submesh {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
struct BoneTable {
|
struct BoneTable {
|
||||||
bone_indices: [u16; 64],
|
bone_indices: [u16; 64],
|
||||||
|
@ -192,7 +193,7 @@ struct BoneTable {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
struct BoundingBox {
|
struct BoundingBox {
|
||||||
min: [f32; 4],
|
min: [f32; 4],
|
||||||
|
@ -200,7 +201,7 @@ struct BoundingBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
#[brw(little)]
|
#[brw(little)]
|
||||||
struct ModelData {
|
struct ModelData {
|
||||||
|
@ -255,7 +256,7 @@ struct ModelData {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
struct ElementId {
|
struct ElementId {
|
||||||
element_id: u32,
|
element_id: u32,
|
||||||
|
@ -326,6 +327,8 @@ pub struct Lod {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct MDL {
|
pub struct MDL {
|
||||||
|
file_header: ModelFileHeader,
|
||||||
|
|
||||||
pub lods: Vec<Lod>,
|
pub lods: Vec<Lod>,
|
||||||
pub affected_bone_names: Vec<String>,
|
pub affected_bone_names: Vec<String>,
|
||||||
pub material_names: Vec<String>
|
pub material_names: Vec<String>
|
||||||
|
@ -521,12 +524,25 @@ impl MDL {
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(MDL {
|
Some(MDL {
|
||||||
|
file_header: model_file_header,
|
||||||
lods,
|
lods,
|
||||||
affected_bone_names,
|
affected_bone_names,
|
||||||
material_names
|
material_names
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn write_to_buffer(&self) -> Option<MemoryBuffer> {
|
||||||
|
let mut buffer = MemoryBuffer::new();
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut cursor = Cursor::new(&mut buffer);
|
||||||
|
|
||||||
|
self.file_header.write(&mut cursor).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(buffer)
|
||||||
|
}
|
||||||
|
|
||||||
fn read_byte_float4(cursor: &mut Cursor<&MemoryBuffer>) -> Option<[f32; 4]> {
|
fn read_byte_float4(cursor: &mut Cursor<&MemoryBuffer>) -> Option<[f32; 4]> {
|
||||||
let mut arr: [f32; 4] = [0.0; 4];
|
let mut arr: [f32; 4] = [0.0; 4];
|
||||||
for i in 0..4 {
|
for i in 0..4 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue