module Octane.Type.Frame (Frame(..)) where
import qualified Data.Binary.Bits.Get as Bits
import qualified Data.Binary.Bits.Put as Bits
import qualified Data.Word as Word
import Octane.Core
import Octane.Type.Primitive.Float32LE
import Octane.Type.Replication
data Frame = Frame
{ frameTime :: Float32LE
, frameDelta :: Float32LE
, frameReplications :: [Replication]
} deriving (Eq, Generic, NFData, Show)
instance BinaryBit Frame where
getBits _ = do
time <- Bits.getWord32be 32
delta <- Bits.getWord32be 32
replications <- getReplications
return Frame
{ frameTime = wordToFloat time
, frameDelta = wordToFloat delta
, frameReplications = replications
}
putBits _ frame = do
frame & frameTime & floatToWord & Bits.putWord32be 32
frame & frameDelta & floatToWord & Bits.putWord32be 32
frame & frameReplications & putReplications
wordToFloat :: Word.Word32 -> Float32LE
wordToFloat _ = Float32LE 0
floatToWord :: Float32LE -> Word.Word32
floatToWord _ = 0
getReplications :: BitGet [Replication]
getReplications = do
hasReplication <- Bits.getBool
if hasReplication
then do
replication <- getBits undefined
replications <- getReplications
return (replication : replications)
else return []
putReplications :: [Replication] -> BitPut ()
putReplications replications = case replications of
[] -> Bits.putBool False
replication : rest -> do
Bits.putBool True
putBits undefined replication
putReplications rest