packages feed

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