module Graphics.Rendering.OpenGL.GL.TransformFeedback (
beginTransformFeedback, endTransformFeedback,
TransformFeedbackBufferMode(..), marshalTransformFeedbackBufferMode,
unmarshalTransformFeedbackBufferMode,
transformFeedbackBufferMode,
transformFeedbackVaryings,
setTransformFeedbackVaryings,
maxTransformFeedbackSeparateAttribs,
maxTransformFeedbackInterleavedComponents,
maxTransformFeedbackSeparateComponents
) where
import Data.StateVar
import Foreign.Marshal.Array
import Graphics.Rendering.OpenGL.GL.ByteString
import Graphics.Rendering.OpenGL.GL.DataType
import Graphics.Rendering.OpenGL.GL.PrimitiveMode
import Graphics.Rendering.OpenGL.GL.PrimitiveModeInternal
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GL.Shaders.Program
import Graphics.Rendering.OpenGL.GL.Shaders.Variables
import Graphics.GL
beginTransformFeedback :: PrimitiveMode -> IO ()
beginTransformFeedback :: PrimitiveMode -> IO ()
beginTransformFeedback = GLenum -> IO ()
forall (m :: * -> *). MonadIO m => GLenum -> m ()
glBeginTransformFeedback (GLenum -> IO ())
-> (PrimitiveMode -> GLenum) -> PrimitiveMode -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimitiveMode -> GLenum
marshalPrimitiveMode
endTransformFeedback :: IO ()
endTransformFeedback :: IO ()
endTransformFeedback = IO ()
forall (m :: * -> *). MonadIO m => m ()
glEndTransformFeedback
data TransformFeedbackBufferMode =
InterleavedAttribs
| SeparateAttribs
| SeperateAttribs
deriving ( TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
(TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Bool)
-> (TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Bool)
-> Eq TransformFeedbackBufferMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
$c/= :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
== :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
$c== :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
Eq, Eq TransformFeedbackBufferMode
Eq TransformFeedbackBufferMode
-> (TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Ordering)
-> (TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Bool)
-> (TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Bool)
-> (TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Bool)
-> (TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Bool)
-> (TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> TransformFeedbackBufferMode)
-> (TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> TransformFeedbackBufferMode)
-> Ord TransformFeedbackBufferMode
TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Ordering
TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> TransformFeedbackBufferMode
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 :: TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> TransformFeedbackBufferMode
$cmin :: TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> TransformFeedbackBufferMode
max :: TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> TransformFeedbackBufferMode
$cmax :: TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> TransformFeedbackBufferMode
>= :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
$c>= :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
> :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
$c> :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
<= :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
$c<= :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
< :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
$c< :: TransformFeedbackBufferMode -> TransformFeedbackBufferMode -> Bool
compare :: TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Ordering
$ccompare :: TransformFeedbackBufferMode
-> TransformFeedbackBufferMode -> Ordering
$cp1Ord :: Eq TransformFeedbackBufferMode
Ord, Int -> TransformFeedbackBufferMode -> ShowS
[TransformFeedbackBufferMode] -> ShowS
TransformFeedbackBufferMode -> String
(Int -> TransformFeedbackBufferMode -> ShowS)
-> (TransformFeedbackBufferMode -> String)
-> ([TransformFeedbackBufferMode] -> ShowS)
-> Show TransformFeedbackBufferMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransformFeedbackBufferMode] -> ShowS
$cshowList :: [TransformFeedbackBufferMode] -> ShowS
show :: TransformFeedbackBufferMode -> String
$cshow :: TransformFeedbackBufferMode -> String
showsPrec :: Int -> TransformFeedbackBufferMode -> ShowS
$cshowsPrec :: Int -> TransformFeedbackBufferMode -> ShowS
Show )
{-# DEPRECATED SeperateAttribs "Use 'SeparateAttribs' instead." #-}
marshalTransformFeedbackBufferMode :: TransformFeedbackBufferMode -> GLenum
marshalTransformFeedbackBufferMode :: TransformFeedbackBufferMode -> GLenum
marshalTransformFeedbackBufferMode TransformFeedbackBufferMode
x = case TransformFeedbackBufferMode
x of
TransformFeedbackBufferMode
InterleavedAttribs -> GLenum
GL_INTERLEAVED_ATTRIBS
TransformFeedbackBufferMode
SeparateAttribs -> GLenum
GL_SEPARATE_ATTRIBS
TransformFeedbackBufferMode
SeperateAttribs -> GLenum
GL_SEPARATE_ATTRIBS
unmarshalTransformFeedbackBufferMode :: GLenum -> TransformFeedbackBufferMode
unmarshalTransformFeedbackBufferMode :: GLenum -> TransformFeedbackBufferMode
unmarshalTransformFeedbackBufferMode GLenum
x
| GLenum
x GLenum -> GLenum -> Bool
forall a. Eq a => a -> a -> Bool
== GLenum
GL_INTERLEAVED_ATTRIBS = TransformFeedbackBufferMode
InterleavedAttribs
| GLenum
x GLenum -> GLenum -> Bool
forall a. Eq a => a -> a -> Bool
== GLenum
GL_SEPARATE_ATTRIBS = TransformFeedbackBufferMode
SeparateAttribs
| Bool
otherwise = String -> TransformFeedbackBufferMode
forall a. HasCallStack => String -> a
error (String -> TransformFeedbackBufferMode)
-> String -> TransformFeedbackBufferMode
forall a b. (a -> b) -> a -> b
$ String
"unmarshalTransformFeedbackBufferMode: illegal value " String -> ShowS
forall a. [a] -> [a] -> [a]
++ GLenum -> String
forall a. Show a => a -> String
show GLenum
x
maxTransformFeedbackSeparateAttribs :: GettableStateVar GLint
maxTransformFeedbackSeparateAttribs :: GettableStateVar GLint
maxTransformFeedbackSeparateAttribs = GettableStateVar GLint -> GettableStateVar GLint
forall a. IO a -> IO a
makeGettableStateVar (GettableStateVar GLint -> GettableStateVar GLint)
-> GettableStateVar GLint -> GettableStateVar GLint
forall a b. (a -> b) -> a -> b
$
(GLint -> GLint) -> PName1I -> GettableStateVar GLint
forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 GLint -> GLint
forall a b. (Integral a, Num b) => a -> b
fromIntegral PName1I
GetMaxTransformFeedbackSeparateAttribs
maxTransformFeedbackInterleavedComponents :: GettableStateVar GLint
maxTransformFeedbackInterleavedComponents :: GettableStateVar GLint
maxTransformFeedbackInterleavedComponents = GettableStateVar GLint -> GettableStateVar GLint
forall a. IO a -> IO a
makeGettableStateVar (GettableStateVar GLint -> GettableStateVar GLint)
-> GettableStateVar GLint -> GettableStateVar GLint
forall a b. (a -> b) -> a -> b
$
(GLint -> GLint) -> PName1I -> GettableStateVar GLint
forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 GLint -> GLint
forall a b. (Integral a, Num b) => a -> b
fromIntegral PName1I
GetMaxTransformFeedbackInterleavedComponents
maxTransformFeedbackSeparateComponents :: GettableStateVar GLint
maxTransformFeedbackSeparateComponents :: GettableStateVar GLint
maxTransformFeedbackSeparateComponents = GettableStateVar GLint -> GettableStateVar GLint
forall a. IO a -> IO a
makeGettableStateVar (GettableStateVar GLint -> GettableStateVar GLint)
-> GettableStateVar GLint -> GettableStateVar GLint
forall a b. (a -> b) -> a -> b
$
(GLint -> GLint) -> PName1I -> GettableStateVar GLint
forall p a. GetPName1I p => (GLint -> a) -> p -> IO a
getInteger1 GLint -> GLint
forall a b. (Integral a, Num b) => a -> b
fromIntegral PName1I
GetMaxTransformFeedbackSeparateComponents
setTransformFeedbackVaryings :: Program -> [String]
-> TransformFeedbackBufferMode -> IO ()
setTransformFeedbackVaryings :: Program -> [String] -> TransformFeedbackBufferMode -> IO ()
setTransformFeedbackVaryings (Program GLenum
program) [String]
sts TransformFeedbackBufferMode
tfbm = do
[Ptr GLchar]
ptSts <- (String -> IO (Ptr GLchar)) -> [String] -> IO [Ptr GLchar]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\String
x -> String -> (Ptr GLchar -> IO (Ptr GLchar)) -> IO (Ptr GLchar)
forall a. String -> (Ptr GLchar -> IO a) -> IO a
withGLstring String
x Ptr GLchar -> IO (Ptr GLchar)
forall (m :: * -> *) a. Monad m => a -> m a
return) [String]
sts
Ptr (Ptr GLchar)
stsPtrs <- [Ptr GLchar] -> IO (Ptr (Ptr GLchar))
forall a. Storable a => [a] -> IO (Ptr a)
newArray [Ptr GLchar]
ptSts
GLenum -> GLint -> Ptr (Ptr GLchar) -> GLenum -> IO ()
forall (m :: * -> *).
MonadIO m =>
GLenum -> GLint -> Ptr (Ptr GLchar) -> GLenum -> m ()
glTransformFeedbackVaryings GLenum
program (Int -> GLint
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> GLint) -> ([String] -> Int) -> [String] -> GLint
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([String] -> GLint) -> [String] -> GLint
forall a b. (a -> b) -> a -> b
$ [String]
sts) Ptr (Ptr GLchar)
stsPtrs
(TransformFeedbackBufferMode -> GLenum
marshalTransformFeedbackBufferMode TransformFeedbackBufferMode
tfbm)
transformFeedbackBufferMode
:: Program -> GettableStateVar TransformFeedbackBufferMode
transformFeedbackBufferMode :: Program -> GettableStateVar TransformFeedbackBufferMode
transformFeedbackBufferMode = (GLint -> TransformFeedbackBufferMode)
-> GetProgramPName
-> Program
-> GettableStateVar TransformFeedbackBufferMode
forall a.
(GLint -> a) -> GetProgramPName -> Program -> GettableStateVar a
programVar1
(GLenum -> TransformFeedbackBufferMode
unmarshalTransformFeedbackBufferMode (GLenum -> TransformFeedbackBufferMode)
-> (GLint -> GLenum) -> GLint -> TransformFeedbackBufferMode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GLint -> GLenum
forall a b. (Integral a, Num b) => a -> b
fromIntegral)
GetProgramPName
TransformFeedbackBufferMode
numTransformFeedbackVaryings :: Program -> GettableStateVar GLuint
numTransformFeedbackVaryings :: Program -> GettableStateVar GLenum
numTransformFeedbackVaryings =
(GLint -> GLenum)
-> GetProgramPName -> Program -> GettableStateVar GLenum
forall a.
(GLint -> a) -> GetProgramPName -> Program -> GettableStateVar a
programVar1 GLint -> GLenum
forall a b. (Integral a, Num b) => a -> b
fromIntegral GetProgramPName
TransformFeedbackVaryings
transformFeedbackVaryingMaxLength :: Program -> GettableStateVar GLsizei
transformFeedbackVaryingMaxLength :: Program -> GettableStateVar GLint
transformFeedbackVaryingMaxLength
= (GLint -> GLint)
-> GetProgramPName -> Program -> GettableStateVar GLint
forall a.
(GLint -> a) -> GetProgramPName -> Program -> GettableStateVar a
programVar1 GLint -> GLint
forall a b. (Integral a, Num b) => a -> b
fromIntegral GetProgramPName
TransformFeedbackVaryingMaxLength
transformFeedbackVaryings :: Program -> GettableStateVar [(GLint, DataType, String)]
transformFeedbackVaryings :: Program -> GettableStateVar [(GLint, DataType, String)]
transformFeedbackVaryings =
(Program -> GettableStateVar GLenum)
-> (Program -> GettableStateVar GLint)
-> (GLenum
-> GLenum
-> GLint
-> Ptr GLint
-> Ptr GLint
-> Ptr GLenum
-> Ptr GLchar
-> IO ())
-> (GLenum -> DataType)
-> Program
-> GettableStateVar [(GLint, DataType, String)]
forall a.
(Program -> GettableStateVar GLenum)
-> (Program -> GettableStateVar GLint)
-> (GLenum
-> GLenum
-> GLint
-> Ptr GLint
-> Ptr GLint
-> Ptr GLenum
-> Ptr GLchar
-> IO ())
-> (GLenum -> a)
-> Program
-> GettableStateVar [(GLint, a, String)]
activeVars
Program -> GettableStateVar GLenum
numTransformFeedbackVaryings
Program -> GettableStateVar GLint
transformFeedbackVaryingMaxLength
GLenum
-> GLenum
-> GLint
-> Ptr GLint
-> Ptr GLint
-> Ptr GLenum
-> Ptr GLchar
-> IO ()
forall (m :: * -> *).
MonadIO m =>
GLenum
-> GLenum
-> GLint
-> Ptr GLint
-> Ptr GLint
-> Ptr GLenum
-> Ptr GLchar
-> m ()
glGetTransformFeedbackVarying
GLenum -> DataType
unmarshalDataType