molgfx-math 0.3.5

glam-based math foundation: cameras, projections, bounds, splines, transport frames.
Documentation
use super::*;
use crate::sample_catmull_rom;

#[test]
fn transported_frames_stay_orthonormal_and_continuous() {
    let points = [
        Vec3::ZERO,
        Vec3::X,
        Vec3::new(2.0, 1.0, 0.0),
        Vec3::new(3.0, 1.0, 1.0),
    ];
    let mut samples = Vec::new();
    sample_catmull_rom(&points, 0.01, 16, &mut samples);
    let mut frames = Vec::new();
    parallel_transport(&samples, &mut frames);
    assert_eq!(frames.len(), samples.len());
    for pair in frames.windows(2) {
        let frame = pair[1];
        assert!(frame.tangent.dot(frame.normal).abs() < 1e-5);
        assert!(frame.tangent.dot(frame.binormal).abs() < 1e-5);
        assert!(frame.normal.dot(frame.binormal).abs() < 1e-5);
        assert!(pair[0].normal.dot(pair[1].normal) >= 0.0, "frame flipped");
    }
}

#[test]
fn an_empty_trace_produces_no_frames() {
    let mut frames = Vec::new();
    parallel_transport(&[], &mut frames);
    assert!(frames.is_empty());
}