{-# OPTIONS_HADDOCK hide #-}
module Graphics.Rendering.OpenGL.GL.Capability (
Capability(..), marshalCapability, unmarshalCapability,
EnableCap(..), makeCapability, makeStateVarMaybe,
IndexedEnableCap(..), makeIndexedCapability,
) where
import Data.StateVar
import Graphics.Rendering.OpenGL.GL.GLboolean
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
import Graphics.GL
data Capability =
Disabled
| Enabled
deriving ( Capability -> Capability -> Bool
(Capability -> Capability -> Bool)
-> (Capability -> Capability -> Bool) -> Eq Capability
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Capability -> Capability -> Bool
$c/= :: Capability -> Capability -> Bool
== :: Capability -> Capability -> Bool
$c== :: Capability -> Capability -> Bool
Eq, Eq Capability
Eq Capability =>
(Capability -> Capability -> Ordering)
-> (Capability -> Capability -> Bool)
-> (Capability -> Capability -> Bool)
-> (Capability -> Capability -> Bool)
-> (Capability -> Capability -> Bool)
-> (Capability -> Capability -> Capability)
-> (Capability -> Capability -> Capability)
-> Ord Capability
Capability -> Capability -> Bool
Capability -> Capability -> Ordering
Capability -> Capability -> Capability
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Capability -> Capability -> Capability
$cmin :: Capability -> Capability -> Capability
max :: Capability -> Capability -> Capability
$cmax :: Capability -> Capability -> Capability
>= :: Capability -> Capability -> Bool
$c>= :: Capability -> Capability -> Bool
> :: Capability -> Capability -> Bool
$c> :: Capability -> Capability -> Bool
<= :: Capability -> Capability -> Bool
$c<= :: Capability -> Capability -> Bool
< :: Capability -> Capability -> Bool
$c< :: Capability -> Capability -> Bool
compare :: Capability -> Capability -> Ordering
$ccompare :: Capability -> Capability -> Ordering
$cp1Ord :: Eq Capability
Ord, Int -> Capability -> ShowS
[Capability] -> ShowS
Capability -> String
(Int -> Capability -> ShowS)
-> (Capability -> String)
-> ([Capability] -> ShowS)
-> Show Capability
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Capability] -> ShowS
$cshowList :: [Capability] -> ShowS
show :: Capability -> String
$cshow :: Capability -> String
showsPrec :: Int -> Capability -> ShowS
$cshowsPrec :: Int -> Capability -> ShowS
Show )
marshalCapability :: Capability -> GLboolean
marshalCapability :: Capability -> GLboolean
marshalCapability = Bool -> GLboolean
forall a. Num a => Bool -> a
marshalGLboolean (Bool -> GLboolean)
-> (Capability -> Bool) -> Capability -> GLboolean
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Capability
Enabled Capability -> Capability -> Bool
forall a. Eq a => a -> a -> Bool
==)
unmarshalCapability :: GLboolean -> Capability
unmarshalCapability :: GLboolean -> Capability
unmarshalCapability x :: GLboolean
x = if GLboolean -> Bool
forall a. (Eq a, Num a) => a -> Bool
unmarshalGLboolean GLboolean
x then Capability
Enabled else Capability
Disabled
data EnableCap =
CapFog
| CapLighting
| CapTexture1D
| CapTexture2D
| CapTexture2DMultisample
| CapTexture1DArray
| CapTextureRectangle
| CapTextureCubeMap
| CapTexture3D
| CapTexture2DArray
| CapTexture2DMultisampleArray
| CapTextureCubeMapArray
| CapLineStipple
| CapPolygonStipple
| CapCullFace
| CapAlphaTest
| CapBlend
| CapIndexLogicOp
| CapColorLogicOp
| CapDither
| CapStencilTest
| CapDepthTest
| CapClipPlane GLsizei
| CapLight GLsizei
| CapTextureGenS
| CapTextureGenT
| CapTextureGenR
| CapTextureGenQ
| CapMap1Vertex3
| CapMap1Vertex4
| CapMap1Color4
| CapMap1Index
| CapMap1Normal
| CapMap1TextureCoord1
| CapMap1TextureCoord2
| CapMap1TextureCoord3
| CapMap1TextureCoord4
| CapMap2Vertex3
| CapMap2Vertex4
| CapMap2Color4
| CapMap2Index
| CapMap2Normal
| CapMap2TextureCoord1
| CapMap2TextureCoord2
| CapMap2TextureCoord3
| CapMap2TextureCoord4
| CapPointSmooth
| CapLineSmooth
| CapPolygonSmooth
| CapScissorTest
| CapColorMaterial
| CapNormalize
| CapAutoNormal
| CapPolygonOffsetPoint
| CapPolygonOffsetLine
| CapPolygonOffsetFill
| CapVertexArray
| CapNormalArray
| CapColorArray
| CapIndexArray
| CapTextureCoordArray
| CapEdgeFlagArray
| CapFogCoordArray
| CapSecondaryColorArray
| CapMatrixIndexArray
| CapConvolution1D
| CapConvolution2D
| CapSeparable2D
| CapHistogram
| CapMinmax
| CapRescaleNormal
| CapSharedTexturePalette
| CapMultisample
| CapSampleAlphaToCoverage
| CapSampleAlphaToOne
| CapSampleCoverage
| CapColorTable
| CapPostConvolutionColorTable
| CapPostColorMatrixColorTable
| CapColorSum
| CapWeightSumUnity
| CapVertexBlend
| CapWeightArray
| CapMatrixPalette
| CapDepthClamp
| CapDepthBoundsTest
| CapPrimitiveRestart
| CapPointSprite
| CapStencilTestTwoSide
| CapRasterPositionUnclipped
| CapRasterizerDiscard
| CapTextureColorTable
| CapVertexProgramPointSize
| CapVertexProgramTwoSide
| CapDebugOutput
| CapDebugOutputSynchronous
marshalEnableCap :: EnableCap -> Maybe GLenum
marshalEnableCap :: EnableCap -> Maybe GLenum
marshalEnableCap x :: EnableCap
x = case EnableCap
x of
CapFog -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_FOG
CapLighting -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_LIGHTING
CapTexture1D -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_1D
CapTexture2D -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_2D
CapTexture2DMultisample -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_2D_MULTISAMPLE
CapTexture1DArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_1D_ARRAY
CapTextureRectangle -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_RECTANGLE
CapTextureCubeMap -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_CUBE_MAP
CapTexture3D -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_3D
CapTexture2DArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_2D_ARRAY
CapTexture2DMultisampleArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_2D_MULTISAMPLE_ARRAY
CapTextureCubeMapArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_CUBE_MAP_ARRAY
CapLineStipple -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_LINE_STIPPLE
CapPolygonStipple -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POLYGON_STIPPLE
CapCullFace -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_CULL_FACE
CapAlphaTest -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_ALPHA_TEST
CapBlend -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_BLEND
CapIndexLogicOp -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_INDEX_LOGIC_OP
CapColorLogicOp -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_COLOR_LOGIC_OP
CapDither -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_DITHER
CapStencilTest -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_STENCIL_TEST
CapDepthTest -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_DEPTH_TEST
CapClipPlane i :: GLsizei
i -> GLsizei -> Maybe GLenum
clipPlaneIndexToEnum GLsizei
i
CapLight i :: GLsizei
i -> GLsizei -> Maybe GLenum
lightIndexToEnum GLsizei
i
CapTextureGenS -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_GEN_S
CapTextureGenT -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_GEN_T
CapTextureGenR -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_GEN_R
CapTextureGenQ -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_GEN_Q
CapMap1Vertex3 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_VERTEX_3
CapMap1Vertex4 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_VERTEX_4
CapMap1Color4 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_COLOR_4
CapMap1Index -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_INDEX
CapMap1Normal -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_NORMAL
CapMap1TextureCoord1 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_TEXTURE_COORD_1
CapMap1TextureCoord2 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_TEXTURE_COORD_2
CapMap1TextureCoord3 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_TEXTURE_COORD_3
CapMap1TextureCoord4 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP1_TEXTURE_COORD_4
CapMap2Vertex3 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_VERTEX_3
CapMap2Vertex4 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_VERTEX_4
CapMap2Color4 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_COLOR_4
CapMap2Index -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_INDEX
CapMap2Normal -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_NORMAL
CapMap2TextureCoord1 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_TEXTURE_COORD_1
CapMap2TextureCoord2 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_TEXTURE_COORD_2
CapMap2TextureCoord3 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_TEXTURE_COORD_3
CapMap2TextureCoord4 -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MAP2_TEXTURE_COORD_4
CapPointSmooth -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POINT_SMOOTH
CapLineSmooth -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_LINE_SMOOTH
CapPolygonSmooth -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POLYGON_SMOOTH
CapScissorTest -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_SCISSOR_TEST
CapColorMaterial -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_COLOR_MATERIAL
CapNormalize -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_NORMALIZE
CapAutoNormal -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_AUTO_NORMAL
CapPolygonOffsetPoint -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POLYGON_OFFSET_POINT
CapPolygonOffsetLine -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POLYGON_OFFSET_LINE
CapPolygonOffsetFill -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POLYGON_OFFSET_FILL
CapVertexArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_VERTEX_ARRAY
CapNormalArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_NORMAL_ARRAY
CapColorArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_COLOR_ARRAY
CapIndexArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_INDEX_ARRAY
CapTextureCoordArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_COORD_ARRAY
CapEdgeFlagArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_EDGE_FLAG_ARRAY
CapFogCoordArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_FOG_COORD_ARRAY
CapSecondaryColorArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_SECONDARY_COLOR_ARRAY
CapMatrixIndexArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MATRIX_INDEX_ARRAY_ARB
CapConvolution1D -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_CONVOLUTION_1D
CapConvolution2D -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_CONVOLUTION_2D
CapSeparable2D -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_SEPARABLE_2D
CapHistogram -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_HISTOGRAM
CapMinmax -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MINMAX
CapRescaleNormal -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_RESCALE_NORMAL
CapSharedTexturePalette -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_SHARED_TEXTURE_PALETTE_EXT
CapMultisample -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MULTISAMPLE
CapSampleAlphaToCoverage -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_SAMPLE_ALPHA_TO_COVERAGE
CapSampleAlphaToOne -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_SAMPLE_ALPHA_TO_ONE
CapSampleCoverage -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_SAMPLE_COVERAGE
CapColorTable -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_COLOR_TABLE
CapPostConvolutionColorTable -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POST_CONVOLUTION_COLOR_TABLE
CapPostColorMatrixColorTable -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POST_COLOR_MATRIX_COLOR_TABLE
CapColorSum -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_COLOR_SUM
CapWeightSumUnity -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_WEIGHT_SUM_UNITY_ARB
CapVertexBlend -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_VERTEX_BLEND_ARB
CapWeightArray -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_WEIGHT_ARRAY_ARB
CapMatrixPalette -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_MATRIX_PALETTE_ARB
CapDepthClamp -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_DEPTH_CLAMP
CapDepthBoundsTest -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_DEPTH_BOUNDS_TEST_EXT
CapPrimitiveRestart -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_PRIMITIVE_RESTART
CapPointSprite -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_POINT_SPRITE
CapStencilTestTwoSide -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_STENCIL_TEST_TWO_SIDE_EXT
CapRasterPositionUnclipped -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_RASTER_POSITION_UNCLIPPED_IBM
CapRasterizerDiscard -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_RASTERIZER_DISCARD
CapTextureColorTable -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_TEXTURE_COLOR_TABLE_SGI
CapVertexProgramPointSize -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_VERTEX_PROGRAM_POINT_SIZE
CapVertexProgramTwoSide -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_VERTEX_PROGRAM_TWO_SIDE
CapDebugOutput -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_DEBUG_OUTPUT
CapDebugOutputSynchronous -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_DEBUG_OUTPUT_SYNCHRONOUS
makeCapability :: EnableCap -> StateVar Capability
makeCapability :: EnableCap -> StateVar Capability
makeCapability cap :: EnableCap
cap = IO Capability -> (Capability -> IO ()) -> StateVar Capability
forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar (EnableCap -> IO Capability
isEnabled EnableCap
cap) (EnableCap -> Capability -> IO ()
enable EnableCap
cap)
isEnabled :: EnableCap -> IO Capability
isEnabled :: EnableCap -> IO Capability
isEnabled =
IO Capability
-> (GLenum -> IO Capability) -> Maybe GLenum -> IO Capability
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (do IO ()
recordInvalidEnum; Capability -> IO Capability
forall (m :: * -> *) a. Monad m => a -> m a
return Capability
Disabled)
((GLboolean -> Capability) -> IO GLboolean -> IO Capability
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GLboolean -> Capability
unmarshalCapability (IO GLboolean -> IO Capability)
-> (GLenum -> IO GLboolean) -> GLenum -> IO Capability
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GLenum -> IO GLboolean
forall (m :: * -> *). MonadIO m => GLenum -> m GLboolean
glIsEnabled) (Maybe GLenum -> IO Capability)
-> (EnableCap -> Maybe GLenum) -> EnableCap -> IO Capability
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
EnableCap -> Maybe GLenum
marshalEnableCap
enable :: EnableCap -> Capability -> IO ()
enable :: EnableCap -> Capability -> IO ()
enable cap :: EnableCap
cap state :: Capability
state = IO () -> (GLenum -> IO ()) -> Maybe GLenum -> IO ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe IO ()
recordInvalidEnum (Capability -> GLenum -> IO ()
forall (m :: * -> *). MonadIO m => Capability -> GLenum -> m ()
f Capability
state) (EnableCap -> Maybe GLenum
marshalEnableCap EnableCap
cap)
where f :: Capability -> GLenum -> m ()
f Disabled = GLenum -> m ()
forall (m :: * -> *). MonadIO m => GLenum -> m ()
glDisable
f Enabled = GLenum -> m ()
forall (m :: * -> *). MonadIO m => GLenum -> m ()
glEnable
makeStateVarMaybe :: IO EnableCap -> IO a -> (a -> IO ()) -> StateVar (Maybe a)
makeStateVarMaybe :: IO EnableCap -> IO a -> (a -> IO ()) -> StateVar (Maybe a)
makeStateVarMaybe getCap :: IO EnableCap
getCap getAct :: IO a
getAct setAct :: a -> IO ()
setAct =
IO (Maybe a) -> (Maybe a -> IO ()) -> StateVar (Maybe a)
forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar
(IO EnableCap -> IO a -> IO (Maybe a)
forall a. IO EnableCap -> IO a -> IO (Maybe a)
getStateVarMaybe IO EnableCap
getCap IO a
getAct)
(IO EnableCap -> (a -> IO ()) -> Maybe a -> IO ()
forall a. IO EnableCap -> (a -> IO ()) -> Maybe a -> IO ()
setStateVarMaybe IO EnableCap
getCap a -> IO ()
setAct)
getStateVarMaybe :: IO EnableCap -> IO a -> IO (Maybe a)
getStateVarMaybe :: IO EnableCap -> IO a -> IO (Maybe a)
getStateVarMaybe getCap :: IO EnableCap
getCap act :: IO a
act = do
StateVar Capability
capability <- (EnableCap -> StateVar Capability)
-> IO EnableCap -> IO (StateVar Capability)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap EnableCap -> StateVar Capability
makeCapability IO EnableCap
getCap
Capability
state <- StateVar Capability -> IO Capability
forall t a (m :: * -> *). (HasGetter t a, MonadIO m) => t -> m a
get StateVar Capability
capability
if Capability
state Capability -> Capability -> Bool
forall a. Eq a => a -> a -> Bool
== Capability
Enabled
then (a -> Maybe a) -> IO a -> IO (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Maybe a
forall a. a -> Maybe a
Just IO a
act
else Maybe a -> IO (Maybe a)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
setStateVarMaybe :: IO EnableCap -> (a -> IO ()) -> Maybe a -> IO ()
setStateVarMaybe :: IO EnableCap -> (a -> IO ()) -> Maybe a -> IO ()
setStateVarMaybe getCap :: IO EnableCap
getCap act :: a -> IO ()
act val :: Maybe a
val = do
StateVar Capability
capability <- (EnableCap -> StateVar Capability)
-> IO EnableCap -> IO (StateVar Capability)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap EnableCap -> StateVar Capability
makeCapability IO EnableCap
getCap
IO () -> (a -> IO ()) -> Maybe a -> IO ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (StateVar Capability
capability StateVar Capability -> Capability -> IO ()
forall t a (m :: * -> *).
(HasSetter t a, MonadIO m) =>
t -> a -> m ()
$= Capability
Disabled) (\x :: a
x -> a -> IO ()
act a
x IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> StateVar Capability
capability StateVar Capability -> Capability -> IO ()
forall t a (m :: * -> *).
(HasSetter t a, MonadIO m) =>
t -> a -> m ()
$= Capability
Enabled) Maybe a
val
data IndexedEnableCap =
BlendI
marshalIndexedEnableCap :: IndexedEnableCap -> Maybe GLenum
marshalIndexedEnableCap :: IndexedEnableCap -> Maybe GLenum
marshalIndexedEnableCap x :: IndexedEnableCap
x = case IndexedEnableCap
x of
BlendI -> GLenum -> Maybe GLenum
forall a. a -> Maybe a
Just GLenum
GL_BLEND
makeIndexedCapability ::(a -> GLuint) -> IndexedEnableCap -> a
-> StateVar Capability
makeIndexedCapability :: (a -> GLenum) -> IndexedEnableCap -> a -> StateVar Capability
makeIndexedCapability f :: a -> GLenum
f cap :: IndexedEnableCap
cap val :: a
val = IO Capability -> (Capability -> IO ()) -> StateVar Capability
forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar
(GLenum -> IndexedEnableCap -> IO Capability
isIndexedEnabled (a -> GLenum
f a
val) IndexedEnableCap
cap)
(\state :: Capability
state -> GLenum -> IndexedEnableCap -> Capability -> IO ()
enableIndexed (a -> GLenum
f a
val) IndexedEnableCap
cap Capability
state)
isIndexedEnabled :: GLuint -> IndexedEnableCap -> IO Capability
isIndexedEnabled :: GLenum -> IndexedEnableCap -> IO Capability
isIndexedEnabled i :: GLenum
i =
IO Capability
-> (GLenum -> IO Capability) -> Maybe GLenum -> IO Capability
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (do IO ()
recordInvalidEnum; Capability -> IO Capability
forall (m :: * -> *) a. Monad m => a -> m a
return Capability
Disabled)
(\cap :: GLenum
cap -> (GLboolean -> Capability) -> IO GLboolean -> IO Capability
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GLboolean -> Capability
unmarshalCapability (IO GLboolean -> IO Capability) -> IO GLboolean -> IO Capability
forall a b. (a -> b) -> a -> b
$ GLenum -> GLenum -> IO GLboolean
forall (m :: * -> *). MonadIO m => GLenum -> GLenum -> m GLboolean
glIsEnabledi GLenum
cap GLenum
i) (Maybe GLenum -> IO Capability)
-> (IndexedEnableCap -> Maybe GLenum)
-> IndexedEnableCap
-> IO Capability
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
IndexedEnableCap -> Maybe GLenum
marshalIndexedEnableCap
enableIndexed :: GLuint -> IndexedEnableCap -> Capability -> IO ()
enableIndexed :: GLenum -> IndexedEnableCap -> Capability -> IO ()
enableIndexed i :: GLenum
i cap :: IndexedEnableCap
cap state :: Capability
state =
IO () -> (GLenum -> IO ()) -> Maybe GLenum -> IO ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe IO ()
recordInvalidEnum (Capability -> GLenum -> IO ()
forall (m :: * -> *). MonadIO m => Capability -> GLenum -> m ()
f Capability
state) (IndexedEnableCap -> Maybe GLenum
marshalIndexedEnableCap IndexedEnableCap
cap)
where f :: Capability -> GLenum -> m ()
f Enabled = \c :: GLenum
c -> GLenum -> GLenum -> m ()
forall (m :: * -> *). MonadIO m => GLenum -> GLenum -> m ()
glEnablei GLenum
c GLenum
i
f Disabled = \c :: GLenum
c -> GLenum -> GLenum -> m ()
forall (m :: * -> *). MonadIO m => GLenum -> GLenum -> m ()
glDisablei GLenum
c GLenum
i