use draco_core::decoder_buffer::DecoderBuffer;
use draco_core::geometry_attribute::GeometryAttributeType;
use draco_core::mesh::Mesh;
use draco_core::mesh_decoder::MeshDecoder;
use std::path::Path;
fn main() {
let args: Vec<String> = std::env::args().collect();
let Some(path) = args.get(1) else {
eprintln!("usage: cargo run --example decode_drc -- <file.drc>");
std::process::exit(2);
};
let test_file = Path::new(path).to_path_buf();
let data = std::fs::read(&test_file).expect("Failed to read file");
let mut decoder = MeshDecoder::new();
let mut buffer = DecoderBuffer::new(&data);
let mut mesh = Mesh::new();
decoder
.decode(&mut buffer, &mut mesh)
.expect("Failed to decode");
println!(
"Decoded mesh: {} faces, {} points, {} attrs",
mesh.num_faces(),
mesh.num_points(),
mesh.num_attributes()
);
let pos_id = mesh.named_attribute_id(GeometryAttributeType::Position);
if pos_id >= 0 {
let pos_attr = mesh.attribute(pos_id);
let buffer = pos_attr.buffer();
let num_components = pos_attr.num_components() as usize;
let byte_stride = pos_attr.byte_stride() as usize;
let mut min_vals = [f32::MAX; 3];
let mut max_vals = [f32::MIN; 3];
for i in 0..pos_attr.size() {
let offset = i * byte_stride;
for c in 0..num_components.min(3) {
let bytes: [u8; 4] = buffer.data()[offset + c * 4..offset + c * 4 + 4]
.try_into()
.unwrap();
let val = f32::from_le_bytes(bytes);
if val < min_vals[c] {
min_vals[c] = val;
}
if val > max_vals[c] {
max_vals[c] = val;
}
}
}
println!("Position bounds:");
println!(" X: {} to {}", min_vals[0], max_vals[0]);
println!(" Y: {} to {}", min_vals[1], max_vals[1]);
println!(" Z: {} to {}", min_vals[2], max_vals[2]);
}
}