packages feed

chalkboard-1.9.0.16: Graphics/ChalkBoard/OpenGL/Monad.hs

-- ChalkBoard Monad
-- October 2009
-- Kevin Matlage, Andy Gill


module Graphics.ChalkBoard.OpenGL.Monad where

import Graphics.ChalkBoard.CBIR( BufferId )
import Graphics.Rendering.OpenGL.Raw.Core31 as GL ( GLint, GLuint, GLenum )
import Foreign.Ptr ( Ptr )
import Data.Map ( Map )
import Control.Concurrent.MVar ( MVar, takeMVar, putMVar )





data CBM a = CBM { runCBM :: CBenv -> IO a }


instance Monad CBM where
    return n = CBM $ \_ -> return n
    m >>= k = CBM $ \env -> do
        a <- runCBM m env
        a' <- runCBM (k a) env
        return a'
    fail msg = CBM $ \_ -> fail msg


data CBenv = CBenv
        { debugFrames :: Bool
        , debugAll :: Bool
        , debugBoards :: [BufferId]
        , fboSupport :: Bool
        , envForStateVar :: MVar CBstate
        }

data CBstate = CBstate
        { currentBoard :: BufferId
        , textureInfo  :: Map BufferId TextureInfo
        , fboPtr       :: Ptr GL.GLuint
        }


data TextureInfo = TextureInfo
	{ texPtr    :: Ptr GL.GLuint
	, texSize   :: (GL.GLint,GL.GLint)
	, texFormat :: GL.GLenum
	}






getCBMEnv :: CBM CBenv
getCBMEnv = CBM $ \env -> return env


getDebugFrames :: CBM (Bool)
getDebugFrames = CBM $ \env -> return (debugFrames env)

getDebugAll :: CBM (Bool)
getDebugAll = CBM $ \env -> return (debugAll env)

getDebugBoards :: CBM ([BufferId])
getDebugBoards = CBM $ \env -> return (debugBoards env)

getFBOSupport :: CBM (Bool)
getFBOSupport = CBM $ \env -> return (fboSupport env)






setCBMState :: CBstate -> CBM ()
setCBMState state = CBM $ \env -> do
        _ <- takeMVar (envForStateVar env)
        putMVar (envForStateVar env) state

getCBMState :: CBM CBstate
getCBMState = CBM $ \env -> do
        st <- takeMVar (envForStateVar env)
        putMVar (envForStateVar env) st
        return (st)




setTexMap :: Map BufferId TextureInfo -> CBM ()
setTexMap texMap = CBM $ \env -> do
        st <- takeMVar (envForStateVar env)
        putMVar (envForStateVar env) (st {textureInfo = texMap})

getTexMap :: CBM (Map BufferId TextureInfo)
getTexMap = CBM $ \env -> do
        st <- takeMVar (envForStateVar env)
        putMVar (envForStateVar env) st
        return (textureInfo st)


setCurrentBoard :: BufferId -> CBM ()
setCurrentBoard board = CBM $ \env -> do
        st <- takeMVar (envForStateVar env)
        putMVar (envForStateVar env) (st {currentBoard = board})

getCurrentBoard :: CBM BufferId
getCurrentBoard = CBM $ \env -> do
        st <- takeMVar (envForStateVar env)
        putMVar (envForStateVar env) st
        return (currentBoard st)


setFBOPtr :: Ptr GL.GLuint -> CBM ()
setFBOPtr ptr = CBM $ \env -> do
        st <- takeMVar (envForStateVar env)
        putMVar (envForStateVar env) (st {fboPtr = ptr})

getFBOPtr :: CBM (Ptr GL.GLuint)
getFBOPtr = CBM $ \env -> do
        st <- takeMVar (envForStateVar env)
        putMVar (envForStateVar env) st
        return (fboPtr st)





liftIO :: IO a -> CBM a
liftIO m = CBM $ \_ -> do
        a <- m
        return a