diff options
Diffstat (limited to 'exporter/src/bin/textures.rs')
-rw-r--r-- | exporter/src/bin/textures.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/exporter/src/bin/textures.rs b/exporter/src/bin/textures.rs new file mode 100644 index 0000000..2e077fe --- /dev/null +++ b/exporter/src/bin/textures.rs @@ -0,0 +1,55 @@ +use anyhow::anyhow; +use log::warn; +use std::{ + env::args, + fs::{File, create_dir_all}, + io::BufReader, +}; +use unity_tools::{ + classes::texture2d::Texture2D, object::parser::FromValue, 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 mut fs = UnityFS::open(file())?; + let mut fs2 = UnityFS::open(file())?; + + let mut i = 0; + create_dir_all("/tmp/a").unwrap(); + + let cabfile = fs + .find_main_file() + .ok_or(anyhow!("no CAB file found"))? + .to_owned(); + + let mut cab = fs.read(&cabfile)?; + let mut file = SerializedFile::read(&mut cab)?; + for ob in file.objects.clone() { + if file.get_object_type_tree(&ob)?.type_string != "Texture2D" { + continue; + } + let value = file.read_object(ob)?; + let mut texture = Texture2D::from_value(value)?; + if texture.image_data.is_empty() { + texture.image_data = texture.stream_data.read(&mut fs2)?; + } + let path = format!( + "/tmp/a/{}_{i}.png", + texture.name.replace("/", "-").replace(".", "-") + ); + match texture.to_image() { + Ok(im) => { + if !im.as_rgba32f().is_some() { + im.save(&path).unwrap(); + println!("{path}"); + } + } + Err(e) => warn!("{e}"), + } + i += 1; + } + + Ok(()) +} |