module Shader ( freeShaderPointers', drawShaderLay, shadVBOptr, drawShader, ) where import Control.Lens 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 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 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