Function forsyth::order_triangles[][src]

pub fn order_triangles<Index>(indices: &[Index]) -> Result<Vec<Index>, Error> where
    Index: TryInto<usize> + Default + PartialEq + Copy
Expand description

Creates an ordered triangle index buffer.

A convenience function that wraps order_triangles_in_place to return a newly allocated ordered index buffer.

This is equivalent to calling order_triangles_in_place with default Config and cache_size of 32.

use forsyth::{Error,order_triangles};

// a triangle
assert_eq!(order_triangles(&[0, 1, 2]), Ok(vec![0, 1, 2]));
// a quad
assert_eq!(
    order_triangles(&[0_u32, 1, 2, 0, 2, 3]),
    Ok(vec![0, 1, 2, 0, 2, 3]),
);

assert_eq!(
    order_triangles(&Vec::<u32>::new()),
    Err(Error::IndicesNotTriples)
);
assert_eq!(
    order_triangles(&[0, 1]),
    Err(Error::IndicesNotTriples)
);
assert_eq!(
    order_triangles(&[0, 1, 2, 3]),
    Err(Error::IndicesNotTriples)
);

// Works with all (un-)signed integers
assert_eq!(
    order_triangles(&[0_u8, 1, 2, 3, 4, 5]),
    Ok(vec![0, 1, 2, 3, 4, 5])
);
assert_eq!(
    order_triangles(&[0_i16, 1, 2, 3, 4, 5]),
    Ok(vec![0, 1, 2, 3, 4, 5])
);
assert_eq!(
    order_triangles(&[0_u32, 1, 2, 3, 4, 5]),
    Ok(vec![0, 1, 2, 3, 4, 5])
);
assert_eq!(
    order_triangles(&[0_i64, 1, 2, 3, 4, 5]),
    Ok(vec![0, 1, 2, 3, 4, 5])
);
assert_eq!(
    order_triangles(&[0_usize, 1, 2, 3, 4, 5]),
    Ok(vec![0, 1, 2, 3, 4, 5])
);

// Indices can be sparse
assert_eq!(
    order_triangles(&[0_i8, 1, 2, 63, 64, 65]),
    Ok(vec![0, 1, 2, 63, 64, 65])
);

// Indices cannot be negative
assert_eq!(
   order_triangles(&[0_i8, -1, -2, 63, 64, 65]),
   Err(Error::IndexToUsizeConversion)
);