summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-06-13 22:35:58 -0400
committerJoe Crayne <joe@jerkface.net>2019-06-13 23:20:05 -0400
commit8bd628fb6e07c26377f18547eeb7b10dfd2841da (patch)
tree0cb965cdaa6d96803c30d0768ca3aa7bff6ba601
parentb2001473ed37cb228190b4b3c37e598deea88f5b (diff)
crayne parser: bsp,bevel,lod,res,cdp keywords.
-rw-r--r--src/Wavefront.hs62
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
602sanitizeOBJFilename :: L.ByteString -> S.ByteString 620sanitizeOBJFilename :: L.ByteString -> S.ByteString
603sanitizeOBJFilename fn = case S.breakEnd isSpace $ L.toStrict $ L.dropWhile isSpace fn of 621sanitizeOBJFilename fn = case S.breakEnd isSpace $ L.toStrict $ L.dropWhile isSpace fn of