#[rustfmt::skip]
use physx_sys::{
PxActor,
PxAggregate,
PxArticulationJointReducedCoordinate,
PxArticulationLink,
PxArticulationReducedCoordinate,
PxBVH,
PxBase,
PxConstraint,
PxContactJoint,
PxConvexMesh,
PxD6Joint,
PxDistanceJoint,
PxFixedJoint,
PxHeightField,
PxJoint,
PxMaterial,
PxPrismaticJoint,
PxPruningStructure,
PxRefCounted,
PxRevoluteJoint,
PxRigidActor,
PxRigidBody,
PxRigidDynamic,
PxRigidStatic,
PxShape,
PxSphericalJoint,
PxTriangleMesh,
};
#[rustfmt::skip]
use physx_sys::{
PxCooking,
PxFoundation,
PxPhysics,
PxPvd,
PxPvdSceneClient,
PxPvdTransport,
PxScene,
};
#[rustfmt::skip]
use physx_sys::{
PxBoxController,
PxBoxControllerDesc,
PxCapsuleController,
PxCapsuleControllerDesc,
PxController,
PxControllerDesc,
PxControllerManager,
};
#[rustfmt::skip]
use physx_sys::{
PxBounds3,
PxExtendedVec3,
PxMeshScale,
PxQuat,
PxTransform,
PxVec3,
};
#[rustfmt::skip]
use physx_sys::{
PxBoxGeometry,
PxCapsuleGeometry,
PxConvexMeshGeometry,
PxGeometry,
PxHeightFieldGeometry,
PxPlaneGeometry,
PxSphereGeometry,
PxTriangleMeshGeometry,
};
use physx_sys::PxArticulationCache;
pub unsafe trait Class<S> {
fn as_ptr(&self) -> *const S;
fn as_mut_ptr(&mut self) -> *mut S;
}
macro_rules! DeriveClassForNewType {
($PxWrap:ident : $($PxClass:ident),+) => {
$(unsafe impl Class<::physx_sys::$PxClass> for $PxWrap {
#[inline]
fn as_ptr(&self) -> *const ::physx_sys::$PxClass {
&self.obj as *const _ as *const _
}
#[inline]
fn as_mut_ptr(&mut self) -> *mut ::physx_sys::$PxClass {
&mut self.obj as *mut _ as *mut _
}
})+
}
}
pub(crate) use DeriveClassForNewType;
macro_rules! DeriveClass {
($PxType:ty $(: $($PxClass:ty),*)?) => {
unsafe impl Class<$PxType> for $PxType {
#[inline]
fn as_ptr(&self) -> *const $PxType {
self
}
#[inline]
fn as_mut_ptr(&mut self) -> *mut $PxType {
self
}
}
$($(unsafe impl Class<$PxClass> for $PxType {
#[inline]
fn as_ptr(&self) -> *const $PxClass {
self as *const _ as *const _
}
#[inline]
fn as_mut_ptr(&mut self) -> *mut $PxClass {
self as *mut _ as *mut _
}
})*)?
}
}
DeriveClass!(PxBase);
DeriveClass!(PxActor: PxBase);
DeriveClass!(PxRigidActor: PxActor, PxBase);
DeriveClass!(PxRigidStatic: PxRigidActor, PxActor, PxBase);
DeriveClass!(PxRigidBody: PxRigidActor, PxActor, PxBase);
DeriveClass!(PxRigidDynamic: PxRigidBody, PxRigidActor, PxActor, PxBase);
DeriveClass!(
PxArticulationLink: PxRigidBody,
PxRigidActor,
PxActor,
PxBase
);
DeriveClass!(PxAggregate: PxBase);
DeriveClass!(PxArticulationReducedCoordinate: PxBase);
DeriveClass!(PxArticulationJointReducedCoordinate: PxBase);
DeriveClass!(PxBVH: PxBase);
DeriveClass!(PxConstraint: PxBase);
DeriveClass!(PxConvexMesh: PxBase);
DeriveClass!(PxHeightField: PxBase);
DeriveClass!(PxJoint: PxBase);
DeriveClass!(PxContactJoint: PxJoint, PxBase);
DeriveClass!(PxD6Joint: PxJoint, PxBase);
DeriveClass!(PxDistanceJoint: PxJoint, PxBase);
DeriveClass!(PxFixedJoint: PxJoint, PxBase);
DeriveClass!(PxPrismaticJoint: PxJoint, PxBase);
DeriveClass!(PxRevoluteJoint: PxJoint, PxBase);
DeriveClass!(PxSphericalJoint: PxJoint, PxBase);
DeriveClass!(PxMaterial: PxRefCounted, PxBase);
DeriveClass!(PxPruningStructure: PxBase);
DeriveClass!(PxShape: PxRefCounted, PxBase);
DeriveClass!(PxTriangleMesh: PxBase);
DeriveClass!(PxFoundation);
DeriveClass!(PxPhysics);
DeriveClass!(PxScene);
DeriveClass!(PxPvd);
DeriveClass!(PxPvdSceneClient);
DeriveClass!(PxPvdTransport);
DeriveClass!(PxCooking);
DeriveClass!(PxControllerManager);
DeriveClass!(PxController);
DeriveClass!(PxCapsuleController: PxController);
DeriveClass!(PxBoxController: PxController);
DeriveClass!(PxControllerDesc);
DeriveClass!(PxCapsuleControllerDesc: PxControllerDesc);
DeriveClass!(PxBoxControllerDesc: PxControllerDesc);
DeriveClass!(PxTransform);
DeriveClass!(PxQuat);
DeriveClass!(PxVec3);
DeriveClass!(PxExtendedVec3);
DeriveClass!(PxMeshScale);
DeriveClass!(PxBounds3);
DeriveClass!(PxArticulationCache);
macro_rules! DeriveClassForGeometries {
($($Px: ty,)*) => {
$(
unsafe impl Class<$Px> for $Px {
#[inline]
fn as_ptr(&self) -> *const $Px {
self
}
#[inline]
fn as_mut_ptr(&mut self) -> *mut $Px {
self
}
}
unsafe impl Class<PxGeometry> for $Px {
#[inline]
fn as_ptr(&self) -> *const PxGeometry {
self as *const _ as *const _
}
#[inline]
fn as_mut_ptr(&mut self) -> *mut PxGeometry {
self as *mut _ as *mut _
}
}
)*
}
}
DeriveClassForGeometries!(
PxSphereGeometry,
PxBoxGeometry,
PxCapsuleGeometry,
PxHeightFieldGeometry,
PxTriangleMeshGeometry,
PxConvexMeshGeometry,
PxPlaneGeometry,
);