#![deny(bare_trait_objects)]
#![warn(missing_docs)]
#![allow(clippy::too_many_arguments)]
#![allow(clippy::needless_range_loop)] #![allow(clippy::module_inception)]
#![cfg_attr(feature = "simd-nightly", feature(portable_simd))]
#[cfg(all(feature = "dim2", feature = "f32"))]
pub extern crate parry2d as parry;
#[cfg(all(feature = "dim2", feature = "f64"))]
pub extern crate parry2d_f64 as parry;
#[cfg(all(feature = "dim3", feature = "f32"))]
pub extern crate parry3d as parry;
#[cfg(all(feature = "dim3", feature = "f64"))]
pub extern crate parry3d_f64 as parry;
pub extern crate nalgebra as na;
#[cfg(feature = "serde-serialize")]
#[macro_use]
extern crate serde;
extern crate num_traits as num;
pub use parry::glamx;
#[cfg(feature = "parallel")]
pub use rayon;
#[cfg(all(
feature = "simd-is-enabled",
not(feature = "simd-stable"),
not(feature = "simd-nightly")
))]
std::compile_error!(
"The `simd-is-enabled` feature should not be enabled explicitly. Please enable the `simd-stable` or the `simd-nightly` feature instead."
);
#[cfg(all(feature = "simd-is-enabled", feature = "enhanced-determinism"))]
std::compile_error!(
"SIMD cannot be enabled when the `enhanced-determinism` feature is also enabled."
);
macro_rules! enable_flush_to_zero(
() => {
let _flush_to_zero = crate::utils::FlushToZeroDenormalsAreZeroFlags::flush_denormal_to_zero();
}
);
#[allow(unused_macros)]
macro_rules! gather(
($callback: expr) => {
{
#[inline(always)]
#[allow(dead_code)]
#[cfg(not(feature = "simd-is-enabled"))]
fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> T {
callback(0usize)
}
#[inline(always)]
#[allow(dead_code)]
#[cfg(feature = "simd-is-enabled")]
fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> [T; SIMD_WIDTH] {
[callback(0usize), callback(1usize), callback(2usize), callback(3usize)]
}
create_arr($callback)
}
}
);
macro_rules! array(
($callback: expr) => {
{
#[inline(always)]
#[allow(dead_code)]
fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> [T; SIMD_WIDTH] {
#[cfg(not(feature = "simd-is-enabled"))]
return [callback(0usize)];
#[cfg(feature = "simd-is-enabled")]
return [callback(0usize), callback(1usize), callback(2usize), callback(3usize)];
}
create_arr($callback)
}
}
);
#[allow(unused_macros)]
macro_rules! par_iter {
($t: expr) => {{
#[cfg(not(feature = "parallel"))]
let it = $t.iter();
#[cfg(feature = "parallel")]
let it = $t.par_iter();
it
}};
}
macro_rules! par_iter_mut {
($t: expr) => {{
#[cfg(not(feature = "parallel"))]
let it = $t.iter_mut();
#[cfg(feature = "parallel")]
let it = $t.par_iter_mut();
it
}};
}
#[allow(unused_macros)]
macro_rules! try_ret {
($val: expr) => {
try_ret!($val, ())
};
($val: expr, $ret: expr) => {
if let Some(val) = $val {
val
} else {
return $ret;
}
};
}
pub(crate) const INVALID_U32: u32 = u32::MAX;
pub(crate) const INVALID_USIZE: usize = INVALID_U32 as usize;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub mod control;
pub mod counters;
pub mod data;
pub mod dynamics;
pub mod geometry;
pub mod pipeline;
pub mod utils;
pub mod math {
pub use parry::math::*;
pub use parry::glamx;
#[cfg(feature = "dim2")]
#[inline]
pub fn rotation_from_angle(angle: AngVector) -> Rotation {
Rotation::new(angle)
}
#[cfg(feature = "dim3")]
#[inline]
pub fn rotation_from_angle(angle: AngVector) -> Rotation {
Rotation::from_scaled_axis(angle)
}
#[cfg(feature = "dim2")]
pub type SimdVector<N> = na::Vector2<N>;
#[cfg(feature = "dim3")]
pub type SimdVector<N> = na::Vector3<N>;
#[cfg(feature = "dim2")]
pub type SimdAngVector<N> = N;
#[cfg(feature = "dim3")]
pub type SimdAngVector<N> = na::Vector3<N>;
#[cfg(feature = "dim2")]
pub type SimdPoint<N> = na::Point2<N>;
#[cfg(feature = "dim3")]
pub type SimdPoint<N> = na::Point3<N>;
#[cfg(feature = "dim2")]
pub type SimdPose<N> = na::Isometry2<N>;
#[cfg(feature = "dim3")]
pub type SimdPose<N> = na::Isometry3<N>;
#[cfg(feature = "dim2")]
pub type SimdRotation<N> = na::UnitComplex<N>;
#[cfg(feature = "dim3")]
pub type SimdRotation<N> = na::UnitQuaternion<N>;
#[cfg(feature = "dim2")]
pub type SimdAngularInertia<N> = N;
#[cfg(feature = "dim3")]
pub type SimdAngularInertia<N> = parry::utils::SdpMatrix3<N>;
#[cfg(feature = "dim2")]
pub type SimdMatrix<N> = na::Matrix2<N>;
#[cfg(feature = "dim3")]
pub type SimdMatrix<N> = na::Matrix3<N>;
#[cfg(feature = "dim2")]
pub type Dim = na::U2;
#[cfg(feature = "dim3")]
pub type Dim = na::U3;
#[cfg(feature = "dim2")]
pub type AngDim = na::U1;
#[cfg(feature = "dim3")]
pub type AngDim = na::U3;
pub type DVector = na::DVector<Real>;
pub type DMatrix = na::DMatrix<Real>;
#[cfg(feature = "dim2")]
pub const MAX_MANIFOLD_POINTS: usize = 2;
#[cfg(feature = "dim2")]
pub type Jacobian<N> = na::Matrix3xX<N>;
#[cfg(feature = "dim2")]
pub type JacobianView<'a, N> = na::MatrixView3xX<'a, N>;
#[cfg(feature = "dim2")]
pub type JacobianViewMut<'a, N> = na::MatrixViewMut3xX<'a, N>;
#[cfg(feature = "dim2")]
pub type TangentImpulse<N> = na::Vector1<N>;
#[cfg(feature = "dim2")]
pub const SPATIAL_DIM: usize = 3;
#[cfg(feature = "dim2")]
pub const ANG_DIM: usize = 1;
#[cfg(feature = "dim3")]
pub const MAX_MANIFOLD_POINTS: usize = 4;
#[cfg(feature = "dim3")]
pub type Jacobian<N> = na::Matrix6xX<N>;
#[cfg(feature = "dim3")]
pub type JacobianView<'a, N> = na::MatrixView6xX<'a, N>;
#[cfg(feature = "dim3")]
pub type JacobianViewMut<'a, N> = na::MatrixViewMut6xX<'a, N>;
#[cfg(feature = "dim3")]
pub type TangentImpulse<N> = na::Vector2<N>;
#[cfg(feature = "dim3")]
pub const SPATIAL_DIM: usize = 6;
#[cfg(feature = "dim3")]
pub const ANG_DIM: usize = 3;
}
pub mod prelude {
pub use crate::dynamics::*;
pub use crate::geometry::*;
pub use crate::math::*;
pub use crate::pipeline::*;
pub use na::{point, vector};
pub extern crate nalgebra;
}