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