module Graphics.Animation.Cal3D.Renderer
(newRenderer, deleteRenderer
, renderAnimation
, getMeshCount, getSubmeshCount
, selectMeshSubmesh
, CalIndex, getFaceCount, getFaces
, withAmbientColorPtr, withDiffuseColorPtr, withSpecularColorPtr
, getShininess
, getVertexCount, getVertices, getNormals
)
where
import Foreign
import Foreign.C.Types
import Foreign.C.String
import Graphics.Animation.Cal3D.Types
import Graphics.Animation.Cal3D.Error
foreign import ccall safe "newRenderer"
newRenderer :: Model -> IO Renderer
foreign import ccall safe "deleteRenderer"
deleteRenderer :: Renderer -> IO ()
renderAnimation :: Renderer
-> IO ()
-> IO (Either String ())
renderAnimation renderer action = do
{
ok <- c_beginRendering renderer
; result <-
if not (toBool ok)
then return $ Left "renderAnimation: unable to begin rendering"
else do
{
action
; return $ Right ()
}
; c_endRendering renderer
; return result
}
foreign import ccall safe "beginRendering"
c_beginRendering :: Renderer -> IO Int
foreign import ccall safe "endRendering"
c_endRendering :: Renderer -> IO ()
getMeshCount :: Renderer -> IO Int
getMeshCount renderer =
return . fromIntegral =<< c_getMeshCount renderer
foreign import ccall safe "getMeshCount"
c_getMeshCount :: Renderer -> IO CInt
getSubmeshCount :: Renderer
-> Int
-> IO Int
getSubmeshCount renderer meshId =
return . fromIntegral
=<< c_getSubmeshCount renderer (fromIntegral meshId)
foreign import ccall safe "getSubmeshCount"
c_getSubmeshCount :: Renderer -> CInt -> IO CInt
selectMeshSubmesh :: Renderer
-> Int
-> Int
-> IO (Either String ())
selectMeshSubmesh renderer meshId submeshId =
checkError (c_selectMeshSubmesh renderer
(fromIntegral meshId)
(fromIntegral submeshId))
0
("unable to select submesh " ++ (show (meshId, submeshId)))
foreign import ccall safe "selectMeshSubmesh"
c_selectMeshSubmesh :: Renderer -> CInt -> CInt -> IO CInt
getFaceCount :: Renderer -> IO Int
getFaceCount renderer =
return . fromIntegral =<< c_getFaceCount renderer
foreign import ccall safe "getFaceCount"
c_getFaceCount :: Renderer -> IO CInt
type CalIndex = CInt
getFaces :: Renderer
-> Ptr CalIndex
-> IO Int
getFaces renderer ptr = return . fromIntegral =<< c_getFaces renderer ptr
foreign import ccall safe "getFaces"
c_getFaces :: Renderer -> Ptr CalIndex -> IO CInt
getVertexCount :: Renderer -> IO Int
getVertexCount renderer =
return . fromIntegral =<< c_getVertexCount renderer
foreign import ccall safe "getVertexCount"
c_getVertexCount :: Renderer -> IO CInt
getVertices :: Renderer
-> Ptr Float
-> Int
-> IO Int
getVertices renderer ptr stride =
return . fromIntegral =<< c_getVertices renderer ptr (fromIntegral stride)
foreign import ccall safe "getVertices"
c_getVertices :: Renderer -> Ptr Float -> CInt -> IO CInt
getNormals :: Renderer -> Ptr Float -> Int -> IO Int
getNormals renderer buf stride =
return . fromIntegral =<< c_getNormals renderer buf (fromIntegral stride)
foreign import ccall safe "getNormals"
c_getNormals :: Renderer -> Ptr Float -> Int -> IO CInt
withColorPtr :: Storable c =>
(Renderer -> Ptr Word8 -> IO ()) ->
(Ptr Word8 -> IO c) ->
Renderer -> IO c
withColorPtr c_getColor convert renderer =
alloca (\ ptr -> do {c_getColor renderer ptr; convert ptr})
withAmbientColorPtr :: (Storable c) =>
(Ptr Word8 -> IO c)
-> Renderer
-> IO c
withAmbientColorPtr = withColorPtr c_getAmbientColor
withDiffuseColorPtr :: (Storable c) =>
(Ptr Word8 -> IO c) -> Renderer -> IO c
withDiffuseColorPtr = withColorPtr c_getDiffuseColor
withSpecularColorPtr :: (Storable c) =>
(Ptr Word8 -> IO c) -> Renderer -> IO c
withSpecularColorPtr = withColorPtr c_getSpecularColor
foreign import ccall safe "getAmbientColor"
c_getAmbientColor :: Renderer -> Ptr Word8 -> IO ()
foreign import ccall safe "getDiffuseColor"
c_getDiffuseColor :: Renderer -> Ptr Word8 -> IO ()
foreign import ccall safe "getSpecularColor"
c_getSpecularColor :: Renderer -> Ptr Word8 -> IO ()
getShininess :: Renderer -> IO Float
getShininess = c_getShininess
foreign import ccall safe "getShininess"
c_getShininess :: Renderer -> IO Float
foreign import ccall safe "calVectorSize"
dbgCalVectorSize :: IO CInt
foreign import ccall safe "dumpVertices"
dbgDumpVertices :: Renderer -> IO ()