module PLY.Types (module Data.Int, module Data.Word,
Format(..), Scalar(..), ScalarT(..),
Property(..), Element(..), PLYType(..), Storable) where
import Data.ByteString (ByteString)
import Data.Int
import Data.Word
import Foreign.Storable (Storable)
data Format = ASCII | Binary_LE | Binary_BE deriving Show
data Scalar = Schar !Int8
| Suchar !Word8
| Sshort !Int16
| Sushort !Word16
| Sint !Int
| Suint !Word32
| Sfloat !Float
| Sdouble !Double
deriving Show
data ScalarT = Tchar | Tuchar | Tshort | Tushort | Tint | Tuint
| Tfloat | Tdouble deriving (Eq,Show)
data Property = ScalarProperty !ScalarT !ByteString
| ListProperty !ScalarT !ByteString
deriving Show
data Element = Element { elName :: ByteString
, elNum :: Int
, elProps :: [Property] } deriving Show
class Storable a => PLYType a where
plyType :: a -> ScalarT
unsafeUnwrap :: Scalar -> a
instance PLYType Float where
plyType _ = Tfloat
unsafeUnwrap (Sfloat x) = x
unsafeUnwrap y = error $ "Tried to unwrap "++show y++" as a Float"
instance PLYType Double where
plyType _ = Tdouble
unsafeUnwrap (Sdouble x) = x
unsafeUnwrap y = error $ "Tried to unwrap "++show y++" as a Double"
instance PLYType Int where
plyType _ = Tint
unsafeUnwrap (Sint x) = x
unsafeUnwrap y = error $ "Tried to unwrap "++show y++" as an Int"
instance PLYType Word8 where
plyType _ = Tuchar
unsafeUnwrap (Suchar x) = x
unsafeUnwrap y = error $ "Tried to unwrap "++show y++" as a Word8"