module Physics.ODE.Joint
(createBall, createHinge, createSlider, createContact, createGroup,
destroyJoint, destroyGroup, emptyGroup, attach, setRawJointData,
setJointData, setSafeJointData, getRawJointData, getJointData,
getSafeJointData, tryGetSafeJointData, getType, getBody,
areConnected, areConnectedExcluding, setBallAnchor, getBallAnchor,
setHingeAnchor, setHingeAxis)
where
import Foreign
import Data.Typeable
import Data.Maybe
import Physics.ODE.Types
import Physics.ODE.Utilities
import Physics.ODE.Hsc
createGroup :: IO JointGroup
createGroup = createGroup' 0
foreign import ccall unsafe "dJointSetData" setRawJointData ::
Ptr JointStruct -> Ptr a -> IO ()
setJointData :: Joint -> a -> IO ()
setJointData body d
= newStablePtr d >>=
\ stablePtr -> setRawJointData body (castStablePtrToPtr stablePtr)
setSafeJointData :: (Typeable a) => Joint -> a -> IO ()
setSafeJointData body d = setJointData body (typeOf d, d)
foreign import ccall unsafe "dJointGetData" getRawJointData ::
Ptr JointStruct -> IO (Ptr a)
getJointData :: Joint -> IO a
getJointData body
= getRawJointData body >>= deRefStablePtr . castPtrToStablePtr
tryGetSafeJointData :: (Typeable a) => Joint -> IO (Maybe a)
tryGetSafeJointData body
= getJointData body >>=
\ (t, d) ->
if t == typeOf d then return (Just d) else return Nothing
getSafeJointData :: (Typeable a) => Joint -> IO a
getSafeJointData
= fmap (fromMaybe (error errMsg)) . tryGetSafeJointData
where errMsg = "Physics.ODE.Joint.getSafeJointData: invalid type."
createBall :: World -> Maybe JointGroup -> IO Joint
createBall = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (case arg_1 of
Data.Maybe.Just a_4 -> \action_5 -> action_5 a_4
Data.Maybe.Nothing -> \action_6 -> action_6 nullPtr) (\marshaledArg_7 -> do ret_8 <- createBalldJointCreateBall marshaledArg_3 marshaledArg_7
return (ret_8)))
foreign import ccall unsafe "dJointCreateBall" createBalldJointCreateBall :: World ->
JointGroup -> IO Joint
createHinge :: World -> Maybe JointGroup -> IO Joint
createHinge = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (case arg_1 of
Data.Maybe.Just a_4 -> \action_5 -> action_5 a_4
Data.Maybe.Nothing -> \action_6 -> action_6 nullPtr) (\marshaledArg_7 -> do ret_8 <- createHingedJointCreateHinge marshaledArg_3 marshaledArg_7
return (ret_8)))
foreign import ccall unsafe "dJointCreateHinge" createHingedJointCreateHinge :: World ->
JointGroup ->
IO Joint
createSlider :: World -> Maybe JointGroup -> IO Joint
createSlider = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (case arg_1 of
Data.Maybe.Just a_4 -> \action_5 -> action_5 a_4
Data.Maybe.Nothing -> \action_6 -> action_6 nullPtr) (\marshaledArg_7 -> do ret_8 <- createSliderdJointCreateSlider marshaledArg_3 marshaledArg_7
return (ret_8)))
foreign import ccall unsafe "dJointCreateSlider" createSliderdJointCreateSlider :: World ->
JointGroup ->
IO Joint
createContact :: World ->
Maybe JointGroup -> ContactInfo -> IO Joint
createContact = \arg_0 arg_1 arg_2 -> (\action_3 -> action_3 arg_0) (\marshaledArg_4 -> (case arg_1 of
Data.Maybe.Just a_5 -> \action_6 -> action_6 a_5
Data.Maybe.Nothing -> \action_7 -> action_7 nullPtr) (\marshaledArg_8 -> (\action_9 -> alloca (\ptr_10 -> do poke ptr_10 arg_2
action_9 ptr_10)) (\marshaledArg_11 -> do ret_12 <- createContactdJointCreateContact marshaledArg_4 marshaledArg_8 marshaledArg_11
return (ret_12))))
foreign import ccall unsafe "dJointCreateContact" createContactdJointCreateContact :: World ->
JointGroup ->
Ptr ContactInfo ->
IO Joint
createGroup' :: Int -> IO JointGroup
createGroup' = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> do ret_3 <- createGroup'dJointGroupCreate marshaledArg_2
return (ret_3))
foreign import ccall unsafe "dJointGroupCreate" createGroup'dJointGroupCreate :: Int ->
IO JointGroup
destroyJoint :: Joint -> IO ()
destroyJoint = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> do ret_3 <- destroyJointdJointDestroy marshaledArg_2
case () of
() -> do return ())
foreign import ccall unsafe "dJointDestroy" destroyJointdJointDestroy :: Joint ->
IO ()
destroyGroup :: JointGroup -> IO ()
destroyGroup = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> do ret_3 <- destroyGroupdJointGroupDestroy marshaledArg_2
case () of
() -> do return ())
foreign import ccall unsafe "dJointGroupDestroy" destroyGroupdJointGroupDestroy :: JointGroup ->
IO ()
emptyGroup :: JointGroup -> IO ()
emptyGroup = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> do ret_3 <- emptyGroupdJointGroupEmpty marshaledArg_2
case () of
() -> do return ())
foreign import ccall unsafe "dJointGroupEmpty" emptyGroupdJointGroupEmpty :: JointGroup ->
IO ()
attach :: Joint -> Maybe Body -> Maybe Body -> IO ()
attach = \arg_0 arg_1 arg_2 -> (\action_3 -> action_3 arg_0) (\marshaledArg_4 -> (case arg_1 of
Data.Maybe.Just a_5 -> \action_6 -> action_6 a_5
Data.Maybe.Nothing -> \action_7 -> action_7 nullPtr) (\marshaledArg_8 -> (case arg_2 of
Data.Maybe.Just a_9 -> \action_10 -> action_10 a_9
Data.Maybe.Nothing -> \action_11 -> action_11 nullPtr) (\marshaledArg_12 -> do ret_13 <- attachdJointAttach marshaledArg_4 marshaledArg_8 marshaledArg_12
case () of
() -> do return ())))
foreign import ccall unsafe "dJointAttach" attachdJointAttach :: Joint ->
Body -> Body -> IO ()
getType :: Joint -> IO JointType
getType = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> do ret_3 <- getTypedJointGetType marshaledArg_2
return (toJointType (ret_3)))
foreign import ccall unsafe "dJointGetType" getTypedJointGetType :: Joint ->
IO Int
getBody :: Joint -> BodyIndex -> IO Body
getBody = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (\action_4 -> action_4 (fromBodyIndex arg_1)) (\marshaledArg_5 -> do ret_6 <- getBodydJointGetBody marshaledArg_3 marshaledArg_5
return (ret_6)))
foreign import ccall unsafe "dJointGetBody" getBodydJointGetBody :: Joint ->
Int -> IO Body
areConnected :: Body -> Body -> IO Bool
areConnected = \arg_0 arg_1 -> (\action_2 -> action_2 arg_0) (\marshaledArg_3 -> (\action_4 -> action_4 arg_1) (\marshaledArg_5 -> do ret_6 <- areConnecteddAreConnected marshaledArg_3 marshaledArg_5
return (toBool (ret_6))))
foreign import ccall unsafe "dAreConnected" areConnecteddAreConnected :: Body ->
Body -> IO Int
areConnectedExcluding :: Body -> Body -> JointType -> IO Bool
areConnectedExcluding = \arg_0 arg_1 arg_2 -> (\action_3 -> action_3 arg_0) (\marshaledArg_4 -> (\action_5 -> action_5 arg_1) (\marshaledArg_6 -> (\action_7 -> action_7 (fromJointType arg_2)) (\marshaledArg_8 -> do ret_9 <- areConnectedExcludingdAreConnectedExcluding marshaledArg_4 marshaledArg_6 marshaledArg_8
return (toBool (ret_9)))))
foreign import ccall unsafe "dAreConnectedExcluding" areConnectedExcludingdAreConnectedExcluding :: Body ->
Body ->
Int ->
IO Int
setBallAnchor :: Joint -> ODEreal -> ODEreal -> ODEreal -> IO ()
setBallAnchor = \arg_0 arg_1 arg_2 arg_3 -> (\action_4 -> action_4 arg_0) (\marshaledArg_5 -> (\action_6 -> action_6 arg_1) (\marshaledArg_7 -> (\action_8 -> action_8 arg_2) (\marshaledArg_9 -> (\action_10 -> action_10 arg_3) (\marshaledArg_11 -> do ret_12 <- setBallAnchordJointSetBallAnchor marshaledArg_5 marshaledArg_7 marshaledArg_9 marshaledArg_11
case () of
() -> do return ()))))
foreign import ccall unsafe "dJointSetBallAnchor" setBallAnchordJointSetBallAnchor :: Joint ->
ODEreal ->
ODEreal ->
ODEreal ->
IO ()
getBallAnchor :: Joint -> IO ((ODEreal, ODEreal, ODEreal))
getBallAnchor = \arg_0 -> (\action_1 -> action_1 arg_0) (\marshaledArg_2 -> allocaArray 4 (\marshaledArg_3 -> do ret_4 <- getBallAnchordJointGetBallAnchor marshaledArg_2 marshaledArg_3
peekVector3 (marshaledArg_3)))
foreign import ccall unsafe "dJointGetBallAnchor" getBallAnchordJointGetBallAnchor :: Joint ->
Ptr ODEreal ->
IO ()
setHingeAnchor :: Joint -> ODEreal -> ODEreal -> ODEreal -> IO ()
setHingeAnchor = \arg_0 arg_1 arg_2 arg_3 -> (\action_4 -> action_4 arg_0) (\marshaledArg_5 -> (\action_6 -> action_6 arg_1) (\marshaledArg_7 -> (\action_8 -> action_8 arg_2) (\marshaledArg_9 -> (\action_10 -> action_10 arg_3) (\marshaledArg_11 -> do ret_12 <- setHingeAnchordJointSetHingeAnchor marshaledArg_5 marshaledArg_7 marshaledArg_9 marshaledArg_11
case () of
() -> do return ()))))
foreign import ccall unsafe "dJointSetHingeAnchor" setHingeAnchordJointSetHingeAnchor :: Joint ->
ODEreal ->
ODEreal ->
ODEreal ->
IO ()
setHingeAxis :: Joint -> ODEreal -> ODEreal -> ODEreal -> IO ()
setHingeAxis = \arg_0 arg_1 arg_2 arg_3 -> (\action_4 -> action_4 arg_0) (\marshaledArg_5 -> (\action_6 -> action_6 arg_1) (\marshaledArg_7 -> (\action_8 -> action_8 arg_2) (\marshaledArg_9 -> (\action_10 -> action_10 arg_3) (\marshaledArg_11 -> do ret_12 <- setHingeAxisdJointSetHingeAxis marshaledArg_5 marshaledArg_7 marshaledArg_9 marshaledArg_11
case () of
() -> do return ()))))
foreign import ccall unsafe "dJointSetHingeAxis" setHingeAxisdJointSetHingeAxis :: Joint ->
ODEreal ->
ODEreal ->
ODEreal -> IO ()