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
35#[cfg(feature = "parallel")]
36pub use rayon;
37
38#[cfg(all(
39 feature = "simd-is-enabled",
40 not(feature = "simd-stable"),
41 not(feature = "simd-nightly")
42))]
43std::compile_error!(
44 "The `simd-is-enabled` feature should not be enabled explicitly. Please enable the `simd-stable` or the `simd-nightly` feature instead."
45);
46#[cfg(all(feature = "simd-is-enabled", feature = "enhanced-determinism"))]
47std::compile_error!(
48 "SIMD cannot be enabled when the `enhanced-determinism` feature is also enabled."
49);
50
51macro_rules! enable_flush_to_zero(
52 () => {
53 let _flush_to_zero = crate::utils::FlushToZeroDenormalsAreZeroFlags::flush_denormal_to_zero();
54 }
55);
56
57macro_rules! gather(
58 ($callback: expr) => {
59 {
60 #[inline(always)]
61 #[allow(dead_code)]
62 #[cfg(not(feature = "simd-is-enabled"))]
63 fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> T {
64 callback(0usize)
65 }
66
67 #[inline(always)]
68 #[allow(dead_code)]
69 #[cfg(feature = "simd-is-enabled")]
70 fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> [T; SIMD_WIDTH] {
71 [callback(0usize), callback(1usize), callback(2usize), callback(3usize)]
72 }
73
74
75 create_arr($callback)
76 }
77 }
78);
79
80macro_rules! array(
81 ($callback: expr) => {
82 {
83 #[inline(always)]
84 #[allow(dead_code)]
85 fn create_arr<T>(mut callback: impl FnMut(usize) -> T) -> [T; SIMD_WIDTH] {
86 #[cfg(not(feature = "simd-is-enabled"))]
87 return [callback(0usize)];
88 #[cfg(feature = "simd-is-enabled")]
89 return [callback(0usize), callback(1usize), callback(2usize), callback(3usize)];
90 }
91
92 create_arr($callback)
93 }
94 }
95);
96
97#[allow(unused_macros)]
98macro_rules! par_iter {
99 ($t: expr) => {{
100 #[cfg(not(feature = "parallel"))]
101 let it = $t.iter();
102
103 #[cfg(feature = "parallel")]
104 let it = $t.par_iter();
105 it
106 }};
107}
108
109macro_rules! par_iter_mut {
110 ($t: expr) => {{
111 #[cfg(not(feature = "parallel"))]
112 let it = $t.iter_mut();
113
114 #[cfg(feature = "parallel")]
115 let it = $t.par_iter_mut();
116 it
117 }};
118}
119
120#[allow(unused_macros)]
132macro_rules! try_ret {
133 ($val: expr) => {
134 try_ret!($val, ())
135 };
136 ($val: expr, $ret: expr) => {
137 if let Some(val) = $val {
138 val
139 } else {
140 return $ret;
141 }
142 };
143}
144
145pub(crate) const INVALID_U32: u32 = u32::MAX;
156pub(crate) const INVALID_USIZE: usize = INVALID_U32 as usize;
157
158pub const VERSION: &str = env!("CARGO_PKG_VERSION");
160
161pub mod control;
162pub mod counters;
163pub mod data;
164pub mod dynamics;
165pub mod geometry;
166pub mod pipeline;
167pub mod utils;
168
169pub mod math {
171 pub use parry::math::*;
172
173 #[cfg(feature = "dim2")]
180 pub const MAX_MANIFOLD_POINTS: usize = 2;
181
182 #[cfg(feature = "dim2")]
184 pub type Jacobian<N> = na::Matrix3xX<N>;
185
186 #[cfg(feature = "dim2")]
188 pub type JacobianView<'a, N> = na::MatrixView3xX<'a, N>;
189
190 #[cfg(feature = "dim2")]
192 pub type JacobianViewMut<'a, N> = na::MatrixViewMut3xX<'a, N>;
193
194 #[cfg(feature = "dim2")]
196 pub type TangentImpulse<N> = na::Vector1<N>;
197
198 #[cfg(feature = "dim2")]
200 pub const SPATIAL_DIM: usize = 3;
201
202 #[cfg(feature = "dim2")]
204 pub const ANG_DIM: usize = 1;
205
206 #[cfg(feature = "dim3")]
213 pub const MAX_MANIFOLD_POINTS: usize = 4;
214
215 #[cfg(feature = "dim3")]
217 pub type Jacobian<N> = na::Matrix6xX<N>;
218
219 #[cfg(feature = "dim3")]
221 pub type JacobianView<'a, N> = na::MatrixView6xX<'a, N>;
222
223 #[cfg(feature = "dim3")]
225 pub type JacobianViewMut<'a, N> = na::MatrixViewMut6xX<'a, N>;
226
227 #[cfg(feature = "dim3")]
229 pub type TangentImpulse<N> = na::Vector2<N>;
230
231 #[cfg(feature = "dim3")]
233 pub const SPATIAL_DIM: usize = 6;
234
235 #[cfg(feature = "dim3")]
237 pub const ANG_DIM: usize = 3;
238}
239
240pub mod prelude {
242 pub use crate::dynamics::*;
243 pub use crate::geometry::*;
244 pub use crate::math::*;
245 pub use crate::pipeline::*;
246 pub use na::{DMatrix, DVector, point, vector};
247 pub extern crate nalgebra;
248}