module Graphics.Formats.Obj
(objFromFile
,ObjModel
) where
import Data.Binary
import Control.Applicative
import System.Directory
import System.FilePath
import qualified Data.Map as M
import Data.Maybe hiding (fromJust)
import Graphics.Formats.Obj.Parse
import Graphics.Formats.Obj.ObjModel
import Graphics.Formats.Mtl.Contents
import Graphics.Formats.Mtl.Parse ()
import qualified Data.ByteString.Char8 as CBS
objFromFile :: FilePath -> [FilePath] -> IO ObjModel
objFromFile x sps =
do
cs <- decodeFile x
let mtlfs = map CBS.unpack $ mtllibs cs
files <- mapM (findFile sps) mtlfs
mapM_ (putStrLn . ("Warning: File not found: " ++) . fst)
. filter ((==Nothing) . snd)
$ zip mtlfs files
parsedMats <- mapM decodeFile (catMaybes files)
let ms = MF . M.unions . map (\(MF a) -> a) $ parsedMats
(missingTexFiles,ms') <- loadTextures (findFile sps) ms
mapM_ (putStrLn . ("Warning: File not found: " ++)) missingTexFiles
return $ geometry cs ms'
findFile :: [FilePath] -> FilePath -> IO (Maybe FilePath)
findFile sps f = (listToMaybe . catMaybes) <$> (mapM (tryFile f) sps)
tryFile :: FilePath -> FilePath -> IO (Maybe FilePath)
tryFile x y = do e <- doesFileExist (y </> x)
if e then return . Just $ (y </> x) else return Nothing