aboutsummaryrefslogtreecommitdiff
path: root/src/bin/meshes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/meshes.rs')
-rw-r--r--src/bin/meshes.rs56
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(())