rattletrap-0.1.0: library/Rattletrap/AttributeValue/RigidBodyState.hs
module Rattletrap.AttributeValue.RigidBodyState where
import Rattletrap.CompressedWordVector
import Rattletrap.Vector
import qualified Data.Binary.Bits.Get as BinaryBit
import qualified Data.Binary.Bits.Put as BinaryBit
data RigidBodyStateAttributeValue = RigidBodyStateAttributeValue
{ rigidBodyStateAttributeValueSleeping :: Bool
, rigidBodyStateAttributeValueLocation :: Vector
, rigidBodyStateAttributeValueRotation :: CompressedWordVector
, rigidBodyStateAttributeValueLinearVelocity :: Maybe Vector
, rigidBodyStateAttributeValueAngularVelocity :: Maybe Vector
} deriving (Eq, Ord, Show)
getRigidBodyStateAttributeValue :: BinaryBit.BitGet RigidBodyStateAttributeValue
getRigidBodyStateAttributeValue = do
sleeping <- BinaryBit.getBool
location <- getVector
rotation <- getCompressedWordVector
linearVelocity <-
if sleeping
then pure Nothing
else do
linearVelocity <- getVector
pure (Just linearVelocity)
angularVelocity <-
if sleeping
then pure Nothing
else do
angularVelocity <- getVector
pure (Just angularVelocity)
pure
(RigidBodyStateAttributeValue
sleeping
location
rotation
linearVelocity
angularVelocity)
putRigidBodyStateAttributeValue :: RigidBodyStateAttributeValue
-> BinaryBit.BitPut ()
putRigidBodyStateAttributeValue rigidBodyStateAttributeValue = do
BinaryBit.putBool
(rigidBodyStateAttributeValueSleeping rigidBodyStateAttributeValue)
putVector (rigidBodyStateAttributeValueLocation rigidBodyStateAttributeValue)
putCompressedWordVector
(rigidBodyStateAttributeValueRotation rigidBodyStateAttributeValue)
case rigidBodyStateAttributeValueLinearVelocity rigidBodyStateAttributeValue of
Nothing -> pure ()
Just linearVelocity -> putVector linearVelocity
case rigidBodyStateAttributeValueAngularVelocity rigidBodyStateAttributeValue of
Nothing -> pure ()
Just angularVelocity -> putVector angularVelocity