ombra-0.2.1.0: Graphics/Rendering/Ombra/Draw.hs
module Graphics.Rendering.Ombra.Draw (
Draw,
DrawState,
Ctx,
-- * Running the Draw monad
refDrawCtx,
runDrawCtx,
execDrawCtx,
evalDrawCtx,
drawState,
-- * Draw actions
drawInit,
clearBuffers,
drawLayer,
resizeViewport,
-- ** Resources
-- $resources
preloadGeometry,
preloadTexture,
preloadProgram,
removeGeometry,
removeTexture,
removeProgram,
-- *
gl
) where
import Data.IORef
import Graphics.Rendering.Ombra.Draw.Internal
import Graphics.Rendering.Ombra.Internal.GL hiding (Buffer)
import Graphics.Rendering.Ombra.Layer
-- | Run a Draw action using an IORef and a context.
refDrawCtx :: GLES => Ctx -> Draw a -> IORef DrawState -> IO a
refDrawCtx ctx d ref = do state <- readIORef ref
(ret, state') <- runDrawCtx ctx d state
writeIORef ref state'
return ret
runDrawCtx :: Ctx -- ^ Context (use the appropriate backend
-- functions)
-> Draw a -- ^ Draw action
-> DrawState -- ^ State (create it with 'drawState')
-> IO (a, DrawState)
runDrawCtx ctx d = flip evalGL ctx . runDraw d
execDrawCtx :: Ctx -> Draw a -> DrawState -> IO DrawState
execDrawCtx ctx d = flip evalGL ctx . execDraw d
evalDrawCtx :: Ctx -> Draw a -> DrawState -> IO a
evalDrawCtx ctx d = flip evalGL ctx . evalDraw d
-- renderSubLayer ::
-- $resources
-- In Ombra, GPU resources are allocated when they're needed, and they're kept
-- alive by their corresponding CPU resources. Specifically, these resources are
-- Geometries, Textures and Programs. This means that, when a CPU resource is
-- garbage collected, the GPU resource is also removed. The functions below let
-- you manage allocation and deallocation manually.