prepared parsing of meshes

This commit is contained in:
Stefan Dresselhaus
2014-11-27 21:14:16 +01:00
parent ff38526158
commit 2068d86e1b
4 changed files with 71 additions and 35 deletions

View File

@ -1,5 +1,5 @@
{-# LANGUAGE OverloadedStrings #-}
module Scene.Parser (parseScene) where
module Scene.Parser (parseScene, parseMesh) where
import Control.Applicative
import Data.Attoparsec.ByteString.Char8
@ -75,7 +75,7 @@ parseObject = do
return $ OpL (Light p c i)
"sphere" -> parseSphere
"plane" -> parsePlane
"mesh" -> parseMesh
"mesh" -> parseRawMesh
_ -> undefined
parseCamera :: Parser ObjectParser
@ -167,19 +167,24 @@ parseVector = do
where
f = fromRational . toRational --convert Double to Float
parseMesh :: Parser ObjectParser
parseMesh = do
parseRawMesh :: Parser ObjectParser
parseRawMesh = do
name <- takeTill isSpace
skipSpace
shading <- string "FLAT" <|> string "PHONG"
skipSpace
mat <- parseMaterial
let shading' = case shading of
"FLAT" = Flat
"PHONG" = Phong
return $ OpM Mesh
{ meshFilename = name
, meshShading = shading'
, material = mat
"FLAT" -> Flat
"PHONG" -> Phong
return $ OpM UIMesh
{ uimeshFilename = name
, uimeshShading = shading'
, uimaterial = mat
}
parseMesh :: Shading -> Material -> ByteString -> Either String ObjectParser
parseMesh s m f = parseOnly (parseMesh' s m) (preprocess f)
parseMesh' :: Shading -> Material -> Parser ObjectParser
parseMesh' s m = undefined

View File

@ -1,7 +1,9 @@
module Scene.Types where
import Linear (V3)
import Data.IntMap
import qualified Data.Vector as V
import Data.ByteString
type Color = V3 Float
type Intensity = Float
@ -61,29 +63,35 @@ data Plane = Plane
data Shading = Flat | Phong
deriving (Show, Eq)
data Mesh = Mesh
{ meshFilename :: String
, meshShading :: Shading
, material :: Material
data UIMesh = UIMesh
{ uimeshFilename :: ByteString
, uimeshShading :: Shading
, uimaterial :: Material
}
deriving (Show, Eq)
data Mesh = Mesh
{ meshShading :: Shading
, meshMaterial :: Material
, meshVertices :: IntMap (V3 Float)
, meshFaces :: IntMap (V3 Int)
, meshNormals :: IntMap (V3 Float)
, meshFaceNormals :: IntMap (V3 Float)
, meshBounds :: BoundingBox
}
deriving (Show, Eq)
data BoundingBox = BoundingBox
{ boundX :: (Float, Float)
, boundY :: (Float, Float)
, boundZ :: (Float, Float)
}
data MeshObj = MeshObj
{ meshVertices :: V.Vector (V3 Float)
, meshFaces :: V.Vector (V3 Float)
, meshNormals :: V.Vector (V3 Float)
, meshBounds :: BoundingBox
}
deriving (Show, Eq)
data ObjectParser = OpS Sphere
| OpP Plane
| OpM Mesh
| OpM UIMesh
| OpI Mesh
| OpC Camera
| OpL Light
| OpR RecursionDepth
@ -109,4 +117,4 @@ data Scene = Scene
getMaterial :: Collidable -> Material
getMaterial (S (Sphere _ _ m)) = m
getMaterial (P (Plane _ _ m)) = m
getMaterial (M (Mesh _ _ m)) = m
getMaterial (M (Mesh _ m _ _ _ _ _)) = m