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 test_file = if args.len() > 1 {
Path::new(&args[1]).to_path_buf()
} else {
Path::new(r"D:\Projects\Draco\output\sphere_cpp_encoded.drc").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]);
}
}