makepad/libs/remesh/tests/loader.rs
Admin fbe877d746 Land glTF writers, remesh, PBR paint, and xatlas from rik2.
Animation/skin writers, COLOR_0, and the mesh tools the renderer uses.
2026-08-18 14:23:58 +02:00

79 lines
2.2 KiB
Rust

//! GLB loader + normalization parity: our f64 scene-graph loader vs the
//! trimesh force='mesh' + normalize + degenerate-filter pipeline captured in
//! the oracle dumps.
mod common;
use common::{faithc_ref_dir, FcDump};
use makepad_remesh::load_glb_normalized;
fn check_asset(name: &str) {
let Some(dir) = faithc_ref_dir() else {
eprintln!("SKIP {name}: local/faithc_ref not present");
return;
};
let glb_path = dir.join("faithc/assets/examples").join(format!("{name}.glb"));
let dump_path = dir.join("dumps").join(format!("{name}_r128.bin"));
if !glb_path.is_file() || !dump_path.is_file() {
eprintln!("SKIP {name}: asset or dump missing");
return;
}
let bytes = std::fs::read(&glb_path).unwrap();
let (mesh, _) = load_glb_normalized(&bytes, 0.05).unwrap();
let dump = FcDump::load(&dump_path).unwrap();
let ref_verts = dump.v3s("mesh_vertices");
let (_, ref_faces) = dump.i64("mesh_faces");
assert_eq!(mesh.positions.len(), ref_verts.len(), "{name}: vertex count");
assert_eq!(mesh.faces.len() * 3, ref_faces.len(), "{name}: face count");
let mut max_d = 0.0f32;
let mut exact = 0usize;
for (a, b) in mesh.positions.iter().zip(&ref_verts) {
let d = (a[0] - b[0])
.abs()
.max((a[1] - b[1]).abs())
.max((a[2] - b[2]).abs());
max_d = max_d.max(d);
if d == 0.0 {
exact += 1;
}
}
let mut faces_equal = true;
for (i, f) in mesh.faces.iter().enumerate() {
if [f[0] as i64, f[1] as i64, f[2] as i64]
!= [ref_faces[i * 3], ref_faces[i * 3 + 1], ref_faces[i * 3 + 2]]
{
faces_equal = false;
break;
}
}
println!(
"{name}: {} verts ({} bit-exact), max|d|={max_d:.3e}, faces equal: {faces_equal}",
mesh.positions.len(),
exact
);
assert!(faces_equal, "{name}: face arrays differ");
assert!(max_d <= 1e-6, "{name}: vertex diff {max_d:.3e}");
}
#[test]
fn loader_corgi() {
check_asset("corgi_traveller");
}
#[test]
fn loader_light_bulb() {
check_asset("light_bulb");
}
#[test]
fn loader_cloth() {
check_asset("cloth");
}
#[test]
fn loader_pirateship() {
check_asset("pirateship");
}