{-# OPTIONS_HADDOCK hide #-}
module Graphics.Rendering.OpenGL.GL.QueryUtils (
module Graphics.Rendering.OpenGL.GL.QueryUtils.PName,
module Graphics.Rendering.OpenGL.GL.QueryUtils.VertexAttrib,
lightIndexToEnum,
modelviewIndexToEnum, modelviewEnumToIndex,
maybeNullPtr,
objectNameLabel, objectPtrLabel, maxLabelLength
) where
import Data.StateVar
import Foreign.C.String ( peekCStringLen, withCStringLen )
import Foreign.Ptr ( Ptr, nullPtr )
import Foreign.Marshal.Alloc ( alloca )
import Foreign.Marshal.Array ( allocaArray )
import Graphics.Rendering.OpenGL.GL.PeekPoke
import Graphics.Rendering.OpenGL.GL.QueryUtils.PName
import Graphics.Rendering.OpenGL.GL.QueryUtils.VertexAttrib
import Graphics.GL
lightIndexToEnum :: GLsizei -> Maybe GLenum
lightIndexToEnum :: GLsizei -> Maybe GLenum
lightIndexToEnum GLsizei
i
| GLsizei
0 forall a. Ord a => a -> a -> Bool
<= GLsizei
i Bool -> Bool -> Bool
&& GLsizei
i forall a. Ord a => a -> a -> Bool
<= GLsizei
maxLightIndex = forall a. a -> Maybe a
Just (GLenum
GL_LIGHT0 forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral GLsizei
i)
| Bool
otherwise = forall a. Maybe a
Nothing
maxLightIndex :: GLsizei
maxLightIndex :: GLsizei
maxLightIndex = GLsizei
0xFFF
modelviewIndexToEnum :: GLsizei -> Maybe GLenum
modelviewIndexToEnum :: GLsizei -> Maybe GLenum
modelviewIndexToEnum GLsizei
0 = forall a. a -> Maybe a
Just GLenum
GL_MODELVIEW
modelviewIndexToEnum GLsizei
1 = forall a. a -> Maybe a
Just GLenum
GL_MODELVIEW1_ARB
modelviewIndexToEnum GLsizei
i
| GLsizei
2 forall a. Ord a => a -> a -> Bool
<= GLsizei
i Bool -> Bool -> Bool
&& GLsizei
i forall a. Ord a => a -> a -> Bool
<= GLsizei
31 = forall a. a -> Maybe a
Just (GLenum
GL_MODELVIEW2_ARB forall a. Num a => a -> a -> a
- GLenum
2 forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral GLsizei
i)
| Bool
otherwise = forall a. Maybe a
Nothing
modelviewEnumToIndex :: GLenum -> Maybe GLsizei
modelviewEnumToIndex :: GLenum -> Maybe GLsizei
modelviewEnumToIndex GLenum
x
| GLenum
x forall a. Eq a => a -> a -> Bool
== GLenum
GL_MODELVIEW = forall a. a -> Maybe a
Just GLsizei
0
| GLenum
x forall a. Eq a => a -> a -> Bool
== GLenum
GL_MODELVIEW1_ARB = forall a. a -> Maybe a
Just GLsizei
1
| GLenum
GL_MODELVIEW2_ARB forall a. Ord a => a -> a -> Bool
<= GLenum
x Bool -> Bool -> Bool
&& GLenum
x forall a. Ord a => a -> a -> Bool
<= GLenum
GL_MODELVIEW31_ARB = forall a. a -> Maybe a
Just (forall a b. (Integral a, Num b) => a -> b
fromIntegral (GLenum
x forall a. Num a => a -> a -> a
- (GLenum
GL_MODELVIEW2_ARB forall a. Num a => a -> a -> a
- GLenum
2)))
| Bool
otherwise = forall a. Maybe a
Nothing
maybeNullPtr :: b -> (Ptr a -> b) -> Ptr a -> b
maybeNullPtr :: forall b a. b -> (Ptr a -> b) -> Ptr a -> b
maybeNullPtr b
n Ptr a -> b
f Ptr a
ptr | Ptr a
ptr forall a. Eq a => a -> a -> Bool
== forall a. Ptr a
nullPtr = b
n
| Bool
otherwise = Ptr a -> b
f Ptr a
ptr
objectNameLabel :: GLuint -> GLenum -> StateVar (Maybe String)
objectNameLabel :: GLenum -> GLenum -> StateVar (Maybe String)
objectNameLabel GLenum
name GLenum
ident =
forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar
((GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
-> IO (Maybe String)
getObjectLabelWith (forall (m :: * -> *).
MonadIO m =>
GLenum -> GLenum -> GLsizei -> Ptr GLsizei -> Ptr GLchar -> m ()
glGetObjectLabel GLenum
ident GLenum
name))
((GLsizei -> Ptr GLchar -> IO ()) -> Maybe String -> IO ()
setObjectLabelWith (forall (m :: * -> *).
MonadIO m =>
GLenum -> GLenum -> GLsizei -> Ptr GLchar -> m ()
glObjectLabel GLenum
ident GLenum
name))
objectPtrLabel :: Ptr () -> StateVar (Maybe String)
objectPtrLabel :: Ptr () -> StateVar (Maybe String)
objectPtrLabel Ptr ()
ptr =
forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar
((GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
-> IO (Maybe String)
getObjectLabelWith (forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> GLsizei -> Ptr GLsizei -> Ptr GLchar -> m ()
glGetObjectPtrLabel Ptr ()
ptr))
((GLsizei -> Ptr GLchar -> IO ()) -> Maybe String -> IO ()
setObjectLabelWith (forall (m :: * -> *) a.
MonadIO m =>
Ptr a -> GLsizei -> Ptr GLchar -> m ()
glObjectPtrLabel Ptr ()
ptr))
getObjectLabelWith :: (GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
-> IO (Maybe String)
getObjectLabelWith :: (GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ())
-> IO (Maybe String)
getObjectLabelWith GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ()
getLabel = do
GLsizei
maxLen <- forall t a (m :: * -> *). (HasGetter t a, MonadIO m) => t -> m a
get GettableStateVar GLsizei
maxLabelLength
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca forall a b. (a -> b) -> a -> b
$ \Ptr GLsizei
lenBuf ->
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray (forall a b. (Integral a, Num b) => a -> b
fromIntegral GLsizei
maxLen) forall a b. (a -> b) -> a -> b
$ \Ptr GLchar
labelBuf -> do
GLsizei -> Ptr GLsizei -> Ptr GLchar -> IO ()
getLabel GLsizei
maxLen Ptr GLsizei
lenBuf Ptr GLchar
labelBuf
Int
actualLen <- forall a b. Storable a => (a -> b) -> Ptr a -> IO b
peek1 forall a b. (Integral a, Num b) => a -> b
fromIntegral Ptr GLsizei
lenBuf
String
label <- CStringLen -> IO String
peekCStringLen (Ptr GLchar
labelBuf, Int
actualLen)
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ if String
label forall a. Eq a => a -> a -> Bool
== String
"" then forall a. Maybe a
Nothing else forall a. a -> Maybe a
Just String
label
setObjectLabelWith :: (GLsizei -> Ptr GLchar -> IO ()) -> Maybe String -> IO ()
setObjectLabelWith :: (GLsizei -> Ptr GLchar -> IO ()) -> Maybe String -> IO ()
setObjectLabelWith GLsizei -> Ptr GLchar -> IO ()
setLabel =
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall {a}. Integral a => (Ptr GLchar, a) -> IO ()
set (forall a. Ptr a
nullPtr, (Int
0 :: Int))) (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. String -> (CStringLen -> IO a) -> IO a
withCStringLen forall {a}. Integral a => (Ptr GLchar, a) -> IO ()
set)
where set :: (Ptr GLchar, a) -> IO ()
set (Ptr GLchar
labelBuf, a
len) = GLsizei -> Ptr GLchar -> IO ()
setLabel (forall a b. (Integral a, Num b) => a -> b
fromIntegral a
len) Ptr GLchar
labelBuf
maxLabelLength :: GettableStateVar GLsizei
maxLabelLength :: GettableStateVar GLsizei
maxLabelLength =
forall a. IO a -> IO a
makeGettableStateVar (forall p a. GetPName1I p => (GLsizei -> a) -> p -> IO a
getSizei1 forall a. a -> a
id PName1I
GetMaxLabelLength)