From fc20aae36dfa150795967c46048abc8581b37d48 Mon Sep 17 00:00:00 2001 From: Joe Crayne Date: Fri, 14 Jun 2019 21:17:01 -0400 Subject: Switched to homegrown wavefront parser. --- LoadMesh.hs | 14 ++++++++------ lambda-gtk.cabal | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/LoadMesh.hs b/LoadMesh.hs index 69e66d6..affadba 100644 --- a/LoadMesh.hs +++ b/LoadMesh.hs @@ -12,23 +12,25 @@ import Data.Map (Map) import qualified Data.Map as Map import qualified Data.Vector as V import qualified Data.ByteString as SB +import qualified Data.ByteString.Lazy.Char8 as L import Data.Text (unpack,Text) import Data.List (groupBy,nub) import Codec.Picture as Juicy -import Codec.Wavefront +import Wavefront +import Wavefront.Types import Data.Aeson type MeshData = ([(Mesh,Maybe Text)],MtlLib) loadOBJ :: String -> IO (Either String MeshData) -loadOBJ fname = fromFile fname >>= \case -- load geometry - Left err -> putStrLn err >> return (Left err) - Right obj@WavefrontOBJ{..} -> do +loadOBJ fname = L.readFile fname >>= \bs -> do + let obj@OBJ{..} = parse bs -- load materials mtlLib <- mconcat . V.toList <$> mapM (readMtl . unpack) objMtlLibs return $ Right (objToMesh obj,mtlLib) + uploadOBJToGPU :: MeshData -> IO ([(GPUMesh, Maybe Text)], MtlLib) uploadOBJToGPU (subModels,mtlLib) = do gpuSubModels <- forM subModels $ \(mesh,mat) -> LambdaCubeGL.uploadMeshToGPU mesh >>= \a -> return (a,mat) @@ -50,7 +52,7 @@ uploadMtlLib mtlLib = do return $ (\a -> (a, maybe whiteTex (fromMaybe checkerTex . flip Map.lookup textureLib) . mtl_map_Kd $ a)) <$> mtlLib objToMesh :: WavefrontOBJ -> [(Mesh,Maybe Text)] -objToMesh WavefrontOBJ{..} = [(toMesh faceGroup, elMtl . head $ faceGroup) | faceGroup <- faces] where +objToMesh OBJ{..} = [(toMesh faceGroup, elMtl . head $ faceGroup) | faceGroup <- faces] where faces = groupBy (\a b -> elMtl a == elMtl b) (V.toList objFaces) toMesh l = Mesh { mAttributes = Map.fromList @@ -66,7 +68,7 @@ objToMesh WavefrontOBJ{..} = [(toMesh faceGroup, elMtl . head $ faceGroup) | fac defaultPosition = Location 0 0 0 0 defaultNormal = Normal 0 0 0 defaultTexCoord = TexCoord 0 0 0 - v !- i = v V.!? (i-1) + v !- i = v V.!? i toVertex FaceIndex{..} = ( let Location x y z w = fromMaybe defaultPosition (objLocations !- faceLocIndex) in V4 x y z w , let Normal x y z = fromMaybe defaultNormal ((objNormals !-) =<< faceNorIndex) in V3 x y z , let TexCoord x y z = fromMaybe defaultTexCoord ((objTexCoords !-) =<< faceTexCoordIndex) in V3 x y z diff --git a/lambda-gtk.cabal b/lambda-gtk.cabal index 86269e5..75bcdfc 100644 --- a/lambda-gtk.cabal +++ b/lambda-gtk.cabal @@ -61,7 +61,7 @@ executable meshsketch -- writer monad mtl, -- rendering - lambdacube-ir, lambdacube-gl >=0.5.3, OpenGL, wavefront, + lambdacube-ir, lambdacube-gl >=0.5.3, OpenGL, wavefront-obj, -- GUI gi-gdk , gi-glib , gi-gobject , gi-gtk , haskell-gi-base -- cgit v1.2.3