mirror of
https://github.com/SK8-ENGINE/skate-3-rust-engine.git
synced 2026-10-26 19:47:44 +00:00
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.
27 lines
1.0 KiB
Rust
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");
|
|
}
|
|
}
|