runmat-meshing-core 0.6.0

Deterministic meshing preparation contracts for RunMat
Documentation
use super::*;

#[test]
fn aabb_contains_and_intersects_points() {
    let bounds = Aabb3::from_points(&[[0.0, 0.0, 0.0], [1.0, 2.0, 3.0]]).unwrap();

    assert!(bounds.contains_point([0.5, 1.0, 2.0]));
    assert!(!bounds.contains_point([2.0, 1.0, 2.0]));
    assert!(bounds.intersects(Aabb3::from_points(&[[0.5, 0.5, 0.5], [2.0, 2.0, 2.0]]).unwrap()));
    assert!(!bounds.intersects(Aabb3::from_points(&[[2.0, 2.0, 2.0], [3.0, 3.0, 3.0]]).unwrap()));
}

#[test]
fn linear_spatial_index_queries_deterministically() {
    let mut index = LinearSpatialIndex::new();
    index.insert(
        Aabb3::from_points(&[[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]]).unwrap(),
        "left",
    );
    index.insert(
        Aabb3::from_points(&[[2.0, 0.0, 0.0], [3.0, 1.0, 1.0]]).unwrap(),
        "right",
    );

    let hits = index
        .query_point([0.5, 0.5, 0.5])
        .map(|entry| entry.payload)
        .collect::<Vec<_>>();
    assert_eq!(hits, vec!["left"]);
    assert_eq!(
        index
            .nearest_by_center([2.8, 0.5, 0.5])
            .map(|entry| entry.payload),
        Some("right")
    );
}

#[test]
fn uniform_grid_spatial_index_filters_point_and_bounds_queries() {
    let entries = vec![
        SpatialEntry {
            bounds: Aabb3::from_points(&[[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]]).unwrap(),
            payload: "left",
        },
        SpatialEntry {
            bounds: Aabb3::from_points(&[[2.0, 0.0, 0.0], [3.0, 1.0, 1.0]]).unwrap(),
            payload: "right",
        },
    ];
    let index = UniformGridSpatialIndex::from_entries(entries);

    let point_hits = index
        .query_point([0.5, 0.5, 0.5])
        .into_iter()
        .map(|entry| entry.payload)
        .collect::<Vec<_>>();
    assert_eq!(point_hits, vec!["left"]);
    let bounds_hits = index
        .query_bounds(Aabb3::from_points(&[[2.5, 0.5, 0.5], [4.0, 0.6, 0.6]]).unwrap())
        .into_iter()
        .map(|entry| entry.payload)
        .collect::<Vec<_>>();
    assert_eq!(bounds_hits, vec!["right"]);
}

#[test]
fn uniform_grid_spatial_index_traverses_ray_cells() {
    let entries = vec![
        SpatialEntry {
            bounds: Aabb3::from_points(&[[0.0, 0.0, 0.0], [0.25, 0.25, 0.25]]).unwrap(),
            payload: "near",
        },
        SpatialEntry {
            bounds: Aabb3::from_points(&[[0.0, 1.0, 0.0], [0.25, 1.25, 0.25]]).unwrap(),
            payload: "off-axis",
        },
        SpatialEntry {
            bounds: Aabb3::from_points(&[[2.0, 0.0, 0.0], [2.25, 0.25, 0.25]]).unwrap(),
            payload: "far",
        },
    ];
    let index = UniformGridSpatialIndex::from_entries(entries);

    let hits = index
        .query_ray([-1.0, 0.1, 0.1], [1.0, 0.0, 0.0])
        .into_iter()
        .map(|entry| entry.payload)
        .collect::<Vec<_>>();

    assert_eq!(hits, vec!["near", "far"]);
}

#[test]
fn uniform_grid_spatial_index_rejects_parallel_ray_outside_bounds() {
    let index = UniformGridSpatialIndex::from_entries(vec![SpatialEntry {
        bounds: Aabb3::from_points(&[[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]]).unwrap(),
        payload: "inside",
    }]);

    assert!(index
        .query_ray([-1.0, 2.0, 0.5], [1.0, 0.0, 0.0])
        .is_empty());
}