diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-15 15:18:40 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-15 15:18:40 +0100 |
commit | d836e24357b81496c61f3cc9195ba36758523578 (patch) | |
tree | 0028aee5a453cc761dd39e92430a35c55147537f /exporter/src/bin/material_stats.rs | |
parent | 07fc3656274117c211ca0d6a54926d390a4d9b68 (diff) | |
download | unity-tools-d836e24357b81496c61f3cc9195ba36758523578.tar unity-tools-d836e24357b81496c61f3cc9195ba36758523578.tar.bz2 unity-tools-d836e24357b81496c61f3cc9195ba36758523578.tar.zst |
more abstraction around unityfs to read multiple files from a single reader
Diffstat (limited to 'exporter/src/bin/material_stats.rs')
-rw-r--r-- | exporter/src/bin/material_stats.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/exporter/src/bin/material_stats.rs b/exporter/src/bin/material_stats.rs new file mode 100644 index 0000000..3eb4dc0 --- /dev/null +++ b/exporter/src/bin/material_stats.rs @@ -0,0 +1,52 @@ +use anyhow::anyhow; +use std::{env::args, fs::File, io::BufReader}; +use unity_tools::{classes::material::Material, serialized_file::SerializedFile, unityfs::UnityFS}; + +fn main() -> anyhow::Result<()> { + env_logger::init_from_env("LOG"); + let file = BufReader::new(File::open(args().nth(1).unwrap()).unwrap()); + let fs = UnityFS::open(file)?; + + let mode = args().nth(2).unwrap(); + + let cabfile = fs + .find_main_file() + .ok_or(anyhow!("no CAB file found"))? + .to_owned(); + + let cab = fs.read(&cabfile)?; + let mut file = SerializedFile::read(cab)?; + let mut sharedassets = file + .find_fs_shared_assets(&fs) + .map(|n| { + let f = fs.read(&n)?; + let f = SerializedFile::read(f)?; + Ok::<_, anyhow::Error>(f) + }) + .transpose()?; + + for ob in file.objects.clone() { + if file.get_object_type_tree(&ob)?.type_string != "Material" { + continue; + } + let mat = file.read_object(ob)?.parse::<Material>()?; + + match mode.as_str() { + "material" => { + println!("{}", mat.name) + } + "shader" => { + println!( + "{}", + mat.shader + .load(&mut file, sharedassets.as_mut())? + .parsed + .name + ) + } + x => panic!("unknown mode {x:?}"), + } + } + + Ok(()) +} |