module Shader ( freeShaderPointers', drawShaderLay, shadVBOptr, drawShader, ) where import Control.Lens import Control.Monad import Control.Monad.Primitive import qualified Data.Vector.Unboxed.Mutable as UMV import Foreign import Graphics.GL.Core45 import Shader.Data import Shader.Parameters drawShaderLay :: Int -> UMV.MVector (PrimState IO) Int -> Int -> (Shader, VBO) -> IO () {-# INLINE drawShaderLay #-} drawShaderLay l countsVector shadIn fs = do i <- UMV.read countsVector shadIn glUseProgram (_shaderUINT $ fst fs) glBindVertexArray $ fs ^. _1 . shaderVAO . vaoName zipWithM_ (\ti -> glBindTextureUnit ti . _unTO) [0 ..] (fs ^. _1 . shaderTextures) glDrawArrays (_unPrimitiveMode $ _shaderPrimitive $ fst fs) (fromIntegral $ l * numSubElements) (fromIntegral i) drawShader :: Shader -> Int -> IO () {-# INLINE drawShader #-} drawShader fs i = do glUseProgram (_shaderUINT fs) glBindVertexArray $ fs ^. shaderVAO . vaoName zipWithM_ (\ti -> glBindTextureUnit ti . _unTO) [0..] (fs ^. shaderTextures) glDrawArrays (_unPrimitiveMode $ _shaderPrimitive fs) 0 (fromIntegral i) freeShaderPointers' :: (Shader, VBO) -> IO () freeShaderPointers' = free . _vboPtr . snd shadVBOptr :: (Shader, VBO) -> Ptr Float {-# INLINE shadVBOptr #-} shadVBOptr = _vboPtr . snd