diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-12 22:39:58 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-12 22:39:58 +0100 |
commit | 5555c8bbefb4f52f5002603eb91b6c95cbdd97e4 (patch) | |
tree | 208e88359deb3cf5f7e2a4135693f12d76ad97e1 /src/classes/mesh.rs | |
parent | 4906844cbfd2717a29b434fb7d8f90c5117fddd5 (diff) | |
download | unity-tools-5555c8bbefb4f52f5002603eb91b6c95cbdd97e4.tar unity-tools-5555c8bbefb4f52f5002603eb91b6c95cbdd97e4.tar.bz2 unity-tools-5555c8bbefb4f52f5002603eb91b6c95cbdd97e4.tar.zst |
more parsing helpers
Diffstat (limited to 'src/classes/mesh.rs')
-rw-r--r-- | src/classes/mesh.rs | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/classes/mesh.rs b/src/classes/mesh.rs new file mode 100644 index 0000000..1d6889d --- /dev/null +++ b/src/classes/mesh.rs @@ -0,0 +1,128 @@ +use super::streaminginfo::StreamingInfo; +use crate::object::{Value, parser::FromValue}; +use anyhow::Result; +use glam::Mat4; +use serde::Serialize; + +#[derive(Debug, Serialize)] +pub struct Mesh { + pub name: String, + pub bind_pose: Vec<Mat4>, + pub bone_name_hashes: Vec<u32>, + pub index_format: i32, + pub index_buffer: Vec<u8>, + pub sub_meshes: Vec<SubMesh>, + pub stream_data: StreamingInfo, +} + +#[derive(Debug, Serialize)] +pub struct SubMesh { + pub topology: i32, + pub vertex_count: u32, + pub base_vertex: u32, + pub first_byte: u32, + pub first_vertex: u32, + pub index_count: u32, +} + +#[derive(Debug, Serialize)] +pub struct VertexData { + pub channels: Vec<ChannelInfo>, + pub data_size: Vec<u8>, + pub vertex_count: u32, +} + +#[derive(Debug, Serialize)] +pub struct ChannelInfo { + pub dimension: u8, + pub format: u8, + pub offset: u8, + pub stream: u8, +} + +impl FromValue for Mesh { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("Mesh").unwrap(); + Ok(Mesh { + name: fields.remove("m_Name").unwrap().parse().unwrap(), + index_format: fields.remove("m_IndexFormat").unwrap().parse().unwrap(), + index_buffer: fields + .remove("m_IndexBuffer") + .unwrap() + .as_vector() + .unwrap() + .into_iter() + .map(|e| e.as_u8().unwrap()) + .collect(), + sub_meshes: fields + .remove("m_SubMeshes") + .unwrap() + .as_vector() + .unwrap() + .into_iter() + .map(|e| e.parse().unwrap()) + .collect(), + stream_data: fields.remove("m_StreamData").unwrap().parse().unwrap(), + bind_pose: fields + .remove("m_BindPose") + .unwrap() + .as_vector() + .unwrap() + .into_iter() + .map(|e| e.parse().unwrap()) + .collect(), + bone_name_hashes: fields + .remove("m_BoneNameHashes") + .unwrap() + .as_vector() + .unwrap() + .into_iter() + .map(|e| e.parse().unwrap()) + .collect(), + }) + } +} + +impl FromValue for VertexData { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("VertexData").unwrap(); + Ok(VertexData { + vertex_count: fields.remove("vertexCount").unwrap().parse().unwrap(), + channels: fields + .remove("m_Channels") + .unwrap() + .as_array() + .unwrap() + .into_iter() + .map(|e| e.parse().unwrap()) + .collect(), + data_size: fields.remove("m_DataSize").unwrap().as_typeless().unwrap(), + }) + } +} + +impl FromValue for ChannelInfo { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("ChannelInfo").unwrap(); + Ok(ChannelInfo { + dimension: fields.remove("dimension").unwrap().parse().unwrap(), + format: fields.remove("format").unwrap().parse().unwrap(), + offset: fields.remove("offset").unwrap().parse().unwrap(), + stream: fields.remove("stream").unwrap().parse().unwrap(), + }) + } +} + +impl FromValue for SubMesh { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("SubMesh").unwrap(); + Ok(SubMesh { + topology: fields.remove("topology").unwrap().parse().unwrap(), + vertex_count: fields.remove("vertexCount").unwrap().parse().unwrap(), + base_vertex: fields.remove("baseVertex").unwrap().parse().unwrap(), + first_byte: fields.remove("firstByte").unwrap().parse().unwrap(), + first_vertex: fields.remove("firstVertex").unwrap().parse().unwrap(), + index_count: fields.remove("indexCount").unwrap().parse().unwrap(), + }) + } +} |