cal3d-0.1: Graphics/Animation/Cal3D/Mixer.hs
{-# LANGUAGE ForeignFunctionInterface #-}
{-# INCLUDE "cal3d_c.h" #-}
module Graphics.Animation.Cal3D.Mixer
(newMixer, deleteMixer
, blendCycle, clearCycle, executeAction
)
where
import Foreign
import Foreign.C.Types
import Foreign.C.String
import Graphics.Animation.Cal3D.Types
import Graphics.Animation.Cal3D.Error
-- | Create a Mixer.
foreign import ccall safe "newMixer"
newMixer :: IO Mixer
-- | Destroy a Mixer.
foreign import ccall safe "deleteMixer"
deleteMixer :: Mixer -> IO ()
-- | Add an animation to be "cycled" (repeated) to the current mix.
-- The animation will continue playing until removed by 'clearCycle'.
blendCycle :: Mixer
-> AnimationId
-> Float -- ^ weight of this animation; weights should sum to 1.0
-> Float -- ^ delay in seconds before the animation starts
-> IO (Either String ())
blendCycle mixer (AnimationId id) weight delay =
checkError (c_blendCycle mixer id
(realToFrac weight)
(realToFrac delay))
0 "blendCycle failed"
foreign import ccall safe "blendCycle"
c_blendCycle :: Mixer -> CInt -> CFloat -> CFloat -> IO CInt
-- | Remove a "cycled" animation from the current mix.
clearCycle :: Mixer
-> AnimationId
-> Float -- ^ delay in seconds before the animation ends
-> IO (Either String ())
clearCycle mixer (AnimationId id) delay =
checkError (c_clearCycle mixer id (realToFrac delay))
0 "clearCycle failed"
foreign import ccall safe "clearCycle"
c_clearCycle :: Mixer -> CInt -> CFloat -> IO CInt
-- | Execute an animation once, instead of repeating it.
executeAction :: Mixer
-> AnimationId
-> Float -- ^ delay in
-> Float -- ^ delay out
-> Float -- ^ weight target
-> Bool -- ^ autolock?
-> IO (Either String ())
executeAction mixer (AnimationId id) delayIn delayOut weightTarget autoLock =
checkError (c_executeAction mixer id
(realToFrac delayIn)
(realToFrac delayOut)
(realToFrac weightTarget)
(fromBool autoLock))
0 "executeAction failed"
foreign import ccall safe "executeAction"
c_executeAction :: Mixer -> CInt -> CFloat -> CFloat -> CFloat ->
CInt -> IO CInt