1
Fork 0
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:
Joshua Goins 2023-09-22 16:44:19 -04:00
parent 09c0d199f2
commit 3d621d3588

View file

@ -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 {