summaryrefslogtreecommitdiff
path: root/tools/objcat.hs
blob: 66ab9a90a67964f69d669115e6460bf88a8364ac (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
import Data.Bool
import qualified Data.ByteString.Lazy as L
import qualified Data.DList as DList
import qualified Data.IntMap as IntMap
import Data.Char
import Data.Maybe
import System.Environment
import Control.Monad.Writer.Lazy
import Control.Monad.State.Strict

import Wavefront.Lex
import Wavefront

zflip b = b
    { vertex = \xs -> case xs of
        x:y:z:ws -> vertex b (x:y:(-z):ws)
        _        -> vertex b xs
    , vertexN = \xs -> case xs of
        x:y:z:ws -> vertexN b (x:y:(-z):ws)
        _        -> vertexN b xs
    , face = \ts -> face b $ reverse ts
    }

objcat b fs = (`evalStateT` renumFrom1) $ do
    forM_ fs $ \f -> do
        bs <- liftIO $ L.readFile f
        parseCustom (applyRenumbering b) (modify' . addCounts) bs
        return ()

main = do
    (b,fs) <- do
        fs0 <- getArgs
        case fs0 of
            "--zflip":fs -> return (zflip echoBuilder, fs)
            fs -> return (echoBuilder,fs)
    out <- DList.toList <$> execWriterT (objcat b fs)
    putStrLn $ unlines out