282 lines
7.1 KiB
Rust
282 lines
7.1 KiB
Rust
#[path = "support/macros.rs"]
|
|
#[macro_use]
|
|
mod macros;
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
|
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
|
|
|
|
use glam::{
|
|
DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4, Mat2, Mat3, Mat3A, Mat4, Quat, Vec2, Vec3,
|
|
Vec3A, Vec4,
|
|
};
|
|
|
|
pub trait Deg {
|
|
fn to_radians(self) -> Self;
|
|
}
|
|
|
|
impl Deg for f32 {
|
|
fn to_radians(self) -> f32 {
|
|
f32::to_radians(self)
|
|
}
|
|
}
|
|
|
|
impl Deg for f64 {
|
|
fn to_radians(self) -> f64 {
|
|
f64::to_radians(self)
|
|
}
|
|
}
|
|
|
|
/// Helper function for migrating away from `glam::angle::deg`.
|
|
#[allow(dead_code)]
|
|
#[inline]
|
|
pub fn deg<T: Deg>(angle: T) -> T {
|
|
angle.to_radians()
|
|
}
|
|
|
|
/// Helper function for migrating away from `glam::angle::rad`.
|
|
#[allow(dead_code)]
|
|
#[inline]
|
|
pub fn rad<T>(angle: T) -> T {
|
|
angle
|
|
}
|
|
|
|
/// Trait used by the `assert_approx_eq` macro for floating point comparisons.
|
|
pub trait FloatCompare<Rhs: ?Sized = Self> {
|
|
/// Return true if the absolute difference between `self` and `other` is
|
|
/// less then or equal to `max_abs_diff`.
|
|
fn approx_eq(&self, other: &Rhs, max_abs_diff: f32) -> bool;
|
|
/// Returns the absolute difference of `self` and `other` which is printed
|
|
/// if `assert_approx_eq` fails.
|
|
fn abs_diff(&self, other: &Rhs) -> Rhs;
|
|
}
|
|
|
|
impl FloatCompare for f32 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &f32, max_abs_diff: f32) -> bool {
|
|
(self - other).abs() <= max_abs_diff
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &f32) -> f32 {
|
|
(self - other).abs()
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for f64 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &f64, max_abs_diff: f32) -> bool {
|
|
(self - other).abs() <= max_abs_diff as f64
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &f64) -> f64 {
|
|
(self - other).abs()
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Mat2 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
Self::from_cols(
|
|
(self.x_axis - other.x_axis).abs(),
|
|
(self.y_axis - other.y_axis).abs(),
|
|
)
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for DMat2 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff as f64)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
Self::from_cols(
|
|
(self.x_axis - other.x_axis).abs(),
|
|
(self.y_axis - other.y_axis).abs(),
|
|
)
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Mat3 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
Self::from_cols(
|
|
(self.x_axis - other.x_axis).abs(),
|
|
(self.y_axis - other.y_axis).abs(),
|
|
(self.z_axis - other.z_axis).abs(),
|
|
)
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Mat3A {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
Self::from_cols(
|
|
(self.x_axis - other.x_axis).abs(),
|
|
(self.y_axis - other.y_axis).abs(),
|
|
(self.z_axis - other.z_axis).abs(),
|
|
)
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for DMat3 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff as f64)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
Self::from_cols(
|
|
(self.x_axis - other.x_axis).abs(),
|
|
(self.y_axis - other.y_axis).abs(),
|
|
(self.z_axis - other.z_axis).abs(),
|
|
)
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for DMat4 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff as f64)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
Self::from_cols(
|
|
(self.x_axis - other.x_axis).abs(),
|
|
(self.y_axis - other.y_axis).abs(),
|
|
(self.z_axis - other.z_axis).abs(),
|
|
(self.w_axis - other.w_axis).abs(),
|
|
)
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Mat4 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
Self::from_cols(
|
|
(self.x_axis - other.x_axis).abs(),
|
|
(self.y_axis - other.y_axis).abs(),
|
|
(self.z_axis - other.z_axis).abs(),
|
|
(self.w_axis - other.w_axis).abs(),
|
|
)
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Quat {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
let a: Vec4 = (*self).into();
|
|
let b: Vec4 = (*other).into();
|
|
Quat::from_vec4((a - b).abs())
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Vec2 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
(*self - *other).abs()
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Vec3 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
(*self - *other).abs()
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Vec3A {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
(*self - *other).abs()
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for Vec4 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
(*self - *other).abs()
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for DQuat {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff as f64)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
let a: DVec4 = (*self).into();
|
|
let b: DVec4 = (*other).into();
|
|
DQuat::from_vec4((a - b).abs())
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for DVec2 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff as f64)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
(*self - *other).abs()
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for DVec3 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff as f64)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
(*self - *other).abs()
|
|
}
|
|
}
|
|
|
|
impl FloatCompare for DVec4 {
|
|
#[inline]
|
|
fn approx_eq(&self, other: &Self, max_abs_diff: f32) -> bool {
|
|
self.abs_diff_eq(*other, max_abs_diff as f64)
|
|
}
|
|
#[inline]
|
|
fn abs_diff(&self, other: &Self) -> Self {
|
|
(*self - *other).abs()
|
|
}
|
|
}
|