pub mod tokens;
mod schema;
mod traits;
pub use schema::{
ArticulationRootAPI, CollisionAPI, CollisionGroup, DistanceJoint, DriveAPI, FilteredPairsAPI, FixedJoint, Joint,
LimitAPI, MassAPI, MaterialAPI, MeshCollisionAPI, PrismaticJoint, RevoluteJoint, RigidBodyAPI, Scene,
SphericalJoint,
};
pub use traits::JointBase;
use tokens::*;
macro_rules! impl_physics_schema {
(typed $ty:ident) => {
impl $crate::usd::SchemaBase for $ty {
const KIND: $crate::usd::SchemaKind = $crate::usd::SchemaKind::ConcreteTyped;
fn prim(&self) -> &$crate::usd::Prim {
&self.0
}
}
};
(joint $ty:ident) => {
impl_physics_schema!(typed $ty);
impl $crate::schemas::physics::JointBase for $ty {}
};
(single_api $ty:ident) => {
impl $crate::usd::SchemaBase for $ty {
const KIND: $crate::usd::SchemaKind = $crate::usd::SchemaKind::SingleApplyApi;
fn prim(&self) -> &$crate::usd::Prim {
&self.0
}
}
};
(multi_api $ty:ident) => {
impl $crate::usd::SchemaBase for $ty {
const KIND: $crate::usd::SchemaKind = $crate::usd::SchemaKind::MultipleApplyApi;
fn prim(&self) -> &$crate::usd::Prim {
&self.prim
}
}
};
}
pub(crate) use impl_physics_schema;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum JointAxis {
#[default]
X,
Y,
Z,
}
impl JointAxis {
pub fn as_token(self) -> &'static str {
match self {
JointAxis::X => AXIS_X,
JointAxis::Y => AXIS_Y,
JointAxis::Z => AXIS_Z,
}
}
pub fn from_token(s: &str) -> Option<Self> {
Some(match s {
AXIS_X => JointAxis::X,
AXIS_Y => JointAxis::Y,
AXIS_Z => JointAxis::Z,
_ => return None,
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DriveType {
#[default]
Force,
Acceleration,
}
impl DriveType {
pub fn as_token(self) -> &'static str {
match self {
DriveType::Force => DRIVE_TYPE_FORCE,
DriveType::Acceleration => DRIVE_TYPE_ACCELERATION,
}
}
pub fn from_token(s: &str) -> Option<Self> {
Some(match s {
DRIVE_TYPE_FORCE => DriveType::Force,
DRIVE_TYPE_ACCELERATION => DriveType::Acceleration,
_ => return None,
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CollisionApprox {
#[default]
None,
ConvexHull,
ConvexDecomposition,
BoundingSphere,
BoundingCube,
MeshSimplification,
}
impl CollisionApprox {
pub fn as_token(self) -> &'static str {
match self {
CollisionApprox::None => APPROX_NONE,
CollisionApprox::ConvexHull => APPROX_CONVEX_HULL,
CollisionApprox::ConvexDecomposition => APPROX_CONVEX_DECOMPOSITION,
CollisionApprox::BoundingSphere => APPROX_BOUNDING_SPHERE,
CollisionApprox::BoundingCube => APPROX_BOUNDING_CUBE,
CollisionApprox::MeshSimplification => APPROX_MESH_SIMPLIFICATION,
}
}
pub fn from_token(s: &str) -> Option<Self> {
Some(match s {
APPROX_NONE => CollisionApprox::None,
APPROX_CONVEX_HULL => CollisionApprox::ConvexHull,
APPROX_CONVEX_DECOMPOSITION => CollisionApprox::ConvexDecomposition,
APPROX_BOUNDING_SPHERE => CollisionApprox::BoundingSphere,
APPROX_BOUNDING_CUBE => CollisionApprox::BoundingCube,
APPROX_MESH_SIMPLIFICATION => CollisionApprox::MeshSimplification,
_ => return None,
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Dof {
TransX,
TransY,
TransZ,
RotX,
RotY,
RotZ,
Linear,
Angular,
Distance,
}
impl Dof {
pub fn as_token(self) -> &'static str {
match self {
Dof::TransX => DOF_TRANS_X,
Dof::TransY => DOF_TRANS_Y,
Dof::TransZ => DOF_TRANS_Z,
Dof::RotX => DOF_ROT_X,
Dof::RotY => DOF_ROT_Y,
Dof::RotZ => DOF_ROT_Z,
Dof::Linear => DOF_LINEAR,
Dof::Angular => DOF_ANGULAR,
Dof::Distance => DOF_DISTANCE,
}
}
pub fn from_token(s: &str) -> Option<Self> {
Some(match s {
DOF_TRANS_X => Dof::TransX,
DOF_TRANS_Y => Dof::TransY,
DOF_TRANS_Z => Dof::TransZ,
DOF_ROT_X => Dof::RotX,
DOF_ROT_Y => Dof::RotY,
DOF_ROT_Z => Dof::RotZ,
DOF_LINEAR => Dof::Linear,
DOF_ANGULAR => Dof::Angular,
DOF_DISTANCE => Dof::Distance,
_ => return None,
})
}
}
crate::schemas::common::impl_token_value!(JointAxis, DriveType, CollisionApprox);