beevee: add Axis enum implementation
This commit is contained in:
parent
9c56134c67
commit
ca28281b67
170
beevee/src/axis.rs
Normal file
170
beevee/src/axis.rs
Normal file
|
@ -0,0 +1,170 @@
|
|||
use crate::{Point, Vector};
|
||||
use std::fmt::{Display, Formatter, Result};
|
||||
use std::ops::{Index, IndexMut};
|
||||
|
||||
/// An enum for indexing different spatial structures.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub enum Axis {
|
||||
/// The X axis.
|
||||
X = 0,
|
||||
/// The Y axis.
|
||||
Y = 1,
|
||||
/// The Z axis.
|
||||
Z = 2,
|
||||
}
|
||||
|
||||
/// Display implementation for [`Axis`].
|
||||
///
|
||||
/// [`Axis`]: enum.Axis.html
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// # use beevee::Axis;
|
||||
/// assert_eq!(format!("{}", Axis::X), "x");
|
||||
/// assert_eq!(format!("{}", Axis::Y), "y");
|
||||
/// assert_eq!(format!("{}", Axis::Z), "z");
|
||||
/// ```
|
||||
impl Display for Axis {
|
||||
fn fmt(&self, f: &mut Formatter) -> Result {
|
||||
write!(
|
||||
f,
|
||||
"{}",
|
||||
match *self {
|
||||
Axis::X => "x",
|
||||
Axis::Y => "y",
|
||||
Axis::Z => "z",
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/// Slice indexing implementation by [`Axis`]
|
||||
///
|
||||
/// [`Axis`]: enum.Axis.html
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// # use beevee::Axis;
|
||||
/// #
|
||||
/// let slice = &[0., 1., 2.];
|
||||
/// assert_eq!(slice[Axis::X], 0.);
|
||||
/// ```
|
||||
impl<T> Index<Axis> for [T] {
|
||||
type Output = T;
|
||||
|
||||
fn index(&self, axis: Axis) -> &Self::Output {
|
||||
&self[axis as usize]
|
||||
}
|
||||
}
|
||||
|
||||
/// Mutable slice indexing implementation by [`Axis`]
|
||||
///
|
||||
/// [`Axis`]: enum.Axis.html
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// # use beevee::Axis;
|
||||
/// #
|
||||
/// let slice = &mut [0., 1., 2.];
|
||||
/// slice[Axis::X] = 3.;
|
||||
/// assert_eq!(slice, &[3., 1., 2.]);
|
||||
/// ```
|
||||
impl<T> IndexMut<Axis> for [T] {
|
||||
fn index_mut(&mut self, axis: Axis) -> &mut T {
|
||||
&mut self[axis as usize]
|
||||
}
|
||||
}
|
||||
|
||||
/// [`Point`] indexing implementation by [`Axis`]
|
||||
///
|
||||
/// [`Axis`]: enum.Axis.html
|
||||
/// [`Point`]: type.Point.html
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// # use beevee::{Axis, Point};
|
||||
/// #
|
||||
/// let point = Point::new(0., 1., 2.);
|
||||
/// assert_eq!(point[Axis::X], 0.);
|
||||
/// ```
|
||||
impl Index<Axis> for Point {
|
||||
type Output = f32;
|
||||
|
||||
fn index(&self, axis: Axis) -> &Self::Output {
|
||||
match axis {
|
||||
Axis::X => &self.x,
|
||||
Axis::Y => &self.y,
|
||||
Axis::Z => &self.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Mutable [`Point`] indexing implementation by [`Axis`]
|
||||
///
|
||||
/// [`Axis`]: enum.Axis.html
|
||||
/// [`Point`]: type.Point.html
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// # use beevee::{Axis, Point};
|
||||
/// #
|
||||
/// let mut point = Point::new(0., 1., 2.);
|
||||
/// point[Axis::X] = 3.;
|
||||
/// assert_eq!(point, Point::new(3., 1., 2.));
|
||||
/// ```
|
||||
impl IndexMut<Axis> for Point {
|
||||
fn index_mut(&mut self, axis: Axis) -> &mut f32 {
|
||||
match axis {
|
||||
Axis::X => &mut self.x,
|
||||
Axis::Y => &mut self.y,
|
||||
Axis::Z => &mut self.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// [`Vector`] indexing implementation by [`Axis`]
|
||||
///
|
||||
/// [`Axis`]: enum.Axis.html
|
||||
/// [`Vector`]: type.Vector.html
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// # use beevee::{Axis, Vector};
|
||||
/// #
|
||||
/// let point = Vector::new(0., 1., 2.);
|
||||
/// assert_eq!(point[Axis::X], 0.);
|
||||
/// ```
|
||||
impl Index<Axis> for Vector {
|
||||
type Output = f32;
|
||||
|
||||
fn index(&self, axis: Axis) -> &Self::Output {
|
||||
match axis {
|
||||
Axis::X => &self.x,
|
||||
Axis::Y => &self.y,
|
||||
Axis::Z => &self.z,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Mutable [`Vector`] indexing implementation by [`Axis`]
|
||||
///
|
||||
/// [`Axis`]: enum.Axis.html
|
||||
/// [`Vector`]: type.Vector.html
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// # use beevee::{Axis, Vector};
|
||||
/// #
|
||||
/// let mut point = Vector::new(0., 1., 2.);
|
||||
/// point[Axis::X] = 3.;
|
||||
/// assert_eq!(point, Vector::new(3., 1., 2.));
|
||||
/// ```
|
||||
impl IndexMut<Axis> for Vector {
|
||||
fn index_mut(&mut self, axis: Axis) -> &mut f32 {
|
||||
match axis {
|
||||
Axis::X => &mut self.x,
|
||||
Axis::Y => &mut self.y,
|
||||
Axis::Z => &mut self.z,
|
||||
}
|
||||
}
|
||||
}
|
|
@ -15,6 +15,9 @@ pub type Vector = nalgebra::Vector3<f32>;
|
|||
/// The module relating to Axis-Aligned Bouding Boxes.
|
||||
pub mod aabb;
|
||||
|
||||
mod axis;
|
||||
pub use axis::*;
|
||||
|
||||
/// The module relating to Bouding Volume Hiearchy
|
||||
pub mod bvh;
|
||||
|
||||
|
|
Loading…
Reference in a new issue