diff options
author | Joe Crayne <joe@jerkface.net> | 2019-06-14 16:13:32 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-06-14 16:13:32 -0400 |
commit | 95f7c67b576f4e1ae897ea010da90d406681f018 (patch) | |
tree | 67285c934e19b16b6b8aadf6021884fa36de275d | |
parent | 585889267d535a0e1b777fad58e0467ff2ec7175 (diff) |
crayne parser: l command and Rank2.Functor instance.
-rw-r--r-- | src/Wavefront/Lex.hs | 103 | ||||
-rw-r--r-- | wavefront-obj.cabal | 1 |
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) | |||
10 | import qualified Data.IntMap as IntMap | 10 | import qualified Data.IntMap as IntMap |
11 | import Data.ByteString.Lex.Fractional as F | 11 | import Data.ByteString.Lex.Fractional as F |
12 | import Data.ByteString.Lex.Integral as I | 12 | import Data.ByteString.Lex.Integral as I |
13 | import qualified Rank2 | ||
13 | 14 | ||
14 | data ObjBuilder m = ObjBuilder | 15 | data 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 | ||
63 | instance 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 | |||
61 | nullBuilder :: Applicative m => m () -> ObjBuilder m | 113 | nullBuilder :: Applicative m => m () -> ObjBuilder m |
62 | nullBuilder def = ObjBuilder | 114 | nullBuilder 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 | ||
237 | nextToken :: (L.ByteString -> L.ByteString) -> L.ByteString -> L.ByteString | 291 | nextToken :: (L.ByteString -> L.ByteString) -> L.ByteString -> L.ByteString |
238 | nextToken tok bs = tok $ L.dropWhile (not . isSpace) bs | 292 | nextToken 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 |