{-# LANGUAGE OverloadedStrings #-}
module Graphics.Implicit.Export.NormedTriangleMeshFormats (obj) where
import Prelude(($), fmap, (+), (.), (*), length, (-), pure, (<>))
import Graphics.Implicit.Definitions (NormedTriangle(NormedTriangle), NormedTriangleMesh(NormedTriangleMesh), ℝ3)
import Graphics.Implicit.Export.TextBuilderUtils (Text, Builder, toLazyText, bf, buildInt)
import Data.Foldable (fold, foldMap)
obj :: NormedTriangleMesh -> Text
obj (NormedTriangleMesh normedtriangles) = toLazyText $ vertcode <> normcode <> trianglecode
where
v :: ℝ3 -> Builder
v (x,y,z) = "v " <> bf x <> " " <> bf y <> " " <> bf z <> "\n"
n :: ℝ3 -> Builder
n (x,y,z) = "vn " <> bf x <> " " <> bf y <> " " <> bf z <> "\n"
verts = do
NormedTriangle ((a,_),(b,_),(c,_)) <- normedtriangles
[a,b,c]
norms = do
NormedTriangle ((_,a),(_,b),(_,c)) <- normedtriangles
[a,b,c]
vertcode = foldMap v verts
normcode = foldMap n norms
trianglecode = fold $ do
n' <- fmap ((+1).(*3)) [0,1 .. length normedtriangles -1]
let
vta = buildInt n'
vtb = buildInt (n'+1)
vtc = buildInt (n'+2)
pure $ "f " <> vta <> " " <> vtb <> " " <> vtc <> " " <> "\n"