#![deny(non_camel_case_types)]
#![deny(unused_parens)]
#![deny(non_upper_case_globals)]
#![deny(unused_qualifications)]
#![warn(missing_docs)]
#![deny(unused_results)]
#![warn(non_camel_case_types)]
#![allow(missing_copy_implementations)]
#![doc(html_root_url = "http://nphysics.org/rustdoc/")]
#[macro_use]
extern crate approx;
#[macro_use]
extern crate downcast_rs;
#[macro_use]
extern crate bitflags;
extern crate alga;
extern crate nalgebra as na;
#[cfg(feature = "dim2")]
extern crate ncollide2d as ncollide;
#[cfg(feature = "dim3")]
extern crate ncollide3d as ncollide;
extern crate num_traits as num;
extern crate slab;
extern crate either;
#[cfg(not(any(target_arch = "wasm32", target_arch = "asmjs")))]
extern crate time;
#[cfg(all(
any(target_arch = "wasm32", target_arch = "asmjs"),
feature = "stdweb",
))]
#[macro_use]
extern crate stdweb;
#[cfg(all(
any(target_arch = "wasm32", target_arch = "asmjs"),
feature = "use-wasm-bindgen",
))]
extern crate wasm_bindgen;
macro_rules! try_ret {
($val: expr) => {
try_ret!($val, ())
};
($val: expr, $ret: expr) => {
if let Some(val) = $val {
val
} else {
return $ret;
}
}
}
macro_rules! try_continue {
($val: expr) => {
if let Some(val) = $val {
val
} else {
continue;
}
}
}
macro_rules! desc_setters(
($($with_method: ident, $set_method: ident $(, $arg: ident: $t: ty)*)*) => {
$(
#[allow(missing_docs)]
#[inline]
pub fn $with_method(mut self $(, $arg: $t)*) -> Self {
$(
self.$arg = $arg;
)*
self
}
#[allow(missing_docs)]
#[inline]
pub fn $set_method(&mut self $(, $arg: $t)*) -> &mut Self {
$(
self.$arg = $arg;
)*
self
}
)*
}
);
macro_rules! desc_custom_setters(
($($this: ident.$with_method: ident, $set_method: ident $(, $arg: ident: $t: ty)* | $imp: expr)*) => {
$(
#[allow(missing_docs)]
#[inline]
pub fn $with_method(mut $this $(, $arg: $t)*) -> Self {
$imp
$this
}
#[allow(missing_docs)]
#[inline]
pub fn $set_method(&mut $this $(, $arg: $t)*) -> &mut Self {
$imp
$this
}
)*
}
);
macro_rules! desc_custom_getters(
($($this: ident.$get_method: ident: $t: ty | $imp: expr)*) => {
$(
#[allow(missing_docs)]
#[inline]
pub fn $get_method(&$this) -> $t {
$imp
}
)*
}
);
macro_rules! desc_getters(
($([val] $name: ident -> $val: ident: $t: ty)* $([ref] $ref_name: ident -> $ref_val: ident: $ref_t: ty)*) => {
$(
#[allow(missing_docs)]
#[inline]
pub fn $name(&self) -> $t {
self.$val
}
)*
$(
#[allow(missing_docs)]
#[inline]
pub fn $ref_name(&self) -> &$ref_t {
&self.$ref_val
}
)*
}
);
macro_rules! user_data_accessors(
() => {
#[inline]
pub fn user_data(&self) -> Option<&(Any + Send + Sync)> {
self.user_data.as_ref().map(|d| &**d)
}
#[inline]
pub fn user_data_mut(&mut self) -> Option<&mut (Any + Send + Sync)> {
self.user_data.as_mut().map(|d| &mut **d)
}
#[inline]
pub fn set_user_data(&mut self, data: Option<Box<Any + Send + Sync>>) -> Option<Box<Any + Send + Sync>> {
std::mem::replace(&mut self.user_data, data)
}
#[inline]
pub fn take_user_data(&mut self) -> Option<Box<Any + Send + Sync>> {
self.user_data.take()
}
}
);
macro_rules! user_data_desc_accessors(
() => {
pub fn user_data(mut self, data: impl UserData) -> Self {
self.user_data = Some(UserDataBox(Box::new(data) as Box<UserData>));
self
}
pub fn set_user_data(&mut self, data: Option<impl UserData>) -> &mut Self {
self.user_data = data.map(|data| UserDataBox(Box::new(data) as Box<UserData>));
self
}
pub fn get_user_data(&self) -> Option<&(Any + Send + Sync)> {
self.user_data.as_ref().map(|data| data.0.as_any())
}
}
);
pub mod algebra;
pub mod counters;
pub mod detection;
pub mod force_generator;
pub mod joint;
pub mod object;
pub mod solver;
pub mod utils;
pub mod volumetric;
pub mod world;
pub mod material;
#[cfg(feature = "dim3")]
pub mod math {
use crate::algebra::{Force3, Inertia3, Velocity3};
use na::{
Dynamic, Isometry3, Matrix3, Matrix6, MatrixMN, MatrixSlice6xX, MatrixSliceMut6xX, Point3,
Translation3, U3, U6, UnitQuaternion, Vector3, Vector6, Rotation3
};
pub use crate::algebra::ForceType;
pub const SPATIAL_DIM: usize = 6;
pub const ANGULAR_DIM: usize = 3;
pub const DIM: usize = 3;
pub type Dim = U3;
pub type SpatialDim = U6;
pub type AngularDim = U3;
pub type Point<N> = Point3<N>;
pub type AngularVector<N> = Vector3<N>;
pub type Vector<N> = Vector3<N>;
pub type SpatialVector<N> = Vector6<N>;
pub type Orientation<N> = Vector3<N>;
pub type Isometry<N> = Isometry3<N>;
pub type Rotation<N> = UnitQuaternion<N>;
pub type RotationMatrix<N> = Rotation3<N>;
pub type Translation<N> = Translation3<N>;
pub type Velocity<N> = Velocity3<N>;
pub type Force<N> = Force3<N>;
pub type AngularInertia<N> = Matrix3<N>;
pub type Inertia<N> = Inertia3<N>;
pub type InertiaMatrix<N> = Matrix6<N>;
pub type Matrix<N> = Matrix3<N>;
pub type SpatialMatrix<N> = Matrix6<N>;
pub type Jacobian<N> = MatrixMN<N, U6, Dynamic>;
pub type JacobianSlice<'a, N> = MatrixSlice6xX<'a, N>;
pub type JacobianSliceMut<'a, N> = MatrixSliceMut6xX<'a, N>;
}
#[cfg(feature = "dim2")]
pub mod math {
use crate::algebra::{Force2, Inertia2, Velocity2};
use na::{
Dynamic, Isometry2, Matrix1, Matrix3, MatrixMN, MatrixSlice3xX, MatrixSliceMut3xX, Point2,
Translation2, U1, U2, U3, UnitComplex, Vector1, Vector2, Vector3, Rotation2, Matrix2
};
pub use crate::algebra::ForceType;
pub const SPATIAL_DIM: usize = 3;
pub const ANGULAR_DIM: usize = 1;
pub const DIM: usize = 2;
pub type Dim = U2;
pub type AngularDim = U1;
pub type SpatialDim = U3;
pub type Point<N> = Point2<N>;
pub type SpatialVector<N> = Vector3<N>;
pub type AngularVector<N> = Vector1<N>;
pub type Vector<N> = Vector2<N>;
pub type Orientation<N> = Vector1<N>;
pub type Isometry<N> = Isometry2<N>;
pub type Rotation<N> = UnitComplex<N>;
pub type RotationMatrix<N> = Rotation2<N>;
pub type Translation<N> = Translation2<N>;
pub type Velocity<N> = Velocity2<N>;
pub type Force<N> = Force2<N>;
pub type AngularInertia<N> = Matrix1<N>;
pub type Inertia<N> = Inertia2<N>;
pub type InertiaMatrix<N> = Matrix3<N>;
pub type Matrix<N> = Matrix2<N>;
pub type SpatialMatrix<N> = Matrix3<N>;
pub type Jacobian<N> = MatrixMN<N, U3, Dynamic>;
pub type JacobianSlice<'a, N> = MatrixSlice3xX<'a, N>;
pub type JacobianSliceMut<'a, N> = MatrixSliceMut3xX<'a, N>;
}