module Rattletrap.Decode.Quaternion
  ( decodeQuaternionBits
  )
where

import Rattletrap.Decode.Common
import Rattletrap.Decode.CompressedWord
import Rattletrap.Type.CompressedWord
import Rattletrap.Type.Quaternion

decodeQuaternionBits :: DecodeBits Quaternion
decodeQuaternionBits =
  toQuaternion <$> decodeComponent <*> decodePart <*> decodePart <*> decodePart

decodeComponent :: DecodeBits Component
decodeComponent = do
  x <- decodeCompressedWordBits 3
  case compressedWordValue x of
    0 -> pure ComponentX
    1 -> pure ComponentY
    2 -> pure ComponentZ
    3 -> pure ComponentW
    y -> fail ("invalid component: " <> show y)

decodePart :: DecodeBits Double
decodePart = decompressPart <$> decodeCompressedWordBits maxCompressedValue