#![warn(clippy::all)]
use crate::{
articulation_joint::ArticulationJoint,
articulation_joint_reduced_coordinate::ArticulationJointReducedCoordinate, base::Base,
math::PxTransform, traits::Class,
};
use physx_sys::{
PxArticulationJointBase_getChildPose,
PxArticulationJointBase_getParentArticulationLink,
PxArticulationJointBase_getParentPose,
PxArticulationJointBase_setChildPose_mut,
PxArticulationJointBase_setParentPose_mut,
PxRigidActor_getGlobalPose,
};
impl<T> ArticulationJointBase for T where T: Class<physx_sys::PxArticulationJointBase> + Base {}
pub trait ArticulationJointBase: Class<physx_sys::PxArticulationJointBase> + Base {
fn set_child_pose(&mut self, pose: &PxTransform) {
unsafe {
PxArticulationJointBase_setChildPose_mut(self.as_mut_ptr(), pose.as_ptr());
}
}
fn get_child_pose(&self) -> PxTransform {
unsafe { PxArticulationJointBase_getChildPose(self.as_ptr()).into() }
}
fn set_parent_pose(&mut self, pose: &PxTransform) {
unsafe {
PxArticulationJointBase_setParentPose_mut(self.as_mut_ptr(), pose.as_ptr());
}
}
fn get_parent_pose(&self) -> PxTransform {
unsafe { PxArticulationJointBase_getParentPose(self.as_ptr()).into() }
}
fn get_joint_transform_global(&self) -> PxTransform {
let outbound_link_global_pose: PxTransform = unsafe {
PxRigidActor_getGlobalPose(PxArticulationJointBase_getParentArticulationLink(
self.as_ptr(),
) as *mut _)
.into()
};
let joint_pose = self.get_parent_pose();
outbound_link_global_pose.transform(&joint_pose)
}
}
pub struct JointMap {
obj: physx_sys::PxArticulationJointBase,
}
unsafe impl<P> Class<P> for JointMap
where
physx_sys::PxArticulationJointBase: Class<P>,
{
fn as_ptr(&self) -> *const P {
self.obj.as_ptr()
}
fn as_mut_ptr(&mut self) -> *mut P {
self.obj.as_mut_ptr()
}
}
impl JointMap {
pub unsafe fn cast_map<'a, Ret, ArtJoFn, ArcJoFn>(
&'a mut self,
mut art_fn: ArtJoFn,
mut arc_fn: ArcJoFn,
) -> Ret
where
ArtJoFn: FnMut(&'a mut ArticulationJoint) -> Ret,
ArcJoFn: FnMut(&'a mut ArticulationJointReducedCoordinate) -> Ret,
{
match self.get_concrete_type() {
crate::base::ConcreteType::ArticulationJoint => {
art_fn(&mut *(self as *mut _ as *mut ArticulationJoint))
}
crate::base::ConcreteType::ArticulationJointReducedCoordinate => {
arc_fn(&mut *(self as *mut _ as *mut ArticulationJointReducedCoordinate))
}
_ => panic!(
"get_concrete_type for {:?} returned an invalid type: {:?}",
self.get_concrete_type_name(),
self.get_concrete_type()
),
}
}
pub fn try_cast_map<'a, Ret, ArtJoFn, ArcJoFn>(
&mut self,
mut art_fn: ArtJoFn,
mut arc_fn: ArcJoFn,
) -> Option<Ret>
where
ArtJoFn: FnMut(&'a mut ArticulationJoint) -> Ret,
ArcJoFn: FnMut(&'a mut ArticulationJointReducedCoordinate) -> Ret,
{
match self.get_concrete_type() {
crate::base::ConcreteType::ArticulationJoint => Some(art_fn(unsafe {
&mut *(self as *mut _ as *mut ArticulationJoint)
})),
crate::base::ConcreteType::ArticulationJointReducedCoordinate => Some(arc_fn(unsafe {
&mut *(self as *mut _ as *mut ArticulationJointReducedCoordinate)
})),
_ => None,
}
}
pub fn as_articulation_joint(&mut self) -> Option<&mut ArticulationJoint> {
match self.get_concrete_type() {
crate::base::ConcreteType::ArticulationJoint => unsafe {
Some(&mut *(self as *mut _ as *mut ArticulationJoint))
},
_ => None,
}
}
pub fn as_articulation_joint_reduced_coordinate(
&mut self,
) -> Option<&mut ArticulationJointReducedCoordinate> {
match self.get_concrete_type() {
crate::base::ConcreteType::ArticulationJointReducedCoordinate => unsafe {
Some(&mut *(self as *mut _ as *mut ArticulationJointReducedCoordinate))
},
_ => None,
}
}
}