diff --git a/src/main.rs b/src/main.rs index b1c2eb0..bd67fd4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1104,11 +1104,36 @@ fn extract_textures(paths:Vec,vpk_path:std::path::PathBuf)-> let mut texture_file_name2=texture_file_name.clone(); texture_file_name.set_extension("vtf"); texture_file_name2.set_extension("vmt"); - println!("texture_name={:?}",texture_file_name); let mut found_texture=false; //LMAO imagine having to write type names - let mut f=|search_file_name,write_file_name|{ - if let Some(mut stuff)=match (zippyt.by_name(search_file_name),tree.get(search_file_name)){ + let write_image=|mut stuff,write_file_name|{ + let image=vtf::from_bytes(&mut stuff)?.highres_image.decode(0)?.to_rgba8(); + + let format=if image.width()%4!=0||image.height()%4!=0{ + image_dds::ImageFormat::R8G8B8A8Srgb + }else{ + image_dds::ImageFormat::BC7Srgb + }; + //this fails if the image dimensions are not a multiple of 4 + let dds = image_dds::dds_from_image( + &image, + format, + image_dds::Quality::Slow, + image_dds::Mipmaps::GeneratedAutomatic, + )?; + + //write dds + let mut dest=std::path::PathBuf::from("textures/dds"); + dest.push(write_file_name); + dest.set_extension("dds"); + std::fs::create_dir_all(dest.parent().unwrap())?; + let mut writer = std::io::BufWriter::new(std::fs::File::create(dest)?); + dds.write(&mut writer)?; + Ok::<(),anyhow::Error>(()) + }; + let mut find_stuff=|search_file_name|{ + //println!("search_file_name={}",search_file_name); + Ok::>,anyhow::Error>(match (zippyt.by_name(search_file_name),tree.get(search_file_name)){ (Ok(mut zip_file),None)=>{ let mut buf=Vec::new(); zip_file.read_to_end(&mut buf)?; @@ -1116,38 +1141,13 @@ fn extract_textures(paths:Vec,vpk_path:std::path::PathBuf)-> }, (_,Some(vpk_entry))=>Some(vpk_entry.get()?.to_vec()), _=>None, - }{ - found_texture=true; - thread_handles.push(s.spawn(move||{ - let image=vtf::from_bytes(&mut stuff)?.highres_image.decode(0)?.to_rgba8(); - - let format=if image.width()%4!=0||image.height()%4!=0{ - image_dds::ImageFormat::R8G8B8A8Srgb - }else{ - image_dds::ImageFormat::BC7Srgb - }; - //this fails if the image dimensions are not a multiple of 4 - let dds = image_dds::dds_from_image( - &image, - format, - image_dds::Quality::Slow, - image_dds::Mipmaps::GeneratedAutomatic, - )?; - - //write dds - let mut dest=std::path::PathBuf::from("textures/dds"); - dest.push(write_file_name); - dest.set_extension("dds"); - std::fs::create_dir_all(dest.parent().unwrap())?; - let mut writer = std::io::BufWriter::new(std::fs::File::create(dest)?); - dds.write(&mut writer)?; - Ok::<(),anyhow::Error>(()) - })); - } - Ok::<(),anyhow::Error>(()) + }) }; - f(texture_file_name.as_os_str().to_str().unwrap(),texture_name.clone())?; - f(texture_file_name2.as_os_str().to_str().unwrap(),texture_name.clone())?; + if let Some(stuff)=find_stuff(texture_file_name.as_os_str().to_str().unwrap())?{ + found_texture=true; + let texture_name=texture_name.clone(); + thread_handles.push(s.spawn(move||write_image(stuff,texture_name))); + } if !found_texture{ println!("no data"); }