module PLY.Conf (parseConf, Transformation, Conf(..)) where
import Control.Applicative
import Data.Attoparsec.Char8
import Data.ByteString (ByteString)
import Linear.V3
import Linear.Quaternion
import PLY.Internal.Parsers (line, word)
type Transformation a = (V3 a, Quaternion a)
data Conf = Conf { camera :: Transformation Double
, meshes :: [(ByteString, Transformation Double)] }
deriving Show
transformation :: Parser (V3 Double, Quaternion Double)
transformation = (,) <$> vec <*> rotation
where vec = (\[x,y,z] -> V3 x y z) <$> count 3 (skipSpace *> double)
rotation = Quaternion <$> (skipSpace *> double) <*> vec
mesh :: Parser (ByteString, Transformation Double)
mesh = (,) <$> ("bmesh " .*> word) <*> transformation
conf :: Parser Conf
conf = Conf <$> ("camera " .*> transformation <* skipSpace)
<*> (skipSpace *> cybmesh *> many1 (skipSpace *> mesh))
where cybmesh = skipMany ("mesh " .*> line)
parseConf :: ByteString -> Either String Conf
parseConf = parseOnly conf