mod vector_ext;
#[cfg(feature = "f64")]
pub use f64 as Real;
#[cfg(feature = "f64")]
pub use i64 as Int;
#[cfg(feature = "f32")]
pub use f32 as Real;
#[cfg(feature = "f32")]
pub use i32 as Int;
pub use simba::scalar::{ComplexField, RealField};
pub use vector_ext::*;
pub use crate::simd::*;
#[cfg(feature = "f64")]
pub use glamx::{
DPose2 as Pose2, DPose3 as Pose3, DRot2 as Rot2, DRot3 as Rot3,
DSymmetricEigen2 as SymmetricEigen2, DSymmetricEigen3 as SymmetricEigen3, MatExt,
};
#[cfg(feature = "f32")]
pub use glamx::{MatExt, Pose2, Pose3, Rot2, Rot3, SymmetricEigen2, SymmetricEigen3};
#[cfg(feature = "f64")]
pub use glamx::{
DMat2 as Mat2, DMat3 as Mat3, DVec2 as Vec2, DVec3 as Vec3, DVec3 as Vec3A, DVec4 as Vec4,
};
#[cfg(feature = "f32")]
pub use glamx::{Mat2, Mat3, Vec2, Vec3, Vec3A, Vec4};
pub const DEFAULT_EPSILON: Real = Real::EPSILON;
#[cfg(feature = "dim2")]
pub const DIM: usize = 2;
#[cfg(feature = "dim3")]
pub const DIM: usize = 3;
pub const TWO_DIM: usize = DIM * 2;
#[cfg(feature = "dim3")]
mod dim3_types {
use super::*;
#[cfg(feature = "f64")]
use glamx::{DMat3, DVec3};
#[cfg(feature = "f32")]
pub type Vector = Vec3;
#[cfg(feature = "f64")]
pub type Vector = DVec3;
#[cfg(feature = "f32")]
pub type IVector = glamx::IVec3;
#[cfg(feature = "f64")]
pub type IVector = glamx::I64Vec3;
#[cfg(feature = "f32")]
pub type AngVector = Vec3;
#[cfg(feature = "f64")]
pub type AngVector = DVec3;
#[cfg(feature = "f32")]
pub type Matrix = Mat3;
#[cfg(feature = "f64")]
pub type Matrix = DMat3;
pub type Pose = Pose3;
pub type Rotation = Rot3;
#[cfg(feature = "f32")]
pub type Orientation = Vec3;
#[cfg(feature = "f64")]
pub type Orientation = DVec3;
#[cfg(feature = "f32")]
pub type SpatialVector = [f32; 6];
#[cfg(feature = "f64")]
pub type SpatialVector = [f64; 6];
pub type AngularInertia = crate::utils::SdpMatrix3<Real>;
#[cfg(feature = "f32")]
pub type PrincipalAngularInertia = Vec3;
#[cfg(feature = "f64")]
pub type PrincipalAngularInertia = DVec3;
#[cfg(feature = "f32")]
pub type CrossMatrix = Mat3;
#[cfg(feature = "f64")]
pub type CrossMatrix = DMat3;
pub type SdpMatrix = crate::utils::SdpMatrix3<Real>;
#[cfg(feature = "f32")]
pub type SymmetricEigen = SymmetricEigen3;
#[cfg(feature = "f64")]
pub type SymmetricEigen = glamx::DSymmetricEigen3;
}
#[cfg(feature = "dim3")]
pub use dim3_types::*;
#[cfg(feature = "dim2")]
mod dim2_types {
use super::*;
#[cfg(feature = "f64")]
use glamx::{DMat2, DVec2, DVec3};
#[cfg(feature = "f32")]
pub type Vector = Vec2;
#[cfg(feature = "f64")]
pub type Vector = DVec2;
#[cfg(feature = "f32")]
pub type IVector = glamx::IVec2;
#[cfg(feature = "f64")]
pub type IVector = glamx::I64Vec2;
pub type AngVector = Real;
#[cfg(feature = "f32")]
pub type Matrix = Mat2;
#[cfg(feature = "f64")]
pub type Matrix = DMat2;
pub type Pose = Pose2;
pub type Rotation = Rot2;
pub type Orientation = Real;
#[cfg(feature = "f32")]
pub type SpatialVector = Vec3;
#[cfg(feature = "f64")]
pub type SpatialVector = DVec3;
pub type AngularInertia = Real;
pub type PrincipalAngularInertia = Real;
#[cfg(feature = "f32")]
pub type CrossMatrix = Vec2;
#[cfg(feature = "f64")]
pub type CrossMatrix = DVec2;
pub type SdpMatrix = crate::utils::SdpMatrix2<Real>;
#[cfg(feature = "f32")]
pub type SymmetricEigen = SymmetricEigen2;
#[cfg(feature = "f64")]
pub type SymmetricEigen = glamx::DSymmetricEigen2;
}
#[cfg(feature = "dim2")]
pub use dim2_types::*;
#[cfg(feature = "dim3")]
pub fn orthonormal_subspace_basis<F>(vs: &[Vector], mut f: F)
where
F: FnMut(Vector) -> bool,
{
if vs.is_empty() {
return;
}
let v = vs[0].normalize_or_zero();
if v == Vector::ZERO {
return;
}
let orth = if v.x.abs() > v.z.abs() {
Vector::new(-v.y, v.x, 0.0)
} else {
Vector::new(0.0, -v.z, v.y)
};
let orth1 = orth.normalize();
if !f(orth1) {
return;
}
let orth2 = v.cross(orth1);
let _ = f(orth2);
}
pub type Vector2 = Vec2;
pub type Matrix2 = Mat2;
pub type Vector3 = Vec3;
pub type Matrix3 = Mat3;
#[cfg(all(feature = "dim2", feature = "f32"))]
pub fn ivect_to_vect(p: IVector) -> Vector {
p.as_vec2()
}
#[cfg(all(feature = "dim2", feature = "f64"))]
pub fn ivect_to_vect(p: IVector) -> Vector {
p.as_dvec2()
}
#[cfg(all(feature = "dim3", feature = "f32"))]
pub fn ivect_to_vect(p: IVector) -> Vector {
p.as_vec3()
}
#[cfg(all(feature = "dim3", feature = "f64"))]
pub fn ivect_to_vect(p: IVector) -> Vector {
p.as_dvec3()
}
#[cfg(all(feature = "dim2", feature = "f32"))]
pub fn vect_to_ivect(p: Vector) -> IVector {
p.as_ivec2()
}
#[cfg(all(feature = "dim2", feature = "f64"))]
pub fn vect_to_ivect(p: Vector) -> IVector {
p.as_i64vec2()
}
#[cfg(all(feature = "dim3", feature = "f32"))]
pub fn vect_to_ivect(p: Vector) -> IVector {
p.as_ivec3()
}
#[cfg(all(feature = "dim3", feature = "f64"))]
pub fn vect_to_ivect(p: Vector) -> IVector {
p.as_i64vec3()
}