diff options
Diffstat (limited to 'src/bin/meshes.rs')
-rw-r--r-- | src/bin/meshes.rs | 56 |
1 files changed, 24 insertions, 32 deletions
diff --git a/src/bin/meshes.rs b/src/bin/meshes.rs index f2b4edf..d59b496 100644 --- a/src/bin/meshes.rs +++ b/src/bin/meshes.rs @@ -3,11 +3,11 @@ use anyhow::anyhow; use std::{ env::args, fs::{File, create_dir_all}, - io::{BufReader, BufWriter, Seek, SeekFrom, Write}, + io::{BufReader, BufWriter, Write}, }; use unity_tools::{ classes::mesh::{Mesh, VertexDataChannel}, - object::{parser::FromValue, read::read_value}, + object::parser::FromValue, serialized_file::SerializedFile, unityfs::UnityFS, }; @@ -29,39 +29,31 @@ fn main() -> anyhow::Result<()> { .to_owned(); let mut cab = fs.read(&cabfile)?; - let file = SerializedFile::read(&mut cab)?; - for ob in file.objects { - cab.seek(SeekFrom::Start(ob.data_offset))?; - let typetree = if ob.type_id < 0 { - unimplemented!() - } else { - &file.types[ob.type_id as usize] - }; - if let Some(typetree) = &typetree.type_tree { - if typetree.type_string != "Mesh" { - continue; - } - let value = read_value(typetree, file.endianness, &mut cab)?; - let mesh = Mesh::from_value(value).unwrap(); - let mut obj = BufWriter::new(File::create(format!( - "/tmp/a/{}_{i}.obj", - mesh.name.replace("/", "-").replace(".", "-") - ))?); + let mut file = SerializedFile::read(&mut cab)?; + for ob in file.objects.clone() { + if file.get_object_type_tree(&ob)?.type_string != "Mesh" { + continue; + } + let value = file.read_object(ob)?; + let mesh = Mesh::from_value(value).unwrap(); + let mut obj = BufWriter::new(File::create(format!( + "/tmp/a/{}_{i}.obj", + mesh.name.replace("/", "-").replace(".", "-") + ))?); - let (pos_dims, positions) = mesh - .vertex_data - .read_channel(VertexDataChannel::Position) - .unwrap(); - assert_eq!(pos_dims, 3); + let (pos_dims, positions) = mesh + .vertex_data + .read_channel(VertexDataChannel::Position) + .unwrap(); + assert_eq!(pos_dims, 3); - for [x, y, z] in positions.array_chunks() { - writeln!(obj, "v {x} {y} {z}")?; - } - for [a, b, c] in mesh.read_indecies() { - writeln!(obj, "f {} {} {}", a + 1, b + 1, c + 1)?; - } - i += 1; + for [x, y, z] in positions.array_chunks() { + writeln!(obj, "v {x} {y} {z}")?; + } + for [a, b, c] in mesh.read_indecies() { + writeln!(obj, "f {} {} {}", a + 1, b + 1, c + 1)?; } + i += 1; } Ok(()) |