diff options
author | Joe Crayne <joe@jerkface.net> | 2019-06-13 22:35:58 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-06-13 23:20:05 -0400 |
commit | 8bd628fb6e07c26377f18547eeb7b10dfd2841da (patch) | |
tree | 0cb965cdaa6d96803c30d0768ca3aa7bff6ba601 | |
parent | b2001473ed37cb228190b4b3c37e598deea88f5b (diff) |
crayne parser: bsp,bevel,lod,res,cdp keywords.
-rw-r--r-- | src/Wavefront.hs | 62 |
1 files changed, 40 insertions, 22 deletions
diff --git a/src/Wavefront.hs b/src/Wavefront.hs index 6378d08..b97c304 100644 --- a/src/Wavefront.hs +++ b/src/Wavefront.hs | |||
@@ -36,7 +36,9 @@ data ObjBuilder m = ObjBuilder | |||
36 | , mergingGroup :: Int -> Double -> m () | 36 | , mergingGroup :: Int -> Double -> m () |
37 | , usemtl :: S.ByteString -> m () | 37 | , usemtl :: S.ByteString -> m () |
38 | , deprecated_cdc :: [Int] -> m () | 38 | , deprecated_cdc :: [Int] -> m () |
39 | , deprecated_cdp :: [Int] -> m () | ||
39 | , deprecated_bzp :: [Int] -> m () | 40 | , deprecated_bzp :: [Int] -> m () |
41 | , deprecated_bsp :: [Int] -> m () | ||
40 | , mtllib :: [S.ByteString] -> m () | 42 | , mtllib :: [S.ByteString] -> m () |
41 | , objectName :: S.ByteString -> m () | 43 | , objectName :: S.ByteString -> m () |
42 | , bmat :: ParamSpec -> [Double] -> m () | 44 | , bmat :: ParamSpec -> [Double] -> m () |
@@ -48,6 +50,9 @@ data ObjBuilder m = ObjBuilder | |||
48 | , d_interp :: Bool -> m () | 50 | , d_interp :: Bool -> m () |
49 | , trace_obj :: S.ByteString -> m () | 51 | , trace_obj :: S.ByteString -> m () |
50 | , shadow_obj :: S.ByteString -> m () | 52 | , shadow_obj :: S.ByteString -> m () |
53 | , deprecated_res :: [Int] -> m () | ||
54 | , bevel :: Bool -> m () | ||
55 | , lod :: Int -> m () | ||
51 | , badToken :: L.ByteString -> m () | 56 | , badToken :: L.ByteString -> m () |
52 | } | 57 | } |
53 | 58 | ||
@@ -77,7 +82,9 @@ nullBuilder = ObjBuilder | |||
77 | , mergingGroup = \mg δ -> pure () | 82 | , mergingGroup = \mg δ -> pure () |
78 | , usemtl = \mtl -> pure () | 83 | , usemtl = \mtl -> pure () |
79 | , deprecated_cdc = \is -> pure () | 84 | , deprecated_cdc = \is -> pure () |
85 | , deprecated_cdp = \is -> pure () | ||
80 | , deprecated_bzp = \is -> pure () | 86 | , deprecated_bzp = \is -> pure () |
87 | , deprecated_bsp = \is -> pure () | ||
81 | , mtllib = \fns -> pure () | 88 | , mtllib = \fns -> pure () |
82 | , objectName = \obn -> pure () | 89 | , objectName = \obn -> pure () |
83 | , bmat = \uv fs -> pure () | 90 | , bmat = \uv fs -> pure () |
@@ -89,6 +96,9 @@ nullBuilder = ObjBuilder | |||
89 | , d_interp = \b -> pure () | 96 | , d_interp = \b -> pure () |
90 | , trace_obj = \obj -> pure () | 97 | , trace_obj = \obj -> pure () |
91 | , shadow_obj = \obj -> pure () | 98 | , shadow_obj = \obj -> pure () |
99 | , deprecated_res = \is -> pure () | ||
100 | , bevel = \b -> pure () | ||
101 | , lod = \lvl -> pure () | ||
92 | , badToken = \bs -> pure () | 102 | , badToken = \bs -> pure () |
93 | } | 103 | } |
94 | 104 | ||
@@ -176,13 +186,13 @@ findNewLine ps o@(ObjConfig args) bs = case L.break (\c -> c=='\n' || c=='\\' || | |||
176 | 186 | ||
177 | {- | 187 | {- |
178 | 188 | ||
179 | 1 x bevel | 189 | 1 bevel |
180 | 2 bmat | 190 | 2 bmat |
181 | 3 x bsp | 191 | 3 bsp |
182 | 4 bzp | 192 | 4 bzp |
183 | 5 x call | 193 | 5 x call |
184 | 6 cdc | 194 | 6 cdc |
185 | 7 x cdp | 195 | 7 cdp |
186 | 8 c_interp | 196 | 8 c_interp |
187 | 9 con | 197 | 9 con |
188 | 10 x csh -- for all except these, | 198 | 10 x csh -- for all except these, |
@@ -196,14 +206,14 @@ findNewLine ps o@(ObjConfig args) bs = case L.break (\c -> c=='\n' || c=='\\' || | |||
196 | 18 f | 206 | 18 f |
197 | 19 g | 207 | 19 g |
198 | 20 hole | 208 | 20 hole |
199 | 21 x lod | 209 | 21 lod |
200 | 22 maplib | 210 | 22 maplib |
201 | 23 mg | 211 | 23 mg |
202 | 24 mtllib | 212 | 24 mtllib |
203 | 25 o | 213 | 25 o |
204 | 26 p | 214 | 26 p |
205 | 27 parm | 215 | 27 parm |
206 | 28 x res | 216 | 28 res |
207 | 29 s | 217 | 29 s |
208 | 30 scrv | 218 | 30 scrv |
209 | 31 shadow_obj | 219 | 31 shadow_obj |
@@ -372,13 +382,17 @@ parseOBJ builder args bs0 | |||
372 | "vt" -> parseV vertexT 3 | 382 | "vt" -> parseV vertexT 3 |
373 | "vn" -> parseV vertexN 3 | 383 | "vn" -> parseV vertexN 3 |
374 | "vp" -> parseV vertexP 3 | 384 | "vp" -> parseV vertexP 3 |
375 | "bz" -> parseI deprecated_bzp 4 -- bzp | 385 | "be" -> parseOF bevel 2 -- bevel |
376 | "bm" -> parseUV (next 2 bs) $ \uv bs' -> do -- bmat | 386 | "bm" -> parseUV (next 2 bs) $ \uv bs' -> do -- bmat |
377 | parseFloats (findToken args) bs' $ \vs bs'' -> do | 387 | parseFloats (findToken args) bs' $ \vs bs'' -> do |
378 | bmat builder uv vs | 388 | bmat builder uv vs |
379 | parseOBJ builder args bs'' | 389 | parseOBJ builder args bs'' |
380 | 390 | ||
381 | "cd" -> parseI deprecated_cdc 4 -- cdc | 391 | "bs" -> parseI deprecated_bsp 4 -- bsp |
392 | "bz" -> parseI deprecated_bzp 4 -- bzp | ||
393 | "cd" -> if lengthLessThan 3 bs || L.index bs 2 /= 'p' | ||
394 | then parseI deprecated_cdc 4 -- cdc | ||
395 | else parseI deprecated_cdp 4 -- cdp | ||
382 | "co" -> -- con | 396 | "co" -> -- con |
383 | parseEmbeddedCurves (findToken args) (next 2 bs) $ \ss bs' -> do | 397 | parseEmbeddedCurves (findToken args) (next 2 bs) $ \ss bs' -> do |
384 | equivalentCurves builder ss | 398 | equivalentCurves builder ss |
@@ -429,24 +443,17 @@ parseOBJ builder args bs0 | |||
429 | curv builder u0 v0 is | 443 | curv builder u0 v0 is |
430 | parseOBJ builder args bs'' | 444 | parseOBJ builder args bs'' |
431 | "c_" -> -- c_interp | 445 | "c_" -> -- c_interp |
432 | let tok = findToken args (next 2 bs) | 446 | parseOF c_interp 2 |
433 | in if lengthLessThan 2 tok | ||
434 | then bad tok | ||
435 | else let flag = case L.index tok 1 of | ||
436 | 'f' -> c_interp builder False -- off | ||
437 | _ -> c_interp builder True -- on | ||
438 | in parseOBJ builder args (next 2 tok) | ||
439 | "de" -> parseI deg 3 | 447 | "de" -> parseI deg 3 |
440 | "d_" -> -- d_interp | 448 | "d_" -> -- d_interp |
441 | let tok = findToken args (next 2 bs) | 449 | parseOF d_interp 2 |
442 | in if lengthLessThan 2 tok | ||
443 | then bad tok | ||
444 | else let flag = case L.index tok 1 of | ||
445 | 'f' -> d_interp builder False -- off | ||
446 | _ -> d_interp builder True -- on | ||
447 | in parseOBJ builder args (next 2 tok) | ||
448 | "en" -> do endFreeForm builder | 450 | "en" -> do endFreeForm builder |
449 | parseOBJ builder args (next 2 bs) | 451 | parseOBJ builder args (next 2 bs) |
452 | "lo" -> -- lod | ||
453 | parseInts (findToken args) (next 2 bs) $ \is bs' -> do | ||
454 | let level:_ = is ++ [0] | ||
455 | lod builder level | ||
456 | parseOBJ builder args bs' | ||
450 | "ho" -> -- hole | 457 | "ho" -> -- hole |
451 | parseCurveSpecs (findToken args) (next 2 bs) $ \ss bs' -> do | 458 | parseCurveSpecs (findToken args) (next 2 bs) $ \ss bs' -> do |
452 | hole builder ss | 459 | hole builder ss |
@@ -460,6 +467,8 @@ parseOBJ builder args bs0 | |||
460 | parseFloats (findToken args) bs' $ \vs bs'' -> do | 467 | parseFloats (findToken args) bs' $ \vs bs'' -> do |
461 | parm builder uv vs | 468 | parm builder uv vs |
462 | parseOBJ builder args bs'' | 469 | parseOBJ builder args bs'' |
470 | "re" -> -- res (deprecated) | ||
471 | parseI deprecated_res 3 | ||
463 | "sc" -> -- scrv | 472 | "sc" -> -- scrv |
464 | parseCurveSpecs (findToken args) (next 2 bs) $ \ss bs' -> do | 473 | parseCurveSpecs (findToken args) (next 2 bs) $ \ss bs' -> do |
465 | specialCurves builder ss | 474 | specialCurves builder ss |
@@ -562,7 +571,7 @@ parseOBJ builder args bs0 | |||
562 | in (fn <> L.take 1 ext <> f) : fs | 571 | in (fn <> L.take 1 ext <> f) : fs |
563 | mtllib builder (map L.toStrict $ slurp fnn) | 572 | mtllib builder (map L.toStrict $ slurp fnn) |
564 | parseOBJ builder args bs' | 573 | parseOBJ builder args bs' |
565 | -- TODO: call,csh,lod,shadow_obj,trace_obj,bevel | 574 | -- TODO: call,csh |
566 | _ -> bad bs | 575 | _ -> bad bs |
567 | where | 576 | where |
568 | bs = findToken args bs0 | 577 | bs = findToken args bs0 |
@@ -598,6 +607,15 @@ parseOBJ builder args bs0 | |||
598 | _ | lengthLessThan 2 tok -> (0,tok) | 607 | _ | lengthLessThan 2 tok -> (0,tok) |
599 | _ -> (if L.index tok 1 == 'f' then 0 else 1, next 1 tok) | 608 | _ -> (if L.index tok 1 == 'f' then 0 else 1, next 1 tok) |
600 | cont sg bs'' | 609 | cont sg bs'' |
610 | parseOF build n = | ||
611 | let tok = findToken args (next n bs) | ||
612 | in if lengthLessThan 2 tok | ||
613 | then bad tok | ||
614 | else let flag = case L.index tok 1 of | ||
615 | 'f' -> build builder False -- off | ||
616 | _ -> build builder True -- on | ||
617 | in parseOBJ builder args (next 2 tok) | ||
618 | |||
601 | 619 | ||
602 | sanitizeOBJFilename :: L.ByteString -> S.ByteString | 620 | sanitizeOBJFilename :: L.ByteString -> S.ByteString |
603 | sanitizeOBJFilename fn = case S.breakEnd isSpace $ L.toStrict $ L.dropWhile isSpace fn of | 621 | sanitizeOBJFilename fn = case S.breakEnd isSpace $ L.toStrict $ L.dropWhile isSpace fn of |