-- Produced by boxnd-gen; edit the generator, not this file.

module Box2D.DistanceJoint
  ( create
  , setLength
  , getLength
  , enableSpring
  , isSpringEnabled
  , setSpringForceRange
  , getSpringForceRange
  , setSpringHertz
  , setSpringDampingRatio
  , getSpringHertz
  , getSpringDampingRatio
  , enableLimit
  , isLimitEnabled
  , setLengthRange
  , getMinLength
  , getMaxLength
  , getCurrentLength
  , enableMotor
  , isMotorEnabled
  , setMotorSpeed
  , getMotorSpeed
  , setMaxMotorForce
  , getMaxMotorForce
  , getMotorForce
  )

  where

import Foreign
import Foreign.C.Types (CBool(..))
import Box2D.Id (JointId(..), WorldId(..))
import Box2D.Types (DistanceJointDef)

foreign import ccall unsafe "b2CreateDistanceJoint"
  c_b2CreateDistanceJoint :: WorldId -> Ptr DistanceJointDef -> IO JointId

foreign import ccall unsafe "b2DistanceJoint_SetLength"
  c_b2DistanceJoint_SetLength :: JointId -> Float -> IO ()

foreign import ccall unsafe "b2DistanceJoint_GetLength"
  c_b2DistanceJoint_GetLength :: JointId -> IO Float

foreign import ccall unsafe "b2DistanceJoint_EnableSpring"
  c_b2DistanceJoint_EnableSpring :: JointId -> CBool -> IO ()

foreign import ccall unsafe "b2DistanceJoint_IsSpringEnabled"
  c_b2DistanceJoint_IsSpringEnabled :: JointId -> IO CBool

foreign import ccall unsafe "b2DistanceJoint_SetSpringForceRange"
  c_b2DistanceJoint_SetSpringForceRange :: JointId -> Float -> Float -> IO ()

foreign import ccall unsafe "b2DistanceJoint_GetSpringForceRange"
  c_b2DistanceJoint_GetSpringForceRange :: JointId -> Ptr Float -> Ptr Float -> IO ()

foreign import ccall unsafe "b2DistanceJoint_SetSpringHertz"
  c_b2DistanceJoint_SetSpringHertz :: JointId -> Float -> IO ()

foreign import ccall unsafe "b2DistanceJoint_SetSpringDampingRatio"
  c_b2DistanceJoint_SetSpringDampingRatio :: JointId -> Float -> IO ()

foreign import ccall unsafe "b2DistanceJoint_GetSpringHertz"
  c_b2DistanceJoint_GetSpringHertz :: JointId -> IO Float

foreign import ccall unsafe "b2DistanceJoint_GetSpringDampingRatio"
  c_b2DistanceJoint_GetSpringDampingRatio :: JointId -> IO Float

foreign import ccall unsafe "b2DistanceJoint_EnableLimit"
  c_b2DistanceJoint_EnableLimit :: JointId -> CBool -> IO ()

foreign import ccall unsafe "b2DistanceJoint_IsLimitEnabled"
  c_b2DistanceJoint_IsLimitEnabled :: JointId -> IO CBool

foreign import ccall unsafe "b2DistanceJoint_SetLengthRange"
  c_b2DistanceJoint_SetLengthRange :: JointId -> Float -> Float -> IO ()

foreign import ccall unsafe "b2DistanceJoint_GetMinLength"
  c_b2DistanceJoint_GetMinLength :: JointId -> IO Float

foreign import ccall unsafe "b2DistanceJoint_GetMaxLength"
  c_b2DistanceJoint_GetMaxLength :: JointId -> IO Float

foreign import ccall unsafe "b2DistanceJoint_GetCurrentLength"
  c_b2DistanceJoint_GetCurrentLength :: JointId -> IO Float

foreign import ccall unsafe "b2DistanceJoint_EnableMotor"
  c_b2DistanceJoint_EnableMotor :: JointId -> CBool -> IO ()

foreign import ccall unsafe "b2DistanceJoint_IsMotorEnabled"
  c_b2DistanceJoint_IsMotorEnabled :: JointId -> IO CBool

foreign import ccall unsafe "b2DistanceJoint_SetMotorSpeed"
  c_b2DistanceJoint_SetMotorSpeed :: JointId -> Float -> IO ()

foreign import ccall unsafe "b2DistanceJoint_GetMotorSpeed"
  c_b2DistanceJoint_GetMotorSpeed :: JointId -> IO Float

foreign import ccall unsafe "b2DistanceJoint_SetMaxMotorForce"
  c_b2DistanceJoint_SetMaxMotorForce :: JointId -> Float -> IO ()

foreign import ccall unsafe "b2DistanceJoint_GetMaxMotorForce"
  c_b2DistanceJoint_GetMaxMotorForce :: JointId -> IO Float

foreign import ccall unsafe "b2DistanceJoint_GetMotorForce"
  c_b2DistanceJoint_GetMotorForce :: JointId -> IO Float

{- | Create a distance joint
See also b2DistanceJointDef for details.

Binds @b2CreateDistanceJoint@.
-}
create
  :: WorldId
  -> DistanceJointDef
  -> IO JointId
create :: WorldId -> DistanceJointDef -> IO JointId
create WorldId
a0 DistanceJointDef
a1 =
  DistanceJointDef
-> (Ptr DistanceJointDef -> IO JointId) -> IO JointId
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with DistanceJointDef
a1 ((Ptr DistanceJointDef -> IO JointId) -> IO JointId)
-> (Ptr DistanceJointDef -> IO JointId) -> IO JointId
forall a b. (a -> b) -> a -> b
$ \Ptr DistanceJointDef
p1 ->
  WorldId -> Ptr DistanceJointDef -> IO JointId
c_b2CreateDistanceJoint WorldId
a0 Ptr DistanceJointDef
p1

{- | Set the rest length of a distance joint

Binds @b2DistanceJoint_SetLength@.
-}
setLength
  :: JointId
  -- ^ @jointId@: The id for a distance joint
  -> Float
  -- ^ @length@: The new distance joint length
  -> IO ()
setLength :: JointId -> Float -> IO ()
setLength JointId
a0 Float
a1 =
  JointId -> Float -> IO ()
c_b2DistanceJoint_SetLength JointId
a0 Float
a1

{- | Get the rest length of a distance joint

Binds @b2DistanceJoint_GetLength@.
-}
getLength
  :: JointId
  -> IO Float
getLength :: JointId -> IO Float
getLength JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetLength JointId
a0

{- | Enable\/disable the distance joint spring. When disabled the distance joint is rigid.

Binds @b2DistanceJoint_EnableSpring@.
-}
enableSpring
  :: JointId
  -> Bool
  -- ^ @enableSpring@
  -> IO ()
enableSpring :: JointId -> Bool -> IO ()
enableSpring JointId
a0 Bool
a1 =
  JointId -> CBool -> IO ()
c_b2DistanceJoint_EnableSpring JointId
a0 (Bool -> CBool
forall a. Num a => Bool -> a
fromBool Bool
a1)

{- | Is the distance joint spring enabled?

Binds @b2DistanceJoint_IsSpringEnabled@.
-}
isSpringEnabled
  :: JointId
  -> IO Bool
isSpringEnabled :: JointId -> IO Bool
isSpringEnabled JointId
a0 =
  CBool -> Bool
forall a. (Eq a, Num a) => a -> Bool
toBool (CBool -> Bool) -> IO CBool -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (JointId -> IO CBool
c_b2DistanceJoint_IsSpringEnabled JointId
a0)

{- | Set the force range for the spring.

Binds @b2DistanceJoint_SetSpringForceRange@.
-}
setSpringForceRange
  :: JointId
  -> Float
  -- ^ @lowerForce@
  -> Float
  -- ^ @upperForce@
  -> IO ()
setSpringForceRange :: JointId -> Float -> Float -> IO ()
setSpringForceRange JointId
a0 Float
a1 Float
a2 =
  JointId -> Float -> Float -> IO ()
c_b2DistanceJoint_SetSpringForceRange JointId
a0 Float
a1 Float
a2

{- | Get the force range for the spring.

Binds @b2DistanceJoint_GetSpringForceRange@.
-}
getSpringForceRange
  :: JointId
  -> Ptr Float
  -- ^ @lowerForce@
  -> Ptr Float
  -- ^ @upperForce@
  -> IO ()
getSpringForceRange :: JointId -> Ptr Float -> Ptr Float -> IO ()
getSpringForceRange JointId
a0 Ptr Float
a1 Ptr Float
a2 =
  JointId -> Ptr Float -> Ptr Float -> IO ()
c_b2DistanceJoint_GetSpringForceRange JointId
a0 Ptr Float
a1 Ptr Float
a2

{- | Set the spring stiffness in Hertz

Binds @b2DistanceJoint_SetSpringHertz@.
-}
setSpringHertz
  :: JointId
  -> Float
  -- ^ @hertz@
  -> IO ()
setSpringHertz :: JointId -> Float -> IO ()
setSpringHertz JointId
a0 Float
a1 =
  JointId -> Float -> IO ()
c_b2DistanceJoint_SetSpringHertz JointId
a0 Float
a1

{- | Set the spring damping ratio, non-dimensional

Binds @b2DistanceJoint_SetSpringDampingRatio@.
-}
setSpringDampingRatio
  :: JointId
  -> Float
  -- ^ @dampingRatio@
  -> IO ()
setSpringDampingRatio :: JointId -> Float -> IO ()
setSpringDampingRatio JointId
a0 Float
a1 =
  JointId -> Float -> IO ()
c_b2DistanceJoint_SetSpringDampingRatio JointId
a0 Float
a1

{- | Get the spring Hertz

Binds @b2DistanceJoint_GetSpringHertz@.
-}
getSpringHertz
  :: JointId
  -> IO Float
getSpringHertz :: JointId -> IO Float
getSpringHertz JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetSpringHertz JointId
a0

{- | Get the spring damping ratio

Binds @b2DistanceJoint_GetSpringDampingRatio@.
-}
getSpringDampingRatio
  :: JointId
  -> IO Float
getSpringDampingRatio :: JointId -> IO Float
getSpringDampingRatio JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetSpringDampingRatio JointId
a0

{- | Enable joint limit. The limit only works if the joint spring is enabled. Otherwise the joint is rigid
and the limit has no effect.

Binds @b2DistanceJoint_EnableLimit@.
-}
enableLimit
  :: JointId
  -> Bool
  -- ^ @enableLimit@
  -> IO ()
enableLimit :: JointId -> Bool -> IO ()
enableLimit JointId
a0 Bool
a1 =
  JointId -> CBool -> IO ()
c_b2DistanceJoint_EnableLimit JointId
a0 (Bool -> CBool
forall a. Num a => Bool -> a
fromBool Bool
a1)

{- | Is the distance joint limit enabled?

Binds @b2DistanceJoint_IsLimitEnabled@.
-}
isLimitEnabled
  :: JointId
  -> IO Bool
isLimitEnabled :: JointId -> IO Bool
isLimitEnabled JointId
a0 =
  CBool -> Bool
forall a. (Eq a, Num a) => a -> Bool
toBool (CBool -> Bool) -> IO CBool -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (JointId -> IO CBool
c_b2DistanceJoint_IsLimitEnabled JointId
a0)

{- | Set the minimum and maximum length parameters of a distance joint

Binds @b2DistanceJoint_SetLengthRange@.
-}
setLengthRange
  :: JointId
  -> Float
  -- ^ @minLength@
  -> Float
  -- ^ @maxLength@
  -> IO ()
setLengthRange :: JointId -> Float -> Float -> IO ()
setLengthRange JointId
a0 Float
a1 Float
a2 =
  JointId -> Float -> Float -> IO ()
c_b2DistanceJoint_SetLengthRange JointId
a0 Float
a1 Float
a2

{- | Get the distance joint minimum length

Binds @b2DistanceJoint_GetMinLength@.
-}
getMinLength
  :: JointId
  -> IO Float
getMinLength :: JointId -> IO Float
getMinLength JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetMinLength JointId
a0

{- | Get the distance joint maximum length

Binds @b2DistanceJoint_GetMaxLength@.
-}
getMaxLength
  :: JointId
  -> IO Float
getMaxLength :: JointId -> IO Float
getMaxLength JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetMaxLength JointId
a0

{- | Get the current length of a distance joint

Binds @b2DistanceJoint_GetCurrentLength@.
-}
getCurrentLength
  :: JointId
  -> IO Float
getCurrentLength :: JointId -> IO Float
getCurrentLength JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetCurrentLength JointId
a0

{- | Enable\/disable the distance joint motor

Binds @b2DistanceJoint_EnableMotor@.
-}
enableMotor
  :: JointId
  -> Bool
  -- ^ @enableMotor@
  -> IO ()
enableMotor :: JointId -> Bool -> IO ()
enableMotor JointId
a0 Bool
a1 =
  JointId -> CBool -> IO ()
c_b2DistanceJoint_EnableMotor JointId
a0 (Bool -> CBool
forall a. Num a => Bool -> a
fromBool Bool
a1)

{- | Is the distance joint motor enabled?

Binds @b2DistanceJoint_IsMotorEnabled@.
-}
isMotorEnabled
  :: JointId
  -> IO Bool
isMotorEnabled :: JointId -> IO Bool
isMotorEnabled JointId
a0 =
  CBool -> Bool
forall a. (Eq a, Num a) => a -> Bool
toBool (CBool -> Bool) -> IO CBool -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (JointId -> IO CBool
c_b2DistanceJoint_IsMotorEnabled JointId
a0)

{- | Set the distance joint motor speed, usually in meters per second

Binds @b2DistanceJoint_SetMotorSpeed@.
-}
setMotorSpeed
  :: JointId
  -> Float
  -- ^ @motorSpeed@
  -> IO ()
setMotorSpeed :: JointId -> Float -> IO ()
setMotorSpeed JointId
a0 Float
a1 =
  JointId -> Float -> IO ()
c_b2DistanceJoint_SetMotorSpeed JointId
a0 Float
a1

{- | Get the distance joint motor speed, usually in meters per second

Binds @b2DistanceJoint_GetMotorSpeed@.
-}
getMotorSpeed
  :: JointId
  -> IO Float
getMotorSpeed :: JointId -> IO Float
getMotorSpeed JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetMotorSpeed JointId
a0

{- | Set the distance joint maximum motor force, usually in newtons

Binds @b2DistanceJoint_SetMaxMotorForce@.
-}
setMaxMotorForce
  :: JointId
  -> Float
  -- ^ @force@
  -> IO ()
setMaxMotorForce :: JointId -> Float -> IO ()
setMaxMotorForce JointId
a0 Float
a1 =
  JointId -> Float -> IO ()
c_b2DistanceJoint_SetMaxMotorForce JointId
a0 Float
a1

{- | Get the distance joint maximum motor force, usually in newtons

Binds @b2DistanceJoint_GetMaxMotorForce@.
-}
getMaxMotorForce
  :: JointId
  -> IO Float
getMaxMotorForce :: JointId -> IO Float
getMaxMotorForce JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetMaxMotorForce JointId
a0

{- | Get the distance joint current motor force, usually in newtons

Binds @b2DistanceJoint_GetMotorForce@.
-}
getMotorForce
  :: JointId
  -> IO Float
getMotorForce :: JointId -> IO Float
getMotorForce JointId
a0 =
  JointId -> IO Float
c_b2DistanceJoint_GetMotorForce JointId
a0