rattletrap-10.0.0: src/lib/Rattletrap/Type/Rotation.hs
module Rattletrap.Type.Rotation where
import qualified Data.Foldable as Foldable
import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.CompressedWordVector as CompressedWordVector
import qualified Rattletrap.Type.Quaternion as Quaternion
import qualified Rattletrap.Type.Version as Version
import qualified Rattletrap.Utility.Json as Json
data Rotation
= CompressedWordVector CompressedWordVector.CompressedWordVector
| Quaternion Quaternion.Quaternion
deriving (Eq, Show)
instance Json.FromJSON Rotation where
parseJSON = Json.withObject "Rotation" $ \object -> Foldable.asum
[ CompressedWordVector <$> Json.required object "compressed_word_vector"
, Quaternion <$> Json.required object "quaternion"
]
instance Json.ToJSON Rotation where
toJSON x = case x of
CompressedWordVector y ->
Json.object [Json.pair "compressed_word_vector" y]
Quaternion y -> Json.object [Json.pair "quaternion" y]
schema :: Schema.Schema
schema = Schema.named "rotation" . Schema.oneOf $ fmap
(\(k, v) -> Schema.object [(Json.pair k $ Schema.ref v, True)])
[ ("compressed_word_vector", CompressedWordVector.schema)
, ("quaternion", Quaternion.schema)
]
bitPut :: Rotation -> BitPut.BitPut
bitPut r = case r of
CompressedWordVector cwv -> CompressedWordVector.bitPut cwv
Quaternion q -> Quaternion.bitPut q
bitGet :: Version.Version -> BitGet.BitGet Rotation
bitGet version = if isQuaternion version
then Quaternion <$> Quaternion.bitGet
else CompressedWordVector <$> CompressedWordVector.bitGet
isQuaternion :: Version.Version -> Bool
isQuaternion v =
Version.major v >= 868 && Version.minor v >= 22 && Version.patch v >= 7