-----------------------------------------------------------------------------
-- |
-- Module      :  Graphics.Rendering.OpenGL.GL.Shaders.Attribs
-- Copyright   :  (c) Sven Panne 2006-2019
-- License     :  BSD3
--
-- Maintainer  :  Sven Panne <svenpanne@gmail.com>
-- Stability   :  stable
-- Portability :  portable
--
-- This module contains functions related to shader attributes, corresponding
-- to section 2.20.3 of the OpenGL 3.1 spec (Shader Variables).
--
-----------------------------------------------------------------------------

module Graphics.Rendering.OpenGL.GL.Shaders.Attribs (
   attribLocation, VariableType(..), activeAttribs,
) where

import Data.StateVar
import Graphics.Rendering.OpenGL.GL.ByteString
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GL.Shaders.Program
import Graphics.Rendering.OpenGL.GL.Shaders.Variables
import Graphics.GL

--------------------------------------------------------------------------------

activeAttributes :: Program -> GettableStateVar GLuint
activeAttributes :: Program -> GettableStateVar GLuint
activeAttributes = forall a.
(GLint -> a) -> GetProgramPName -> Program -> GettableStateVar a
programVar1 forall a b. (Integral a, Num b) => a -> b
fromIntegral GetProgramPName
ActiveAttributes

activeAttributeMaxLength :: Program -> GettableStateVar GLsizei
activeAttributeMaxLength :: Program -> GettableStateVar GLint
activeAttributeMaxLength = forall a.
(GLint -> a) -> GetProgramPName -> Program -> GettableStateVar a
programVar1 forall a b. (Integral a, Num b) => a -> b
fromIntegral GetProgramPName
ActiveAttributeMaxLength

--------------------------------------------------------------------------------

attribLocation :: Program -> String -> StateVar AttribLocation
attribLocation :: Program -> String -> StateVar AttribLocation
attribLocation Program
program String
name =
   forall a. IO a -> (a -> IO ()) -> StateVar a
makeStateVar (Program -> String -> IO AttribLocation
getAttribLocation Program
program String
name)
                (\AttribLocation
location -> Program -> AttribLocation -> String -> IO ()
bindAttribLocation Program
program AttribLocation
location String
name)

getAttribLocation :: Program -> String -> IO AttribLocation
getAttribLocation :: Program -> String -> IO AttribLocation
getAttribLocation (Program GLuint
program) String
name =
   forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GLuint -> AttribLocation
AttribLocation forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral) forall a b. (a -> b) -> a -> b
$
      forall a. String -> (Ptr GLchar -> IO a) -> IO a
withGLstring String
name forall a b. (a -> b) -> a -> b
$
         forall (m :: * -> *). MonadIO m => GLuint -> Ptr GLchar -> m GLint
glGetAttribLocation GLuint
program

bindAttribLocation :: Program -> AttribLocation -> String -> IO ()
bindAttribLocation :: Program -> AttribLocation -> String -> IO ()
bindAttribLocation (Program GLuint
program) (AttribLocation GLuint
location) String
name =
   forall a. String -> (Ptr GLchar -> IO a) -> IO a
withGLstring String
name forall a b. (a -> b) -> a -> b
$
      forall (m :: * -> *).
MonadIO m =>
GLuint -> GLuint -> Ptr GLchar -> m ()
glBindAttribLocation GLuint
program GLuint
location

--------------------------------------------------------------------------------

activeAttribs :: Program -> GettableStateVar [(GLint,VariableType,String)]
activeAttribs :: Program -> GettableStateVar [(GLint, VariableType, String)]
activeAttribs =
   forall a.
(Program -> GettableStateVar GLuint)
-> (Program -> GettableStateVar GLint)
-> (GLuint
    -> GLuint
    -> GLint
    -> Ptr GLint
    -> Ptr GLint
    -> Ptr GLuint
    -> Ptr GLchar
    -> IO ())
-> (GLuint -> a)
-> Program
-> GettableStateVar [(GLint, a, String)]
activeVars
      Program -> GettableStateVar GLuint
activeAttributes
      Program -> GettableStateVar GLint
activeAttributeMaxLength
      forall (m :: * -> *).
MonadIO m =>
GLuint
-> GLuint
-> GLint
-> Ptr GLint
-> Ptr GLint
-> Ptr GLuint
-> Ptr GLchar
-> m ()
glGetActiveAttrib
      GLuint -> VariableType
unmarshalVariableType