summaryrefslogtreecommitdiff
path: root/src/Codec/Wavefront/Object.hs
blob: 65c062e389e1728aaab68953ced0a0230fae48a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
-----------------------------------------------------------------------------
-- |
-- Copyright   : (C) 2015 Dimitri Sabadie
-- License     : BSD3
--
-- Maintainer  : Dimitri Sabadie <dimitri.sabadie@gmail.com>
-- Stability   : experimental
-- Portability : portable
--
-----------------------------------------------------------------------------

module Codec.Wavefront.Object where

import Codec.Wavefront.Element
import Codec.Wavefront.Face
import Codec.Wavefront.FreeForm
import Codec.Wavefront.Lexer ( Ctxt(..) )
import Codec.Wavefront.Line
import Codec.Wavefront.Location
import Codec.Wavefront.Normal
import Codec.Wavefront.Point
import Codec.Wavefront.TexCoord
import Data.DList ( DList, toList )
import Data.Text ( Text )
import Data.Vector ( Vector, fromList )

data WavefrontOBJ = WavefrontOBJ {
    -- |Locations.
    objLocations :: Vector Location
    -- |Texture coordinates.
  , objTexCoords :: Vector TexCoord
    -- |Normals.
  , objNormals :: Vector Normal
    -- |Parameter-space coordinates.
  , objParamCoords :: Vector ParamCoord
    -- |Points.
  , objPoints :: Vector (Element Point)
    -- |Lines.
  , objLines :: Vector (Element Line)
    -- |Faces.
  , objFaces :: Vector (Element Face)
    -- |Curves.
  , objCurves :: Vector (Element Curve)
    -- |Curves on surfaces.
  , objEmbeddedCurves :: Vector (Element EmbeddedCurve)
    -- |Surfaces.
  , objSurfaces :: Vector (Element Surface)
    -- |Material libraries.
  , objMtlLibs :: Vector Text
  } deriving (Eq,Show)

ctxtToWavefrontOBJ :: Ctxt -> WavefrontOBJ
ctxtToWavefrontOBJ ctxt = WavefrontOBJ {
    objLocations = fromDList (snd $ ctxtLocations ctxt)
  , objTexCoords = fromDList (snd $ ctxtTexCoords ctxt)
  , objNormals = fromDList (snd $ ctxtNormals ctxt)
  , objParamCoords = fromDList (snd $ ctxtParamCoords ctxt)
  , objPoints = fromDList (ctxtPoints ctxt)
  , objLines = fromDList (ctxtLines ctxt)
  , objFaces = fromDList (ctxtFaces ctxt)
  , objCurves = fromDList (ctxtCurves ctxt)
  , objEmbeddedCurves = fromDList (ctxtEmbeddedCurves ctxt)
  , objSurfaces = fromDList (ctxtSurfaces ctxt)
  , objMtlLibs = fromDList (ctxtMtlLibs ctxt)
  }

fromDList :: DList a -> Vector a
fromDList = fromList . toList