Files
skate-3-rust-engine/crates/skate-data/examples/xex_unpack.rs
T
Hails b1d26230a8 Water rendering: extract the ocean animation table from default.xex
Water and ocean shaders need assets/private/ocean-pca.json, which setup
never created, so 52 water/ocean materials rendered static (or black).

- skate_data::xex: XEX2 unpacker (retail AES file key + CBC payload, LZX
  or basic decompression), no new dependencies
- skate_data::ocean_pca: locates cPCAWaterAnimationData's table in any
  build by its code addressing (disc build: 0x82FC3978; TU3: 0x830118D8)
- skate3rust --extract-ocean-pca <default.xex> <out.json>
- Setup environment group runs it (optional content); refreshes that group

In-play check of the rendered water still pending.
See docs/hails-additions/09-water.md.
2026-10-01 01:55:40 -06:00

27 lines
1.0 KiB
Rust

//! Unpacks a retail XEX2 to its mapped base image and locates the ocean PCA table.
//! Usage: cargo run -p skate-data --example xex_unpack -- <default.xex> [<image.bin>]
fn main() {
let args: Vec<_> = std::env::args_os().skip(1).collect();
let xex = std::fs::read(&args[0]).expect("read XEX");
let started = std::time::Instant::now();
let image = skate_data::xex::XexImage::parse(&xex).unwrap_or_else(|e| panic!("{e}"));
println!(
"base 0x{:08X}, image {} bytes, {:.2} s",
image.base_address,
image.image.len(),
started.elapsed().as_secs_f64()
);
match skate_data::ocean_pca::extract(&image) {
Ok(pca) => println!(
"ocean PCA table at 0x{:08X}, frame 0 mean {:?}, {:.2} s",
pca.means_address,
pca.frames[0][0],
started.elapsed().as_secs_f64()
),
Err(e) => println!("ocean PCA: {e}"),
}
if let Some(out) = args.get(1) {
std::fs::write(out, &image.image).expect("write image");
}
}