module Graphics.Animation.Cal3D.CoreModel
(newCoreModel, deleteCoreModel
, loadCoreSkeleton
, loadCoreAnimation
, loadCoreMesh
, loadCoreMaterial
, createCoreMaterialThread
, setCoreMaterialId
)
where
import Foreign
import Foreign.C.Types
import Foreign.C.String
import Graphics.Animation.Cal3D.Types
import Graphics.Animation.Cal3D.Error
newCoreModel :: String
-> IO CoreModel
newCoreModel name = withCString name c_newCoreModel
foreign import ccall safe "newCoreModel"
c_newCoreModel :: CString -> IO CoreModel
foreign import ccall safe "deleteCoreModel"
deleteCoreModel :: CoreModel -> IO ()
loadCoreSkeleton :: CoreModel -> FilePath -> LoadResult ()
loadCoreSkeleton coreModel path =
checkError (withCString path (c_loadCoreSkeleton coreModel))
0
("loadCoreSkeleton: unable to load " ++ path)
foreign import ccall safe "loadCoreSkeleton" c_loadCoreSkeleton :: CLoader
loader :: CLoader -> String -> (CInt -> a) -> Loader a
loader c_load loaderName wrap =
(\ coreModel path -> do
{
id <- withCString path (c_load coreModel)
; return (if id == (1)
then Left $ loaderName ++ ": unable to load " ++ path
else Right (wrap id))
}
)
loadCoreAnimation :: Loader AnimationId
loadCoreAnimation = loader c_loadCoreAnimation "loadCoreAnimation" AnimationId
foreign import ccall safe "loadCoreAnimation" c_loadCoreAnimation :: CLoader
loadCoreMesh :: Loader MeshId
loadCoreMesh = loader c_loadCoreMesh "loadCoreMesh" MeshId
foreign import ccall safe "loadCoreMesh" c_loadCoreMesh :: CLoader
loadCoreMaterial :: Loader MaterialId
loadCoreMaterial = loader c_loadCoreMaterial "loadCoreMaterial" MaterialId
foreign import ccall safe "loadCoreMaterial" c_loadCoreMaterial :: CLoader
createCoreMaterialThread :: CoreModel -> MaterialThreadId ->
IO (Either String ())
createCoreMaterialThread coreModel (MaterialThreadId id) =
checkError (c_createCoreMaterialThread coreModel (fromIntegral id))
0
("createCoreMaterialThread failed with id " ++ (show id))
foreign import ccall safe "createCoreMaterialThread"
c_createCoreMaterialThread :: CoreModel -> CInt -> IO CInt
setCoreMaterialId :: CoreModel -> MaterialThreadId -> MaterialSetId ->
MaterialId -> IO (Either String ())
setCoreMaterialId coreModel
(MaterialThreadId mthreadId)
(MaterialSetId msetId)
(MaterialId matlId) =
checkError (c_setCoreMaterialId coreModel
(fromIntegral mthreadId)
(fromIntegral msetId)
(fromIntegral matlId))
0
("setCoreMaterialId failed with ids " ++
(show (mthreadId, msetId, matlId)))
foreign import ccall safe "setCoreMaterialId"
c_setCoreMaterialId :: CoreModel -> CInt -> CInt -> CInt -> IO CInt