module Graphics.Formats.Obj.Contents
(ObjFile(..),Statement(..),VTriple(..),VDouble(..)
,isVertex,isNormal,isTexCoord
,isPoints,isLines,isFace,isObject
,isUseMtl,isSmoothG
,contentsTests) where
import Test.QuickCheck
import Test.QuickCheck.Instances
import Control.Monad
import Control.Applicative
import Control.Applicative.Infix
import qualified Data.ByteString.Char8 as CBS
newtype ObjFile = OF [Statement]
deriving (Show,Eq)
instance Arbitrary ObjFile where
arbitrary = OF <$> arbitrary
coarbitrary (OF x) = coarbitrary x
data Statement = V !Float !Float !Float !Float
| VN !Float !Float !Float
| VT !Float !Float !Float
| P ![Int]
| L ![VDouble]
| F ![VTriple]
| G ![Group]
| SG !Int
| MtlLib ![CBS.ByteString]
| UseMtl !CBS.ByteString
deriving (Show,Read,Eq)
data VTriple = VTr !Int !(Maybe Int) !(Maybe Int)
deriving (Eq,Ord,Show,Read)
data VDouble = VD !Int !(Maybe Int)
deriving (Eq,Ord,Show,Read)
type Group = CBS.ByteString
instance Arbitrary Statement where
arbitrary =
oneof [V <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
,VN <$> arbitrary <*> arbitrary <*> arbitrary
,VT <$> arbitrary <*> arbitrary <*> arbitrary
,P <$> (nonEmpty nonZero_)
,L <$> (nonEmpty arbitrary)
,F <$> (nonEmpty arbitrary)
,(G . map CBS.pack) <$> (nonEmpty (nonEmpty (notOneof " \t\n\r#")))
,SG <$> positive]
coarbitrary (V x y z w) =
coarbitrary x . coarbitrary y . coarbitrary z . coarbitrary w
coarbitrary (VN x y z) =
coarbitrary x . coarbitrary y . coarbitrary z
coarbitrary (VT x y z) =
coarbitrary x . coarbitrary y . coarbitrary z
coarbitrary (P n) = coarbitrary n
coarbitrary (L n) = coarbitrary n
coarbitrary (F n) = coarbitrary n
coarbitrary (G n) = coarbitrary (map CBS.unpack n)
coarbitrary (SG g) = coarbitrary g
coarbitrary (UseMtl xs) = coarbitrary (CBS.unpack xs)
coarbitrary (MtlLib x) = coarbitrary (map CBS.unpack x)
instance Arbitrary VTriple where
arbitrary = VTr <$> positive <*> maybeGen positive <*> maybeGen positive
coarbitrary (VTr v t n) = coarbitrary v . coarbitrary t . coarbitrary n
instance Arbitrary VDouble where
arbitrary = VD <$> positive <*> maybeGen positive
coarbitrary (VD v t) = coarbitrary v . coarbitrary t
isNormal, isTexCoord, isVertex, isPoints , isLines :: Statement -> Bool
isFace , isObject , isUseMtl, isSmoothG :: Statement -> Bool
isNormal (VN _ _ _ ) = True
isNormal _ = False
isTexCoord (VT _ _ _ ) = True
isTexCoord _ = False
isVertex (V _ _ _ _) = True
isVertex _ = False
isPoints (P _ ) = True
isPoints _ = False
isLines (L _ ) = True
isLines _ = False
isFace (F _ ) = True
isFace _ = False
isUseMtl (UseMtl _ ) = True
isUseMtl _ = False
isSmoothG (SG _ ) = True
isSmoothG _ = False
isObject = isFace <^(||)^> isLines <^(||)^> isPoints
contentsTests :: IO ()
contentsTests = return ()