1#![deny(bare_trait_objects)]
14#![warn(missing_docs)]
15#![allow(clippy::too_many_arguments)]
16#![allow(clippy::needless_range_loop)] #![allow(clippy::module_inception)]
18#![cfg_attr(feature = "simd-nightly", feature(portable_simd))]
19
20#[cfg(all(feature = "dim2", feature = "f32"))]
21pub extern crate parry2d as parry;
22#[cfg(all(feature = "dim2", feature = "f64"))]
23pub extern crate parry2d_f64 as parry;
24#[cfg(all(feature = "dim3", feature = "f32"))]
25pub extern crate parry3d as parry;
26#[cfg(all(feature = "dim3", feature = "f64"))]
27pub extern crate parry3d_f64 as parry;
28
29pub extern crate nalgebra as na;
30#[cfg(feature = "serde-serialize")]
31#[macro_use]
32extern crate serde;
33extern crate num_traits as num;
34
35pub use parry::glamx;
36
37#[cfg(feature = "parallel")]
38pub use rayon;
39
40#[cfg(all(
41 feature = "simd-is-enabled",
42 not(feature = "simd-stable"),
43 not(feature = "simd-nightly")
44))]
45std::compile_error!(
46 "The `simd-is-enabled` feature should not be enabled explicitly. Please enable the `simd-stable` or the `simd-nightly` feature instead."
47);
48#[cfg(all(feature = "simd-is-enabled", feature = "enhanced-determinism"))]
49std::compile_error!(
50 "SIMD cannot be enabled when the `enhanced-determinism` feature is also enabled."
51);
52
53macro_rules! enable_flush_to_zero(
54 () => {
55 let _flush_to_zero = crate::utils::FlushToZeroDenormalsAreZeroFlags::flush_denormal_to_zero();
56 }
57);
58
59#[allow(unused_macros)]
60macro_rules! gather(
61 ($callback: expr) => {
62 {
63 #[inline(always)]
64 #[allow(dead_code)]
65 #[cfg(not(feature = "simd-is-enabled"))]
66 fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> T {
67 callback(0usize)
68 }
69
70 #[inline(always)]
71 #[allow(dead_code)]
72 #[cfg(feature = "simd-is-enabled")]
73 fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> [T; SIMD_WIDTH] {
74 [callback(0usize), callback(1usize), callback(2usize), callback(3usize)]
75 }
76
77
78 create_arr($callback)
79 }
80 }
81);
82
83macro_rules! array(
84 ($callback: expr) => {
85 {
86 #[inline(always)]
87 #[allow(dead_code)]
88 fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> [T; SIMD_WIDTH] {
89 #[cfg(not(feature = "simd-is-enabled"))]
90 return [callback(0usize)];
91 #[cfg(feature = "simd-is-enabled")]
92 return [callback(0usize), callback(1usize), callback(2usize), callback(3usize)];
93 }
94
95 create_arr($callback)
96 }
97 }
98);
99
100#[allow(unused_macros)]
101macro_rules! par_iter {
102 ($t: expr) => {{
103 #[cfg(not(feature = "parallel"))]
104 let it = $t.iter();
105
106 #[cfg(feature = "parallel")]
107 let it = $t.par_iter();
108 it
109 }};
110}
111
112macro_rules! par_iter_mut {
113 ($t: expr) => {{
114 #[cfg(not(feature = "parallel"))]
115 let it = $t.iter_mut();
116
117 #[cfg(feature = "parallel")]
118 let it = $t.par_iter_mut();
119 it
120 }};
121}
122
123#[allow(unused_macros)]
135macro_rules! try_ret {
136 ($val: expr) => {
137 try_ret!($val, ())
138 };
139 ($val: expr, $ret: expr) => {
140 if let Some(val) = $val {
141 val
142 } else {
143 return $ret;
144 }
145 };
146}
147
148pub(crate) const INVALID_U32: u32 = u32::MAX;
159pub(crate) const INVALID_USIZE: usize = INVALID_U32 as usize;
160
161pub const VERSION: &str = env!("CARGO_PKG_VERSION");
163
164pub mod control;
165pub mod counters;
166pub mod data;
167pub mod dynamics;
168pub mod geometry;
169pub mod pipeline;
170pub mod utils;
171
172pub mod math {
174 pub use parry::math::*;
175
176 pub use parry::glamx;
178
179 #[cfg(feature = "dim2")]
184 #[inline]
185 pub fn rotation_from_angle(angle: AngVector) -> Rotation {
186 Rotation::new(angle)
187 }
188
189 #[cfg(feature = "dim3")]
194 #[inline]
195 pub fn rotation_from_angle(angle: AngVector) -> Rotation {
196 Rotation::from_scaled_axis(angle)
197 }
198
199 #[cfg(feature = "dim2")]
205 pub type SimdVector<N> = na::Vector2<N>;
206 #[cfg(feature = "dim3")]
208 pub type SimdVector<N> = na::Vector3<N>;
209 #[cfg(feature = "dim2")]
211 pub type SimdAngVector<N> = N;
212 #[cfg(feature = "dim3")]
214 pub type SimdAngVector<N> = na::Vector3<N>;
215 #[cfg(feature = "dim2")]
217 pub type SimdPoint<N> = na::Point2<N>;
218 #[cfg(feature = "dim3")]
220 pub type SimdPoint<N> = na::Point3<N>;
221 #[cfg(feature = "dim2")]
223 pub type SimdPose<N> = na::Isometry2<N>;
224 #[cfg(feature = "dim3")]
226 pub type SimdPose<N> = na::Isometry3<N>;
227 #[cfg(feature = "dim2")]
229 pub type SimdRotation<N> = na::UnitComplex<N>;
230 #[cfg(feature = "dim3")]
232 pub type SimdRotation<N> = na::UnitQuaternion<N>;
233 #[cfg(feature = "dim2")]
235 pub type SimdAngularInertia<N> = N;
236 #[cfg(feature = "dim3")]
238 pub type SimdAngularInertia<N> = parry::utils::SdpMatrix3<N>;
239 #[cfg(feature = "dim2")]
241 pub type SimdMatrix<N> = na::Matrix2<N>;
242 #[cfg(feature = "dim3")]
244 pub type SimdMatrix<N> = na::Matrix3<N>;
245
246 #[cfg(feature = "dim2")]
249 pub type Dim = na::U2;
250 #[cfg(feature = "dim3")]
252 pub type Dim = na::U3;
253 #[cfg(feature = "dim2")]
255 pub type AngDim = na::U1;
256 #[cfg(feature = "dim3")]
258 pub type AngDim = na::U3;
259
260 pub type DVector = na::DVector<Real>;
262 pub type DMatrix = na::DMatrix<Real>;
264
265 #[cfg(feature = "dim2")]
272 pub const MAX_MANIFOLD_POINTS: usize = 2;
273
274 #[cfg(feature = "dim2")]
276 pub type Jacobian<N> = na::Matrix3xX<N>;
277
278 #[cfg(feature = "dim2")]
280 pub type JacobianView<'a, N> = na::MatrixView3xX<'a, N>;
281
282 #[cfg(feature = "dim2")]
284 pub type JacobianViewMut<'a, N> = na::MatrixViewMut3xX<'a, N>;
285
286 #[cfg(feature = "dim2")]
288 pub type TangentImpulse<N> = na::Vector1<N>;
289
290 #[cfg(feature = "dim2")]
292 pub const SPATIAL_DIM: usize = 3;
293
294 #[cfg(feature = "dim2")]
296 pub const ANG_DIM: usize = 1;
297
298 #[cfg(feature = "dim3")]
305 pub const MAX_MANIFOLD_POINTS: usize = 4;
306
307 #[cfg(feature = "dim3")]
309 pub type Jacobian<N> = na::Matrix6xX<N>;
310
311 #[cfg(feature = "dim3")]
313 pub type JacobianView<'a, N> = na::MatrixView6xX<'a, N>;
314
315 #[cfg(feature = "dim3")]
317 pub type JacobianViewMut<'a, N> = na::MatrixViewMut6xX<'a, N>;
318
319 #[cfg(feature = "dim3")]
321 pub type TangentImpulse<N> = na::Vector2<N>;
322
323 #[cfg(feature = "dim3")]
325 pub const SPATIAL_DIM: usize = 6;
326
327 #[cfg(feature = "dim3")]
329 pub const ANG_DIM: usize = 3;
330}
331
332pub mod prelude {
334 pub use crate::dynamics::*;
335 pub use crate::geometry::*;
336 pub use crate::math::*;
337 pub use crate::pipeline::*;
338 pub use na::{point, vector};
339 pub extern crate nalgebra;
340}