gemath 0.1.0

Type-safe game math with type-level units/spaces, typed angles, and explicit fallible ops (plus optional geometry/collision).
Documentation
//! `mint` conversions (feature-gated).
//!
//! Enable via `features = ["mint"]`.

use crate::{mat2::Mat2, mat3::Mat3, mat4::Mat4, quat::Quat, vec2::Vec2, vec3::Vec3, vec4::Vec4};

use mint::{
    ColumnMatrix2, ColumnMatrix3, ColumnMatrix4, IntoMint, Quaternion, Vector2, Vector3, Vector4,
};

// --- Vec conversions ---

impl<Unit: Copy, Space: Copy> From<Vector2<f32>> for Vec2<Unit, Space> {
    #[inline]
    fn from(v: Vector2<f32>) -> Self {
        Self::new(v.x, v.y)
    }
}

impl<Unit: Copy, Space: Copy> From<Vec2<Unit, Space>> for Vector2<f32> {
    #[inline]
    fn from(v: Vec2<Unit, Space>) -> Self {
        Self { x: v.x, y: v.y }
    }
}

impl<Unit: Copy, Space: Copy> IntoMint for Vec2<Unit, Space> {
    type MintType = Vector2<f32>;
}

impl<Unit: Copy, Space: Copy> From<Vector3<f32>> for Vec3<Unit, Space> {
    #[inline]
    fn from(v: Vector3<f32>) -> Self {
        Self::new(v.x, v.y, v.z)
    }
}

impl<Unit: Copy, Space: Copy> From<Vec3<Unit, Space>> for Vector3<f32> {
    #[inline]
    fn from(v: Vec3<Unit, Space>) -> Self {
        Self { x: v.x, y: v.y, z: v.z }
    }
}

impl<Unit: Copy, Space: Copy> IntoMint for Vec3<Unit, Space> {
    type MintType = Vector3<f32>;
}

impl<Unit: Copy, Space: Copy> From<Vector4<f32>> for Vec4<Unit, Space> {
    #[inline]
    fn from(v: Vector4<f32>) -> Self {
        Self::new(v.x, v.y, v.z, v.w)
    }
}

impl<Unit: Copy, Space: Copy> From<Vec4<Unit, Space>> for Vector4<f32> {
    #[inline]
    fn from(v: Vec4<Unit, Space>) -> Self {
        Self {
            x: v.x,
            y: v.y,
            z: v.z,
            w: v.w,
        }
    }
}

impl<Unit: Copy, Space: Copy> IntoMint for Vec4<Unit, Space> {
    type MintType = Vector4<f32>;
}

// --- Mat conversions (column-major) ---

impl<Unit: Copy, Space: Copy> From<ColumnMatrix2<f32>> for Mat2<Unit, Space> {
    #[inline]
    fn from(m: ColumnMatrix2<f32>) -> Self {
        Self::new(m.x.into(), m.y.into())
    }
}

impl<Unit: Copy, Space: Copy> From<Mat2<Unit, Space>> for ColumnMatrix2<f32> {
    #[inline]
    fn from(m: Mat2<Unit, Space>) -> Self {
        Self {
            x: m.x_col.into(),
            y: m.y_col.into(),
        }
    }
}

impl<Unit: Copy, Space: Copy> IntoMint for Mat2<Unit, Space> {
    type MintType = ColumnMatrix2<f32>;
}

impl<Unit: Copy, Space: Copy> From<ColumnMatrix3<f32>> for Mat3<Unit, Space> {
    #[inline]
    fn from(m: ColumnMatrix3<f32>) -> Self {
        Self::new(m.x.into(), m.y.into(), m.z.into())
    }
}

impl<Unit: Copy, Space: Copy> From<Mat3<Unit, Space>> for ColumnMatrix3<f32> {
    #[inline]
    fn from(m: Mat3<Unit, Space>) -> Self {
        Self {
            x: m.x_col.into(),
            y: m.y_col.into(),
            z: m.z_col.into(),
        }
    }
}

impl<Unit: Copy, Space: Copy> IntoMint for Mat3<Unit, Space> {
    type MintType = ColumnMatrix3<f32>;
}

impl<Unit: Copy, Space: Copy> From<ColumnMatrix4<f32>> for Mat4<Unit, Space> {
    #[inline]
    fn from(m: ColumnMatrix4<f32>) -> Self {
        Self::new(m.x.into(), m.y.into(), m.z.into(), m.w.into())
    }
}

impl<Unit: Copy, Space: Copy> From<Mat4<Unit, Space>> for ColumnMatrix4<f32> {
    #[inline]
    fn from(m: Mat4<Unit, Space>) -> Self {
        Self {
            x: m.x_col.into(),
            y: m.y_col.into(),
            z: m.z_col.into(),
            w: m.w_col.into(),
        }
    }
}

impl<Unit: Copy, Space: Copy> IntoMint for Mat4<Unit, Space> {
    type MintType = ColumnMatrix4<f32>;
}

// --- Quat conversions ---
//
// mint uses scalar+vector parts: Quaternion { s, v }, where:
// - s = scalar component
// - v = vector component

impl<Unit: Copy, Space: Copy> From<Quaternion<f32>> for Quat<Unit, Space> {
    #[inline]
    fn from(q: Quaternion<f32>) -> Self {
        Self::new(q.v.x, q.v.y, q.v.z, q.s)
    }
}

impl<Unit: Copy, Space: Copy> From<Quat<Unit, Space>> for Quaternion<f32> {
    #[inline]
    fn from(q: Quat<Unit, Space>) -> Self {
        Self {
            s: q.w,
            v: Vector3 {
                x: q.x,
                y: q.y,
                z: q.z,
            },
        }
    }
}

impl<Unit: Copy, Space: Copy> IntoMint for Quat<Unit, Space> {
    type MintType = Quaternion<f32>;
}