bullet-0.1.1: Physics/Bullet.hs
{-# CFILES cbits/bullet.c #-} -- for Hugs (?)
module Physics.Bullet (
PlQuaternion, PlVector3, PlRayCastResult, PlMatrix,
PlPhysicsSdkHandle, PlDynamicsWorldHandle, PlRigidBodyHandle, PlUserDataHandle, PlCollisionShapeHandle, PlMeshInterfaceHandle,
plNewBulletSdk, plDeletePhysicsSdk,
-- plCreateSapBroadphase, plDestroyBroadphase,
-- plCreateProxy, plDestroyProxy, plSetBoundingBox,
-- plCreateCollisionWorld,
plCreateDynamicsWorld, plDeleteDynamicsWorld, plStepSimulation, plAddRigidBody, plRemoveRigidBody,
plCreateRigidBody, plDeleteRigidBody,
plNewSphereShape, plNewBoxShape, plNewCapsuleShape, plNewConeShape, plNewCylinderShape, plNewCompoundShape,
plAddChildShape, plDeleteShape, plNewConvexHullShape, plAddVertex, plNewMeshInterface,
plAddTriangle, plNewStaticTriangleMeshShape,plNewGimpactTriangleMeshShape,plNewConvexTriangleMeshShape,
plSetScaling, plGetOpenGLMatrix, plGetPosition, plGetOrientation, plSetPosition, plSetOrientation, plSetEuler
-- plRayCast
) where
import Foreign
import Foreign.C.Types
import Foreign.Marshal.Array
{-
typedef float plVector3[3];
typedef float plQuaternion[4];
typedef float plVehicleTuning[5];
typedef struct plRayCastResult {
plRigidBodyHandle m_body;
plCollisionShapeHandle m_shape;
plVector3 m_positionWorld;
plVector3 m_normalWorld;
} plRayCastResult;
-}
--plRayCastResult
--type PlRayCastResult = Ptr ()
data PlRayCastResult_ = PlRayCastResult_ PlRigidBodyHandle PlCollisionShapeHandle PlVector3 PlVector3
type PlRayCastResult = Ptr PlRayCastResult_
type PlQuaternion = Ptr CFloat
type PlVector3 = Ptr CFloat
type PlMatrix = Ptr CFloat
type PlVehicleTuning = Ptr CFloat
-----------------------------------------
data PlPhysicsSdk = PlPhysicsSdk
type PlPhysicsSdkHandle = Ptr PlPhysicsSdk
data PlDynamicsWorld = PlDynamicsWorld
type PlDynamicsWorldHandle = Ptr PlDynamicsWorld
data PlRigidBody = PlRigidBody
type PlRigidBodyHandle = Ptr PlRigidBody
type PlUserDataHandle = Ptr ()
data PlCollisionShape = PlCollisionShape
type PlCollisionShapeHandle = Ptr PlCollisionShape
data PlMeshInterface = PlMeshInterface
type PlMeshInterfaceHandle = Ptr PlMeshInterface
foreign import ccall unsafe "plNewBulletSdk" plNewBulletSdk :: IO PlPhysicsSdkHandle
foreign import ccall unsafe "plDeletePhysicsSdk" plDeletePhysicsSdk :: PlPhysicsSdkHandle -> IO ()
--foreign import ccall "plCreateSapBroadphase" plCreateSapBroadphase :: Ptr a -> Ptr a -> IO (Ptr a)
--foreign import ccall "plDestroyBroadphase" plDestroyBroadphase :: Ptr a -> IO()
--foreign import ccall "plCreateProxy" plCreateProxy :: Ptr a -> Ptr a -> CCFloat -> CCFloat -> CCFloat -> CCFloat -> CCFloat -> CCFloat -> IO( Ptr a )
--foreign import ccall "plDestroyProxy" plDestroyProxy :: Ptr a -> Ptr a -> IO()
--foreign import ccall "plSetBoundingBox" plSetBoundingBox :: Ptr a -> CCFloat -> CCFloat -> CCFloat -> CCFloat -> CCFloat -> CCFloat -> IO()
--foreign import ccall "plCreateCollisionWorld" plCreateCollisionWorld :: Ptr a -> IO( Ptr a )
foreign import ccall unsafe "plCreateDynamicsWorld" plCreateDynamicsWorld :: PlPhysicsSdkHandle -> IO PlDynamicsWorldHandle
foreign import ccall unsafe "plDeleteDynamicsWorld" plDeleteDynamicsWorld :: PlDynamicsWorldHandle -> IO ()
foreign import ccall unsafe "plStepSimulation" plStepSimulation :: PlDynamicsWorldHandle -> CFloat -> IO ()
foreign import ccall unsafe "plAddRigidBody" plAddRigidBody :: PlDynamicsWorldHandle -> PlRigidBodyHandle -> IO ()
foreign import ccall unsafe "plRemoveRigidBody" plRemoveRigidBody :: PlDynamicsWorldHandle -> PlRigidBodyHandle -> IO ()
foreign import ccall unsafe "plCreateRigidBody" plCreateRigidBody :: PlUserDataHandle -> CFloat -> PlCollisionShapeHandle -> IO PlRigidBodyHandle
foreign import ccall unsafe "plDeleteRigidBody" plDeleteRigidBody :: PlRigidBodyHandle -> IO ()
foreign import ccall unsafe "plNewSphereShape" plNewSphereShape :: CFloat -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plNewBoxShape" plNewBoxShape :: CFloat -> CFloat -> CFloat -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plNewCapsuleShape" plNewCapsuleShape :: CFloat -> CFloat -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plNewConeShape" plNewConeShape :: CFloat -> CFloat -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plNewCylinderShape" plNewCylinderShape :: CFloat -> CFloat -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plNewCompoundShape" plNewCompoundShape :: IO PlCollisionShapeHandle
foreign import ccall unsafe "plAddChildShape" plAddChildShape_ :: PlCollisionShapeHandle -> PlCollisionShapeHandle -> PlVector3 -> PlQuaternion -> IO ()
foreign import ccall unsafe "plDeleteShape" plDeleteShape :: PlCollisionShapeHandle -> IO ()
foreign import ccall unsafe "plNewConvexHullShape" plNewConvexHullShape :: Ptr CFloat -> Int -> Int -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plAddVertex" plAddVertex :: PlCollisionShapeHandle -> CFloat -> CFloat -> CFloat -> IO ()
foreign import ccall unsafe "plNewMeshInterface" plNewMeshInterface :: IO PlMeshInterfaceHandle
foreign import ccall unsafe "plAddTriangle" plAddTriangle_ :: PlMeshInterfaceHandle -> PlVector3 -> PlVector3 -> PlVector3 -> Int -> IO ()
foreign import ccall unsafe "plNewStaticTriangleMeshShape" plNewStaticTriangleMeshShape :: PlMeshInterfaceHandle -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plNewGimpactTriangleMeshShape" plNewGimpactTriangleMeshShape :: PlMeshInterfaceHandle -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plNewConvexTriangleMeshShape" plNewConvexTriangleMeshShape :: PlMeshInterfaceHandle -> IO PlCollisionShapeHandle
foreign import ccall unsafe "plSetScaling" plSetScaling_ :: PlCollisionShapeHandle -> PlVector3 -> IO ()
foreign import ccall unsafe "plGetOpenGLMatrix" plGetOpenGLMatrix_ :: PlRigidBodyHandle -> PlMatrix -> IO ()
foreign import ccall unsafe "plGetPosition" plGetPosition_ :: PlRigidBodyHandle -> PlVector3 -> IO ()
foreign import ccall unsafe "plGetOrientation" plGetOrientation_ :: PlRigidBodyHandle -> PlQuaternion -> IO ()
foreign import ccall unsafe "plSetPosition" plSetPosition_ :: PlRigidBodyHandle -> PlVector3 -> IO ()
foreign import ccall unsafe "plSetOrientation" plSetOrientation_ :: PlRigidBodyHandle -> PlQuaternion -> IO ()
foreign import ccall unsafe "plSetEuler" plSetEuler :: CFloat -> CFloat -> CFloat -> PlQuaternion -> IO ()
foreign import ccall unsafe "plRayCast" plRayCast :: PlDynamicsWorldHandle -> PlVector3 -> PlVector3 -> PlRayCastResult -> IO Int
-- TODO : new functions
{-
plCreateRaycastVehicle :: PlVehicleTuning -> PlRigidBodyHandle -> IO PlRaycastVehicleHandle
plAddVehicle :: PlDynamicsWorldHandle -> PlRaycastVehicleHandle -> IO ()
plSetCoordinateSystem :: PlRaycastVehicleHandle -> Int -> Int -> Int -> IO ()
plAddWheel :: PlCFloat3 -> PlCFloat3 -> PlCFloat3 -> CFloat -> CFloat -> PlCFloat5 -> Bool -> IO (wheelinfo ????)
btRaycastVehicle::btVehicleTuning m_tuning;
btVehicleRaycaster* m_vehicleRayCaster;
btRaycastVehicle* m_vehicle;
btCollisionShape* m_wheelShape;
btWheelInfo& addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel);
class btVehicleTuning
{
public:
btVehicleTuning()
:m_suspensionStiffness(btScalar(5.88)),
m_suspensionCompression(btScalar(0.83)),
m_suspensionDamping(btScalar(0.88)),
m_maxSuspensionTravelCm(btScalar(500.)),
m_frictionSlip(btScalar(10.5))
{
}
btScalar m_suspensionStiffness;
btScalar m_suspensionCompression;
btScalar m_suspensionDamping;
btScalar m_maxSuspensionTravelCm;
btScalar m_frictionSlip;
};
-}
-- more nice wrappers
plGetOpenGLMatrix body =
allocaArray 16 f
where
f p = do
plGetOpenGLMatrix_ body p
e0 <- peekElemOff p 0
e1 <- peekElemOff p 1
e2 <- peekElemOff p 2
e3 <- peekElemOff p 3
e4 <- peekElemOff p 4
e5 <- peekElemOff p 5
e6 <- peekElemOff p 6
e7 <- peekElemOff p 7
e8 <- peekElemOff p 8
e9 <- peekElemOff p 9
eA <- peekElemOff p 10
eB <- peekElemOff p 11
eC <- peekElemOff p 12
eD <- peekElemOff p 13
eE <- peekElemOff p 14
eF <- peekElemOff p 15
return (e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,eA,eB,eC,eD,eE,eF)
--mapM (peekElemOff m) [0..15]
packCFloat3 p (x,y,z) = do
pokeElemOff p 0 x
pokeElemOff p 1 y
pokeElemOff p 2 z
unpackCFloat3 p = do
x <- peekElemOff p 0
y <- peekElemOff p 1
z <- peekElemOff p 2
return (x,y,z)
packCFloat4 p (x,y,z,w) = do
pokeElemOff p 0 x
pokeElemOff p 1 y
pokeElemOff p 2 z
pokeElemOff p 3 w
unpackCFloat4 p = do
x <- peekElemOff p 0
y <- peekElemOff p 1
z <- peekElemOff p 2
w <- peekElemOff p 3
return (x,y,z,w)
packCFloat5 p (x,y,z,w,q) = do
pokeElemOff p 0 x
pokeElemOff p 1 y
pokeElemOff p 2 z
pokeElemOff p 3 w
pokeElemOff p 4 q
unpackCFloat5 p = do
x <- peekElemOff p 0
y <- peekElemOff p 1
z <- peekElemOff p 2
w <- peekElemOff p 3
q <- peekElemOff p 4
return (x,y,z,w,q)
plGetPosition body =
allocaArray 3 f
where
f p = do
plGetPosition_ body p
unpackCFloat3 p
plSetPosition b pos =
allocaArray 3 f
where
f p = do
packCFloat3 p pos
plSetPosition_ b p
plGetOrientation body =
allocaArray 4 f
where
f p = do
plGetOrientation_ body p
unpackCFloat4 p
plSetOrientation b o =
allocaArray 4 f
where
f p = do
packCFloat4 p o
plSetOrientation_ b p
plAddChildShape compShape chShape chPos chOrig =
allocaArray 7 f
where
f p = do
packCFloat3 p chPos
packCFloat4 (advancePtr p 3) chOrig
plAddChildShape_ compShape chShape p (advancePtr p 3)
plAddTriangle meshInterface v0 v1 v2 rmDup =
allocaArray 9 f
where
f p = do
packCFloat3 p v0
packCFloat3 (advancePtr p 3) v1
packCFloat3 (advancePtr p 6) v2
plAddTriangle_ meshInterface p (advancePtr p 3) (advancePtr p 6) $ if rmDup then 1 else 0
plSetScaling shape v =
allocaArray 3 f
where
f p = do
packCFloat3 p v
plSetScaling_ shape p