module Graphics.Rendering.OpenGL.GL.TransformFeedback (
beginTransformFeedback, endTransformFeedback,
TransformFeedbackBufferMode(..), marshalTransformFeedbackBufferMode,
unmarshalTransformFeedbackBufferMode,
transformFeedbackBufferMode, getTransformFeedbackVaryings,
setTransformFeedbackVaryings, getTransformFeedbackVarying,
getTransformFeedbackVaryingMaxLength,
maxTransformFeedbackSeparateAttribs,
maxTransformFeedbackInterleavedComponents,
maxTransformFeedbackSeparateComponents
) where
import Data.StateVar
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Storable
import Graphics.Rendering.OpenGL.Raw.Core32
import Graphics.Rendering.OpenGL.GL.DataType
import Graphics.Rendering.OpenGL.GL.GLstring
import Graphics.Rendering.OpenGL.GL.PrimitiveMode
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GL.Shaders.Program
beginTransformFeedback :: PrimitiveMode -> IO ()
beginTransformFeedback = glBeginTransformFeedback . marshalPrimitiveMode
endTransformFeedback :: IO ()
endTransformFeedback = glEndTransformFeedback
data TransformFeedbackBufferMode = InterleavedAttribs | SeperateAttribs
marshalTransformFeedbackBufferMode :: TransformFeedbackBufferMode -> GLenum
marshalTransformFeedbackBufferMode x = case x of
InterleavedAttribs -> gl_INTERLEAVED_ATTRIBS
SeperateAttribs -> gl_SEPARATE_ATTRIBS
unmarshalTransformFeedbackBufferMode :: GLenum -> TransformFeedbackBufferMode
unmarshalTransformFeedbackBufferMode x
| x == gl_INTERLEAVED_ATTRIBS = InterleavedAttribs
| x == gl_SEPARATE_ATTRIBS = SeperateAttribs
| otherwise = error $ "unmarshalTransformFeedbackBufferMode: illegal value " ++ show x
maxTransformFeedbackSeparateAttribs :: GettableStateVar GLint
maxTransformFeedbackSeparateAttribs = makeGettableStateVar $
getInteger1 fromIntegral GetMaxTransformFeedbackSeparateAttribs
maxTransformFeedbackInterleavedComponents :: GettableStateVar GLint
maxTransformFeedbackInterleavedComponents = makeGettableStateVar $
getInteger1 fromIntegral GetMaxTransformFeedbackInterleavedComponents
maxTransformFeedbackSeparateComponents :: GettableStateVar GLint
maxTransformFeedbackSeparateComponents = makeGettableStateVar $
getInteger1 fromIntegral GetMaxTransformFeedbackSeparateComponents
type VaryingIndex = GLuint
type MaxLength = GLsizei
setTransformFeedbackVaryings :: Program -> [String]
-> TransformFeedbackBufferMode -> IO ()
setTransformFeedbackVaryings (Program program) sts tfbm = do
ptSts <- mapM (\x -> withGLString x return) sts
stsPtrs <- newArray ptSts
glTransformFeedbackVaryings program (fromIntegral . length $ sts) stsPtrs
(marshalTransformFeedbackBufferMode tfbm)
transformFeedbackBufferMode
:: Program -> GettableStateVar TransformFeedbackBufferMode
transformFeedbackBufferMode = programVar
(unmarshalTransformFeedbackBufferMode . fromIntegral)
TransformFeedbackBufferMode
getTransformFeedbackVaryings :: Program -> GettableStateVar GLuint
getTransformFeedbackVaryings
= programVar fromIntegral TransformFeedbackVaryings
getTransformFeedbackVaryingMaxLength :: Program -> GettableStateVar GLuint
getTransformFeedbackVaryingMaxLength
= programVar fromIntegral TransformFeedbackVaryingMaxLength
getTransformFeedbackVarying :: Program
-> VaryingIndex
-> MaxLength
-> IO (String, DataType, GLsizei)
getTransformFeedbackVarying (Program program) vi ml = do
alloca $ \nlength -> do
alloca $ \size -> do
alloca $ \dtype -> do
allocaArray (fromIntegral ml) $ \name -> do
glGetTransformFeedbackVarying program vi ml nlength size
dtype name
l <- peek nlength
s <- peek size
d <- peek dtype
n <- peekGLstringLen (name, l)
return (n,unmarshalDataType d, s)