use physx_sys::{
PxActor,
PxAggregate,
PxArticulation,
PxArticulationBase,
PxArticulationJoint,
PxArticulationJointBase,
PxArticulationJointReducedCoordinate,
PxArticulationLink,
PxArticulationReducedCoordinate,
PxBVHStructure,
PxBase,
PxConstraint,
PxContactJoint,
PxConvexMesh,
PxD6Joint,
PxDistanceJoint,
PxFixedJoint,
PxHeightField,
PxJoint,
PxMaterial,
PxPrismaticJoint,
PxPruningStructure,
PxRevoluteJoint,
PxRigidActor,
PxRigidBody,
PxRigidDynamic,
PxRigidStatic,
PxShape,
PxSphericalJoint,
PxTriangleMesh,
PxVehicleDrive,
PxVehicleDrive4W,
PxVehicleDriveNW,
PxVehicleDriveTank,
PxVehicleNoDrive,
PxVehicleWheels,
};
use physx_sys::{
PxCooking, PxFoundation, PxPhysics, PxPvd, PxPvdSceneClient, PxPvdTransport, PxScene,
};
use physx_sys::{
PxBoxController, PxBoxControllerDesc, PxCapsuleController, PxCapsuleControllerDesc,
PxController, PxControllerDesc, PxControllerManager,
};
use physx_sys::{PxBounds3, PxExtendedVec3, PxMeshScale, PxQuat, PxTransform, PxVec3};
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_export(crate)]
macro_rules! DeriveClassForNewType {
($PxWrap:ident : $($PxClass:ident),+) => {
$(unsafe impl Class<::physx_sys::$PxClass> for $PxWrap {
fn as_ptr(&self) -> *const ::physx_sys::$PxClass {
&self.obj as *const _ as *const _
}
fn as_mut_ptr(&mut self) -> *mut ::physx_sys::$PxClass {
&mut self.obj as *mut _ as *mut _
}
})+
}
}
macro_rules! DeriveClass {
($PxType:ty $(: $($PxClass:ty),*)?) => {
unsafe impl Class<$PxType> for $PxType {
fn as_ptr(&self) -> *const $PxType {
self
}
fn as_mut_ptr(&mut self) -> *mut $PxType {
self
}
}
$($(unsafe impl Class<$PxClass> for $PxType {
fn as_ptr(&self) -> *const $PxClass {
self as *const _ as *const _
}
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!(PxArticulationBase: PxBase);
DeriveClass!(PxArticulation: PxArticulationBase, PxBase);
DeriveClass!(PxArticulationReducedCoordinate: PxArticulationBase, PxBase);
DeriveClass!(PxArticulationJointBase: PxBase);
DeriveClass!(PxArticulationJoint: PxArticulationJointBase, PxBase);
DeriveClass!(
PxArticulationJointReducedCoordinate: PxArticulationJointBase,
PxBase
);
DeriveClass!(PxBVHStructure: 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: PxBase);
DeriveClass!(PxPruningStructure: PxBase);
DeriveClass!(PxShape: PxBase);
DeriveClass!(PxTriangleMesh: PxBase);
DeriveClass!(PxVehicleWheels: PxBase);
DeriveClass!(PxVehicleNoDrive: PxVehicleWheels, PxBase);
DeriveClass!(PxVehicleDrive: PxVehicleWheels, PxBase);
DeriveClass!(PxVehicleDrive4W: PxVehicleDrive, PxVehicleWheels, PxBase);
DeriveClass!(PxVehicleDriveNW: PxVehicleDrive, PxVehicleWheels, PxBase);
DeriveClass!(PxVehicleDriveTank: PxVehicleDrive, PxVehicleWheels, 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 {
fn as_ptr(&self) -> *const $Px {
self
}
fn as_mut_ptr(&mut self) -> *mut $Px {
self
}
}
unsafe impl Class<PxGeometry> for $Px {
fn as_ptr(&self) -> *const PxGeometry {
self as *const _ as *const _
}
fn as_mut_ptr(&mut self) -> *mut PxGeometry {
self as *mut _ as *mut _
}
}
)*
}
}
DeriveClassForGeometries!(
PxSphereGeometry,
PxBoxGeometry,
PxCapsuleGeometry,
PxHeightFieldGeometry,
PxTriangleMeshGeometry,
PxConvexMeshGeometry,
PxPlaneGeometry,
);