summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-06-14 16:13:32 -0400
committerJoe Crayne <joe@jerkface.net>2019-06-14 16:13:32 -0400
commit95f7c67b576f4e1ae897ea010da90d406681f018 (patch)
tree67285c934e19b16b6b8aadf6021884fa36de275d
parent585889267d535a0e1b777fad58e0467ff2ec7175 (diff)
crayne parser: l command and Rank2.Functor instance.
-rw-r--r--src/Wavefront/Lex.hs103
-rw-r--r--wavefront-obj.cabal1
2 files changed, 80 insertions, 24 deletions
diff --git a/src/Wavefront/Lex.hs b/src/Wavefront/Lex.hs
index 501549f..7123184 100644
--- a/src/Wavefront/Lex.hs
+++ b/src/Wavefront/Lex.hs
@@ -10,6 +10,7 @@ import Data.IntMap (IntMap)
10import qualified Data.IntMap as IntMap 10import qualified Data.IntMap as IntMap
11import Data.ByteString.Lex.Fractional as F 11import Data.ByteString.Lex.Fractional as F
12import Data.ByteString.Lex.Integral as I 12import Data.ByteString.Lex.Integral as I
13import qualified Rank2
13 14
14data ObjBuilder m = ObjBuilder 15data ObjBuilder m = ObjBuilder
15 { vertex :: [Double] -> m () 16 { vertex :: [Double] -> m ()
@@ -17,6 +18,7 @@ data ObjBuilder m = ObjBuilder
17 , vertexN :: [Double] -> m () 18 , vertexN :: [Double] -> m ()
18 , vertexP :: [Double] -> m () 19 , vertexP :: [Double] -> m ()
19 , face :: [RefTriple] -> m () 20 , face :: [RefTriple] -> m ()
21 , line :: [RefTriple] -> m ()
20 , cstype :: Bool -> CSType -> m () 22 , cstype :: Bool -> CSType -> m ()
21 , curv2 :: [Int] -> m () 23 , curv2 :: [Int] -> m ()
22 , curv :: Double -> Double -> [Int] -> m () 24 , curv :: Double -> Double -> [Int] -> m ()
@@ -58,6 +60,56 @@ data ObjBuilder m = ObjBuilder
58 , badToken :: L.ByteString -> m () 60 , badToken :: L.ByteString -> m ()
59 } 61 }
60 62
63instance Rank2.Functor ObjBuilder where
64 f <$> b = b
65 { vertex = \vs -> f $ vertex b vs
66 , vertexT = \vs -> f $ vertexT b vs
67 , vertexN = \vs -> f $ vertexN b vs
68 , vertexP = \vs -> f $ vertexP b vs
69 , face = \is -> f $ face b is
70 , line = \is -> f $ line b is
71 , cstype = \isRat typ -> f $ cstype b isRat typ
72 , curv2 = \is -> f $ curv2 b is
73 , curv = \u0 v0 is -> f $ curv b u0 v0 is
74 , parm = \uv is -> f $ parm b uv is
75 , specialPoints = \is -> f $ specialPoints b is
76 , endFreeForm = f $ endFreeForm b
77 , ctech = \approx -> f $ ctech b approx
78 , stech = \approx -> f $ stech b approx
79 , deg = \is -> f $ deg b is
80 , surf = \u0 u1 v0 v1 ts -> f $ surf b u0 u1 v0 v1 ts
81 , trim = \ss -> f $ trim b ss
82 , hole = \ss -> f $ hole b ss
83 , specialCurves = \ss -> f $ specialCurves b ss
84 , equivalentCurves = \ccs -> f $ equivalentCurves b ccs
85 , groups = \gs -> f $ groups b gs
86 , smoothingGroup = \sg -> f $ smoothingGroup b sg
87 , mergingGroup = \mg δ -> f $ mergingGroup b mg δ
88 , usemtl = \mtl -> f $ usemtl b mtl
89 , deprecated_cdc = \is -> f $ deprecated_cdc b is
90 , deprecated_cdp = \is -> f $ deprecated_cdp b is
91 , deprecated_bzp = \is -> f $ deprecated_bzp b is
92 , deprecated_bsp = \is -> f $ deprecated_bsp b is
93 , mtllib = \fns -> f $ mtllib b fns
94 , objectName = \obn -> f $ objectName b obn
95 , bmat = \uv fs -> f $ bmat b uv fs
96 , step = \is -> f $ step b is
97 , points = \is -> f $ points b is
98 , usemap = \map -> f $ usemap b map
99 , maplib = \fns -> f $ maplib b fns
100 , c_interp = \x -> f $ c_interp b x
101 , d_interp = \x -> f $ d_interp b x
102 , trace_obj = \obj -> f $ trace_obj b obj
103 , shadow_obj = \obj -> f $ shadow_obj b obj
104 , deprecated_res = \is -> f $ deprecated_res b is
105 , bevel = \x -> f $ bevel b x
106 , lod = \lvl -> f $ lod b lvl
107 , call = \obj args -> f $ call b obj args
108 , command = \x cmd -> f $ command b x cmd
109 , badToken = \bs -> f $ badToken b bs
110 }
111
112
61nullBuilder :: Applicative m => m () -> ObjBuilder m 113nullBuilder :: Applicative m => m () -> ObjBuilder m
62nullBuilder def = ObjBuilder 114nullBuilder def = ObjBuilder
63 { vertex = \vs -> def 115 { vertex = \vs -> def
@@ -65,6 +117,7 @@ nullBuilder def = ObjBuilder
65 , vertexN = \vs -> def 117 , vertexN = \vs -> def
66 , vertexP = \vs -> def 118 , vertexP = \vs -> def
67 , face = \is -> def 119 , face = \is -> def
120 , line = \is -> def
68 , cstype = \isRat typ -> def 121 , cstype = \isRat typ -> def
69 , curv2 = \is -> def 122 , curv2 = \is -> def
70 , curv = \u0 v0 is -> def 123 , curv = \u0 v0 is -> def
@@ -188,7 +241,7 @@ findNewLine ps o@(ObjConfig args) bs = case L.break (\c -> c=='\n' || c=='\\' ||
188 else ds 241 else ds
189 Nothing -> (L.concat $ reverse $ ts : ps,L.empty) 242 Nothing -> (L.concat $ reverse $ ts : ps,L.empty)
190 243
191-- The 43 keywords of the OBJ file format: 244-- The 44 keywords of the OBJ file format:
192-- 245--
193-- 1 bevel 246-- 1 bevel
194-- 2 bmat 247-- 2 bmat
@@ -210,29 +263,30 @@ findNewLine ps o@(ObjConfig args) bs = case L.break (\c -> c=='\n' || c=='\\' ||
210-- 18 f 263-- 18 f
211-- 19 g 264-- 19 g
212-- 20 hole 265-- 20 hole
213-- 21 lod 266-- 21 l
214-- 22 maplib 267-- 22 lod
215-- 23 mg 268-- 23 maplib
216-- 24 mtllib 269-- 24 mg
217-- 25 o 270-- 25 mtllib
218-- 26 p 271-- 26 o
219-- 27 parm 272-- 27 p
220-- 28 res 273-- 28 parm
221-- 29 s 274-- 29 res
222-- 30 scrv 275-- 30 s
223-- 31 shadow_obj 276-- 31 scrv
224-- 32 sp 277-- 32 shadow_obj
225-- 33 stech 278-- 33 sp
226-- 34 step 279-- 34 stech
227-- 35 surf 280-- 35 step
228-- 36 trace_obj 281-- 36 surf
229-- 37 trim 282-- 37 trace_obj
230-- 38 usemap 283-- 38 trim
231-- 39 usemtl 284-- 39 usemap
232-- 40 v 285-- 40 usemtl
233-- 41 vn 286-- 41 v
234-- 42 vp 287-- 42 vn
235-- 43 vt 288-- 43 vp
289-- 44 vt
236 290
237nextToken :: (L.ByteString -> L.ByteString) -> L.ByteString -> L.ByteString 291nextToken :: (L.ByteString -> L.ByteString) -> L.ByteString -> L.ByteString
238nextToken tok bs = tok $ L.dropWhile (not . isSpace) bs 292nextToken tok bs = tok $ L.dropWhile (not . isSpace) bs
@@ -368,6 +422,7 @@ parseOBJ builder args bs0
368 (gn,bs') -> do 422 (gn,bs') -> do
369 groups builder (map L.toStrict $ L.words gn) 423 groups builder (map L.toStrict $ L.words gn)
370 parseOBJ builder args bs' 424 parseOBJ builder args bs'
425 'l' -> parseT line 2
371 's' -> case next 1 bs of 426 's' -> case next 1 bs of
372 tok -> parseOffOrNumber tok $ \sg bs' -> do 427 tok -> parseOffOrNumber tok $ \sg bs' -> do
373 smoothingGroup builder sg 428 smoothingGroup builder sg
diff --git a/wavefront-obj.cabal b/wavefront-obj.cabal
index b5cd8df..1ccbc91 100644
--- a/wavefront-obj.cabal
+++ b/wavefront-obj.cabal
@@ -89,6 +89,7 @@ library
89 , bytestring 89 , bytestring
90 , bytestring-lexing 90 , bytestring-lexing
91 , pretty-show 91 , pretty-show
92 , rank2classes
92 93
93 hs-source-dirs: src 94 hs-source-dirs: src
94 default-language: Haskell2010 95 default-language: Haskell2010