WaveFront 0.1.0.1 → 0.1.0.2
raw patch · 2 files changed
+213/−2 lines, 2 files
Files
- WaveFront.cabal +3/−2
- src/Graphics/WaveFront/Types.hs +210/−0
WaveFront.cabal view
@@ -10,7 +10,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change -version: 0.1.0.1 +version: 0.1.0.2 -- A short (one-line) description of the package. synopsis: Parsers and utilities for the OBJ WaveFront 3D model format @@ -48,7 +48,8 @@ library -- Modules exported by the library. - exposed-modules: Graphics.WaveFront.Utilities, Graphics.WaveFront.Parsers, Graphics.WaveFront.Load, Graphics.WaveFront.Foreign + exposed-modules: Graphics.WaveFront.Types, Graphics.WaveFront.Utilities, Graphics.WaveFront.Parsers, Graphics.WaveFront.Load, + Graphics.WaveFront.Foreign -- Modules included in this library but not exported. -- other-modules:
+ src/Graphics/WaveFront/Types.hs view
@@ -0,0 +1,210 @@+-- | +-- Module : Graphics.WaveFront.Types +-- Description : +-- Copyright : (c) Jonatan H Sundqvist, 2015 +-- License : MIT +-- Maintainer : Jonatan H Sundqvist +-- Stability : experimental|stable +-- Portability : POSIX (not sure) +-- + +-- Created October 30 2015 + +-- TODO | - +-- - + +-- SPEC | - +-- - + + + +-------------------------------------------------------------------------------------------------------------------------------------------- +-- GHC Pragmas +-------------------------------------------------------------------------------------------------------------------------------------------- + + + + +-------------------------------------------------------------------------------------------------------------------------------------------- +-- API +-------------------------------------------------------------------------------------------------------------------------------------------- +module Graphics.WaveFront.Types where + + + +-------------------------------------------------------------------------------------------------------------------------------------------- +-- We'll need these +-------------------------------------------------------------------------------------------------------------------------------------------- +import qualified Data.Map as Map +import Foreign.Storable + + + +-------------------------------------------------------------------------------------------------------------------------------------------- +-- Types +-------------------------------------------------------------------------------------------------------------------------------------------- + +-- OBJ parser types ------------------------------------------------------------------------------------------------------------------------ +-- | Represents a single (valid) OBJ token +-- +-- TODO: Polymorphic numerical types (?) +-- TODO: Add context, metadata (eg. line numbers, filename) (?) +-- TODO: Naming scheme (added OBJ prefix to prevent name clashes; cf. Face type) +-- TODO: Comment token (preserve comments in parser output or remove them) (?) +data OBJToken = OBJVertex Float Float Float | + OBJNormal Float Float Float | + OBJTexture Float Float | + OBJFace [(Int, Maybe Int, Maybe Int)] | -- TODO: Associate material with each face, handle absent indices + + UseMTL String | -- + LibMTL String | -- TODO: Use actual MTL type + + Group [String] | -- TODO: Do grouped faces have to be consecutive? + Object [String] -- TODO: What is the difference between group and object? + deriving (Eq, Show) -- TODO: Derive Read (?) + + +-- | +-- TODO: Rename (?) +data OBJNoParse = OBJComment String | OBJEmpty | OBJNoSuchAttribute String | OBJNoParse String deriving (Show) + + +-- | +-- TODO: Use error type instead of String, allowing us to distinguish invalid data +-- from eg. comments and blank lines (?) +type OBJRow = (Int, Either OBJNoParse OBJToken, String) + + +-- | Output type of the OBJ parser. Currently a list of line number and token (or error string) pairs +-- +-- TODO: Rename (?) +-- TODO: Use Integral for line number (?) +-- +type OBJ = [OBJRow] + +-- MTL parser types ------------------------------------------------------------------------------------------------------------------------ + +-- | Represents a single (valid) MTL token +-- +-- TODO: Is the alpha channel optional, ignored, disallowed? +-- TODO: Include support for ('Ns', 'Ni', 'd', 'Tr', 'illum') +-- +data MTLToken = Ambient Float Float Float (Maybe Float) | -- Ka + Diffuse Float Float Float (Maybe Float) | -- Kd + Specular Float Float Float (Maybe Float) | -- Ks + + MapDiffuse String | -- map_Kd + NewMaterial String -- newmtl + deriving (Eq, Show) + + +-- | +-- TODO: Rename (?) +data MTLNoParse = MTLComment String | MTLEmpty | MTLNoSuchAttribute String | MTLNoParse String deriving (Show) + + +-- | Output type of the single-row MTL parser. +type MTLRow = (Int, Either MTLNoParse MTLToken, String) + + +-- | Output type of the MTL parser. Currently a list of line number and token (or error string) pairs +-- +-- TODO: Add type for processed MTL (eg. a map between names and materials) +-- +type MTL = [MTLRow] -- (line number, MTL token, comment) + + +-- | +type MTLTable = Map.Map String (Map.Map String Material) + +-- Model ----------------------------------------------------------------------------------------------------------------------------------- + +-- | +-- data Attributes = Attributes { + -- vertexdata :: Vertices + -- texcoorddata :: TexCoords +-- } + +-- newtype Vertices = Vertices [Vector Float] +-- newtype TexCoords = TexCoords [Maybe (Point Float)] +-- newtype Normals = Normals [Maybe (Vector Float)] +-- newtype Materials = Materials [Material] + +type Vertices = [Vector Float] +type TexCoords = [Maybe (Point Float)] +type Normals = [Maybe (Vector Float)] +type Materials = [Material] + +-- General types --------------------------------------------------------------------------------------------------------------------------- + +type Vector num = (num, num, num) -- Queen Vectoria +type Point num = (num, num) -- Haskell is no longer Point-free + +-- API types ------------------------------------------------------------------------------------------------------------------------------- + +-- | +-- TODO: Validation (eg. length ivertices == length == ivertices == length itextures if length isn't 0) +-- TOOD: Pack indices in a tuple (eg. indices :: [(Int, Int, Int)]) (?) +-- TOOD: Use (String, String) for the names of the mtl file and material instead of Material (?) +-- TODO: Use types so as not to confuse the indices (eg. newtype INormal, newtype ITexcoord) +data Face = Face { indices :: [(Int, Maybe Int, Maybe Int)], material :: Material } deriving (Show) + + +-- | +type Colour = (Float, Float, Float, Float) + + +-- | +-- TODO: Do all materials have an ambient, a diffuse and a specular colour (?) +-- TODO: Support more attributes (entire spec) (?) +-- TODO: Lenses (?) +data Material = Material { ambient :: Colour, diffuse :: Colour, specular :: Colour, texture :: Maybe String } deriving (Show) + + +-- | Abstract representation of an OBJ model with associated MTL definitions. +-- +-- TODO: Rename (?) +-- TODO: Include metadata, comments, rejected data (?) +-- TODO: Separate type for processed OBJTokens (ie. token + context) +-- TODO: Perform index lookups (?) +-- TODO: Reconsider the types (especially of the materials) +-- TODO: Rename accessor functions (eg. texcoords instead of textures) (?) +-- +data Model = Model { vertices :: [Vector Float], + normals :: [Vector Float], + texcoords :: [Point Float], + faces :: [Face], + materials :: MTLTable, -- TODO: Type synonym (?) + groups :: Map.Map [String] (Int, Int), -- TODO: Type synonym + objects :: Map.Map [String] (Int, Int) -- TODO: Type synonym + } deriving (Show) + + +-- | +-- TODO: Use BoundingBox from Cartesian instead +data BoundingBox n = BoundingBox { left :: n, right :: n, top :: n, bottom :: n, front :: n, back :: n } + +-- Foreign --------------------------------------------------------------------------------------------------------------------------------- + +-- | +newtype COBJ = COBJ OBJ + + +-- | +newtype CMTL = CMTL MTL + + +-- | We +instance Storable COBJ where + sizeOf = const 0 + alignment = const 0 + peek _ = error "Work in progress" + poke _ = error "Work in progress" + + +-- | We +instance Storable CMTL where + sizeOf = const 0 + alignment = const 0 + peek _ = error "Work in progress" + poke _ = error "Work in progress"