Refactor vao preload
This commit is contained in:
+94
-55
@@ -10,6 +10,7 @@ import qualified Graphics.Rendering.OpenGL as GL
|
||||
import qualified Data.Vector.Storable as V
|
||||
|
||||
import Control.Lens
|
||||
import Control.Monad
|
||||
|
||||
import Foreign
|
||||
|
||||
@@ -20,19 +21,55 @@ data PreloadData = PreloadData
|
||||
-- , _textures :: [Image PixelRGBA8]
|
||||
, _basicShader :: Program
|
||||
, _textShader :: Program
|
||||
, _circShader :: Program
|
||||
, _arcShader :: Program
|
||||
, _lineShader :: Program
|
||||
, _fadeCircleShader :: Program
|
||||
, _basicVAO :: VertexArrayObject
|
||||
, _textVAO :: VertexArrayObject
|
||||
, _circVAO :: VertexArrayObject
|
||||
, _arcVAO :: VertexArrayObject
|
||||
, _posVBO :: BufferObject
|
||||
, _colVBO :: BufferObject
|
||||
, _texVBO :: BufferObject
|
||||
, _ptrPosVBO :: Ptr Float
|
||||
, _ptrColVBO :: Ptr Float
|
||||
, _ptrTexVBO :: Ptr Float
|
||||
, _ptrCharPos :: Ptr Float
|
||||
, _ptrCharCol :: Ptr Float
|
||||
, _ptrCharTex :: Ptr Float
|
||||
, _ptrCircPos :: Ptr Float
|
||||
, _ptrCircCol :: Ptr Float
|
||||
, _ptrCircSca :: Ptr Float
|
||||
, _ptrArcPos :: Ptr Float
|
||||
, _ptrArcCol :: Ptr Float
|
||||
, _ptrArcSca :: Ptr Float
|
||||
, _ptrLinePos :: Ptr Float
|
||||
, _ptrLineCol :: Ptr Float
|
||||
, _uniWinSize :: UniformLocation
|
||||
, _csZoomUni :: UniformLocation
|
||||
, _asWinUni :: UniformLocation
|
||||
, _asZoomUni :: UniformLocation
|
||||
}
|
||||
|
||||
makeLenses ''PreloadData
|
||||
|
||||
floatSize = sizeOf (0.5 :: GLfloat)
|
||||
|
||||
setupVAO :: [(BufferObject,GLuint,Int)] -> IO VertexArrayObject
|
||||
setupVAO ps = do
|
||||
theVAO <- genObjectName
|
||||
bindVertexArrayObject $= Just theVAO
|
||||
forM_ ps $ \(vbo,aloc,i) -> do
|
||||
bindBuffer ArrayBuffer $= Just vbo
|
||||
vertexAttribPointer (AttribLocation aloc) $=
|
||||
( ToFloat
|
||||
, VertexArrayDescriptor (fromIntegral i)
|
||||
Float
|
||||
(fromIntegral $ floatSize * i)
|
||||
(bufferOffset 0)
|
||||
)
|
||||
vertexAttribArray (AttribLocation aloc) $= Enabled
|
||||
return theVAO
|
||||
|
||||
loadTextures :: IO [Image PixelRGBA8]
|
||||
loadTextures = do
|
||||
@@ -53,8 +90,16 @@ doPreload' = do
|
||||
-- compile shader programs
|
||||
bs <- makeBasicShader
|
||||
ts <- makeTextureShader
|
||||
cs <- makeCircleShader
|
||||
as <- makeArcShader
|
||||
fcs <- makeFadeShader
|
||||
|
||||
winSizeUni <- GL.uniformLocation cs "winSize"
|
||||
zoomUni <- GL.uniformLocation cs "zoom"
|
||||
asWinSizeUniLoc <- GL.uniformLocation as "winSize"
|
||||
asZoomUniLoc <- GL.uniformLocation as "zoom"
|
||||
-- get uniform locations
|
||||
|
||||
--setup vbos
|
||||
--need to be bound before assigning the vertex attribute pointers
|
||||
posVBO <- genObjectName
|
||||
@@ -76,81 +121,75 @@ doPreload' = do
|
||||
generateMipmap' Texture2D
|
||||
textureFilter Texture2D $= ((Linear',Just Linear') , Nearest)
|
||||
|
||||
let vertexSize = sizeOf (0.5 :: GLfloat)
|
||||
firstIndex = 0
|
||||
|
||||
-- setup VAOs: basic vao
|
||||
basicVAO <- genObjectName
|
||||
bindVertexArrayObject $= Just basicVAO
|
||||
|
||||
-- let posAttrib = AttribLocation 0
|
||||
-- colAttrib = AttribLocation 1
|
||||
bindBuffer ArrayBuffer $= Just posVBO
|
||||
vertexAttribPointer (AttribLocation 0) $=
|
||||
( ToFloat
|
||||
, VertexArrayDescriptor 3 Float (fromIntegral $ vertexSize * 3)
|
||||
(bufferOffset (firstIndex * vertexSize))
|
||||
)
|
||||
vertexAttribArray (AttribLocation 0) $= Enabled
|
||||
|
||||
bindBuffer ArrayBuffer $= Just colVBO
|
||||
vertexAttribPointer (AttribLocation 1) $=
|
||||
( ToFloat
|
||||
, VertexArrayDescriptor 4 Float (fromIntegral $ vertexSize * 4)
|
||||
(bufferOffset (firstIndex * vertexSize) )
|
||||
)
|
||||
vertexAttribArray (AttribLocation 1) $= Enabled
|
||||
|
||||
-- setup second vao
|
||||
textVAO <- genObjectName
|
||||
bindVertexArrayObject $= Just textVAO
|
||||
|
||||
bindBuffer ArrayBuffer $= Just posVBO
|
||||
vertexAttribPointer (AttribLocation 0) $=
|
||||
( ToFloat
|
||||
, VertexArrayDescriptor 3 Float (fromIntegral $ vertexSize * 3)
|
||||
(bufferOffset (firstIndex * vertexSize))
|
||||
)
|
||||
vertexAttribArray (AttribLocation 0) $= Enabled
|
||||
|
||||
bindBuffer ArrayBuffer $= Just colVBO
|
||||
vertexAttribPointer (AttribLocation 1) $=
|
||||
( ToFloat
|
||||
, VertexArrayDescriptor 4 Float (fromIntegral $ vertexSize * 4)
|
||||
(bufferOffset (firstIndex * vertexSize) )
|
||||
)
|
||||
vertexAttribArray (AttribLocation 1) $= Enabled
|
||||
|
||||
bindBuffer ArrayBuffer $= Just texVBO
|
||||
vertexAttribPointer (AttribLocation 2) $=
|
||||
( ToFloat
|
||||
, VertexArrayDescriptor 2 Float (fromIntegral $ vertexSize * 2)
|
||||
(bufferOffset (firstIndex * vertexSize) )
|
||||
)
|
||||
vertexAttribArray (AttribLocation 2) $= Enabled
|
||||
basicVAO <- setupVAO [(posVBO,0,3),(colVBO,1,4)]
|
||||
textVAO <- setupVAO [(posVBO,0,3),(colVBO,1,4),(texVBO,2,2)]
|
||||
circVAO <- setupVAO [(posVBO,0,3),(colVBO,1,4),(texVBO,2,1)]
|
||||
arcVAO <- setupVAO [(posVBO,0,3),(colVBO,1,4),(texVBO,2,3)]
|
||||
|
||||
-- allocate memory for vertex attributes
|
||||
-- for triangles
|
||||
ptrPosVBO <- mallocArray (3*3*20000)
|
||||
ptrColVBO <- mallocArray (3*4*20000)
|
||||
ptrTexVBO <- mallocArray (3*2*20000)
|
||||
-- for characters
|
||||
ptrCharPos <- mallocArray (3*20000)
|
||||
ptrCharCol <- mallocArray (4*20000)
|
||||
ptrCharTex <- mallocArray (2*20000)
|
||||
-- for circles
|
||||
ptrCircPos <- mallocArray (3*20000)
|
||||
ptrCircCol <- mallocArray (4*20000)
|
||||
ptrCircSca <- mallocArray (2*20000)
|
||||
-- for lines
|
||||
ptrLinePos <- mallocArray (3*20000)
|
||||
ptrLineCol <- mallocArray (4*20000)
|
||||
-- for arcs
|
||||
ptrArcPos <- mallocArray (3*20000)
|
||||
ptrArcCol <- mallocArray (4*20000)
|
||||
ptrArcSca <- mallocArray (3*20000)
|
||||
|
||||
return $ PreloadData
|
||||
{ _charMap = convertRGBA8 cmap
|
||||
, _basicShader = bs
|
||||
, _textShader = ts
|
||||
, _circShader = cs
|
||||
, _arcShader = as
|
||||
, _fadeCircleShader = fcs
|
||||
, _basicVAO = basicVAO
|
||||
, _textVAO = textVAO
|
||||
, _circVAO = circVAO
|
||||
, _arcVAO = arcVAO
|
||||
, _posVBO = posVBO
|
||||
, _colVBO = colVBO
|
||||
, _texVBO = texVBO
|
||||
, _ptrPosVBO = ptrPosVBO
|
||||
, _ptrColVBO = ptrColVBO
|
||||
, _ptrTexVBO = ptrTexVBO
|
||||
, _ptrCharPos = ptrCharPos
|
||||
, _ptrCharCol = ptrCharCol
|
||||
, _ptrCharTex = ptrCharTex
|
||||
, _ptrCircPos = ptrCircPos
|
||||
, _ptrCircCol = ptrCircCol
|
||||
, _ptrCircSca = ptrCircSca
|
||||
, _ptrArcPos = ptrArcPos
|
||||
, _ptrArcCol = ptrArcCol
|
||||
, _ptrArcSca = ptrArcSca
|
||||
, _ptrLinePos = ptrLinePos
|
||||
, _ptrLineCol = ptrLineCol
|
||||
, _uniWinSize = winSizeUni
|
||||
, _csZoomUni = zoomUni
|
||||
, _asWinUni = asWinSizeUniLoc
|
||||
, _asZoomUni = asZoomUniLoc
|
||||
}
|
||||
|
||||
cleanUpPreload :: PreloadData -> IO ()
|
||||
cleanUpPreload pd = do
|
||||
free (_ptrPosVBO pd)
|
||||
free (_ptrColVBO pd)
|
||||
free (_ptrTexVBO pd)
|
||||
free (_ptrCharPos pd)
|
||||
free (_ptrCharCol pd)
|
||||
free (_ptrCharTex pd)
|
||||
free (_ptrCircPos pd)
|
||||
free (_ptrCircCol pd)
|
||||
free (_ptrCircSca pd)
|
||||
free (_ptrArcPos pd)
|
||||
free (_ptrArcCol pd)
|
||||
free (_ptrArcSca pd)
|
||||
|
||||
Reference in New Issue
Block a user