277 lines
10 KiB
Haskell
277 lines
10 KiB
Haskell
--{-# LANGUAGE TemplateHaskell #-}
|
|
--{-# OPTIONS_GHC -Wno-unused-top-binds #-}
|
|
module Preload.Render (
|
|
preloadRender,
|
|
cleanUpRenderPreload,
|
|
) where
|
|
|
|
import Control.Concurrent
|
|
import Control.Lens
|
|
import Control.Monad
|
|
import Data.Preload.Render
|
|
import qualified Data.Vector.Mutable as MV
|
|
import Foreign
|
|
import Framebuffer.Setup
|
|
import GLHelp
|
|
import Graphics.GL.Core45
|
|
import Shader
|
|
import Shader.AuxAddition
|
|
import Shader.Compile
|
|
import Shader.Data
|
|
import Shader.Parameters
|
|
import Shape.Data
|
|
|
|
{- BINDING LIST:
|
|
0 base
|
|
40 texture array diffuse
|
|
41 texture array normals
|
|
50 charMapVert
|
|
-}
|
|
|
|
preloadRender :: IO RenderData
|
|
preloadRender = do
|
|
putStrLn "Number cores available:"
|
|
getNumCapabilities >>= print
|
|
|
|
forM_ [0, 1, 2] $ \i -> do
|
|
putStrLn $ "GL_MAX_COMPUTE_WORK_GROUP_COUNT " ++ show i
|
|
alloca $ \ptr -> do
|
|
glGetIntegeri_v GL_MAX_COMPUTE_WORK_GROUP_COUNT i ptr
|
|
x <- peek ptr
|
|
putStrLn $ show x
|
|
|
|
forM_ [0, 1, 2] $ \i -> do
|
|
putStrLn $ "GL_MAX_COMPUTE_WORK_GROUP_SIZE " ++ show i
|
|
alloca $ \ptr -> do
|
|
glGetIntegeri_v GL_MAX_COMPUTE_WORK_GROUP_SIZE i ptr
|
|
x <- peek ptr
|
|
putStrLn $ show x
|
|
putStrLn $ "GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"
|
|
alloca $ \ptr -> do
|
|
glGetIntegerv GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS ptr
|
|
x <- peek ptr
|
|
putStrLn $ show x
|
|
|
|
-- set up uniform buffer object
|
|
putStrLn "Setup UBO"
|
|
theUBO <- mglCreate glCreateBuffers
|
|
glNamedBufferData theUBO 64 nullPtr GL_STREAM_DRAW
|
|
glBindBufferBase GL_UNIFORM_BUFFER 0 theUBO
|
|
|
|
-- orthonormalUBO <- mglCreate glCreateBuffers
|
|
-- withArray idMat $ \ptr ->
|
|
-- glNamedBufferStorage orthonormalUBO 64 ptr 0
|
|
|
|
lightsubo <- mglCreate glCreateBuffers
|
|
glNamedBufferData lightsubo 640 nullPtr GL_STREAM_DRAW
|
|
glBindBufferBase GL_UNIFORM_BUFFER 1 lightsubo
|
|
|
|
-- setup shape geometry/cap VBO and two VAOs
|
|
putStrLn "Setup shape VBO, VAO, EBO"
|
|
shVBO <- setupVBO nShapeVerxComp
|
|
shPosVAO <- setupVAOUsingVBO [4] shVBO
|
|
shEBO <- setupEBO shPosVAO
|
|
-- note the shape shader vao is distinct from the position vao, but they
|
|
-- share an EBO
|
|
shapeshader <- makeShaderUsingVBO "shape/basic" [vert, frag] shapeVerxSizes pmTriangles shVBO
|
|
glVertexArrayElementBuffer (shapeshader ^. shaderVAO . vaoName) (shEBO ^. eboName)
|
|
|
|
--setup silhouette edge VAO
|
|
putStrLn "Setup silhouette VAO, EBO"
|
|
shedgevao <- setupVAOUsingVBO [4] shVBO
|
|
shedgeebo <- setupEBO shedgevao
|
|
|
|
putStrLn "Setup wall/windows VBO, VAO, EBO, shader"
|
|
let wallverxstrd = 8
|
|
wallvbo <- setupVBO wallverxstrd
|
|
winvbo <- setupVBO 8
|
|
windowshader <- makeShaderUsingVBO "wall/blank" [vert, geom, frag] [4, 4] pmPoints winvbo
|
|
wallshader <- makeShaderUsingVBO "wall/basic" [vert, geom, frag] [4, 4] pmPoints wallvbo
|
|
putStrLn "Setup lighting shaders"
|
|
lightingWallShadShad <-
|
|
makeShaderUsingVBO "lighting/wallShadow" [vert, geom] [4] pmPoints wallvbo
|
|
lightingCapShad <-
|
|
makeShaderUsingVAO "lighting/cap" [vert, geom] pmTriangles shPosVAO
|
|
lightingLineShadowShad <-
|
|
makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shedgevao
|
|
shadowedgeshader <-
|
|
makeShaderUsingVAO "shadow/edge" [vert, geom] pmLinesAdjacency shedgevao
|
|
shadowcapshader <-
|
|
makeShaderUsingVAO "shadow/cap" [vert, geom] pmTriangles shPosVAO
|
|
shadowwallshader <-
|
|
makeShaderUsingVBO "shadow/wallShadow" [vert, geom] [4] pmPoints wallvbo
|
|
shadowlightshader <-
|
|
makeShaderSized
|
|
"shadow/light"
|
|
[vert, geom, frag]
|
|
[1]
|
|
1
|
|
pmPoints
|
|
shadowcombineshader <- makeShaderSized "shadow/combine" [vert, geom, frag] [1] 1 pmPoints
|
|
poke (shadVBOptr shadowlightshader) 1
|
|
|
|
putStrLn "Setup 2D shaders"
|
|
bslist <- makeShaderVBO "dualTwoD/basic" [vert, frag] [3, 4] pmTriangles
|
|
aslist <- makeShaderVBO "dualTwoD/arc" [vert, frag] [3, 4, 3] pmTriangles
|
|
eslist <- makeShaderVBO "dualTwoD/ellipse" [vert, geom, frag] [3, 4] pmTriangles
|
|
cslist <-
|
|
makeShaderVBO "picture/charArray" [vert, frag] [3, 4, 4] pmTriangles
|
|
-- initTexture2DArray 50 "data/texture/charMapVertBig.png" 2 32 64 95 GL_NEAREST_MIPMAP_LINEAR GL_LINEAR
|
|
initTexture2DArray 50 "data/texture/charMapVert16Block.png" 2 16 32 95 GL_NEAREST GL_NEAREST
|
|
--initTexture2DArray 50 "data/texture/charMapVert8Block.png" 2 8 16 95 GL_NEAREST GL_NEAREST
|
|
--initTexture2DArray 50 "data/texture/charMapVertBig.png" 2 32 64 95 GL_LINEAR_MIPMAP_LINEAR GL_LINEAR
|
|
--initTexture2DArray 50 "data/texture/charMapVertBig.png" 2 32 64 95 GL_LINEAR_MIPMAP_NEAREST GL_LINEAR
|
|
|
|
putStrLn "Setup full screen shaders"
|
|
screentexturevbo <- mglCreate glCreateBuffers
|
|
withArray (concat cornerList) $ \ptr ->
|
|
glNamedBufferStorage
|
|
screentexturevbo
|
|
(fromIntegral $ floatSize * length (concat cornerList))
|
|
ptr
|
|
0
|
|
screentexturevao <- setupVAOvbo' [2, 2] 4 screentexturevbo
|
|
alphadivideshader <- makeShaderUsingVAO "texture2D/alphaDivide" [vert, frag] pmTriangleStrip screentexturevao
|
|
fsShad <- makeShaderUsingVAO "texture/simple" [vert, frag] pmTriangleStrip screentexturevao
|
|
bloomBlurShad <- makeShaderUsingVAO "texture/bloomBlur" [vert, frag] pmTriangleStrip screentexturevao
|
|
colorBlurShad <- makeShaderUsingVAO "texture/colorBlur" [vert, frag] pmTriangleStrip screentexturevao
|
|
grayscaleShad <- makeShaderUsingVAO "texture/grayscale" [vert, frag] pmTriangleStrip screentexturevao
|
|
lightingTextureShad <-
|
|
makeShaderUsingVAO "lighting/texture" [vert, frag] pmTriangleStrip screentexturevao
|
|
barrelShad <- makeShaderVBO "texture/barrel" [vert, geom, frag] [2, 2, 2, 1] pmPoints
|
|
-- blank wallShader
|
|
putStrLn "Setup floor VBO, shader"
|
|
let floorverxstrd = 8
|
|
floorvbo <- setupVBOStatic floorverxstrd
|
|
floorshader <- makeShaderUsingVBO "floor/arrayPos" [vert, frag] [4, 4] pmTriangles floorvbo
|
|
initTexture2DArraySquare 40 3 GL_LINEAR_MIPMAP_LINEAR GL_LINEAR "data/normalMaps/diffuseArray.png"
|
|
initTexture2DArraySquare 41 3 GL_LINEAR_MIPMAP_LINEAR GL_LINEAR "data/normalMaps/normalArray.png"
|
|
|
|
putStrLn "Setup cloud VBO, shader"
|
|
let cloudverxsizes = [4, 4, 4, 4]
|
|
cloudvbo <- setupVBO (sum cloudverxsizes)
|
|
(cloudshader, cloudebo) <-
|
|
makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes pmTriangles cloudvbo
|
|
framebuf2 <- newTextureFramebuffer
|
|
framebuf3 <- newTextureFramebuffer
|
|
|
|
putStrLn "Setup framebuffers"
|
|
rboBaseBloomName <- mglCreate glCreateRenderbuffers
|
|
glNamedRenderbufferStorage
|
|
rboBaseBloomName
|
|
GL_DEPTH24_STENCIL8
|
|
800
|
|
600
|
|
|
|
fboBaseName <- setupFramebuffer3GivenStencil rboBaseBloomName
|
|
fboCloudName <- setupFramebuffer3GivenStencil rboBaseBloomName
|
|
fboBloomName <- setupFramebufferGivenStencil rboBaseBloomName
|
|
fboPosName <- setupFramebufferGivenStencil rboBaseBloomName
|
|
fboLightingName <- setupFramebufferGivenStencil rboBaseBloomName
|
|
|
|
fboShadowName <- setupShadowFramebuffer
|
|
|
|
fboHalf1Name <- newTextureFramebuffer
|
|
fboHalf2Name <- newTextureFramebuffer
|
|
fboHalf3Name <- newTextureFramebuffer
|
|
|
|
-- reset to default framebuffer, ready for drawing direct to screen
|
|
glBindFramebuffer GL_FRAMEBUFFER 0
|
|
|
|
shadV <- MV.new 4
|
|
zipWithM_
|
|
(MV.write shadV)
|
|
[0 .. 3]
|
|
[ bslist -- note the ordering is very important
|
|
, cslist
|
|
, aslist
|
|
, eslist
|
|
]
|
|
|
|
-- setup compute shader
|
|
computeshadowshader <- makeSourcedShader "compute/shadow" [GL_COMPUTE_SHADER]
|
|
|
|
initializeGLState
|
|
putStrLn "Return preload"
|
|
return $
|
|
RenderData
|
|
{ _computeShadowShader = computeshadowshader
|
|
, _pictureShaders = shadV
|
|
, _shapeShader = shapeshader -- & shaderVAO' .~ shPosColVAO
|
|
, _shapeEBO = shEBO
|
|
, _silhouetteEBO = shedgeebo
|
|
, _lightingCapShader = lightingCapShad
|
|
, _lightingLineShadowShader = lightingLineShadowShad
|
|
, _lightingWallShadShader = lightingWallShadShad
|
|
, _shadowEdgeShader = shadowedgeshader
|
|
, _shadowCapShader = shadowcapshader
|
|
, _shadowWallShader = shadowwallshader
|
|
, _shadowLightShader = shadowlightshader
|
|
, _shadowCombineShader = shadowcombineshader
|
|
, _windowShader = windowshader
|
|
, _fullscreenShader = fsShad
|
|
, _alphaDivideShader = alphadivideshader
|
|
, _lightingTextureShader = lightingTextureShad
|
|
, _bloomBlurShader = bloomBlurShad
|
|
, _colorBlurShader = colorBlurShad
|
|
, _barrelShader = barrelShad
|
|
, _grayscaleShader = grayscaleShad
|
|
, _fbo2 = framebuf2
|
|
, _fbo3 = framebuf3
|
|
, _fboHalf1 = fboHalf1Name
|
|
, _fboHalf2 = fboHalf2Name
|
|
, _fboHalf3 = fboHalf3Name
|
|
, _fboLighting = fboLightingName
|
|
, _fboShadow = fboShadowName
|
|
, _fboBase = fboBaseName
|
|
, _fboCloud = fboCloudName
|
|
, _fboBloom = fboBloomName
|
|
, _fboPos = fboPosName
|
|
, _rboBaseBloom = rboBaseBloomName
|
|
, _matUBO = theUBO
|
|
, -- , _orthonormalMatUBO = orthonormalUBO
|
|
_lightsUBO = lightsubo
|
|
, _vboWindows = winvbo
|
|
, _vboShapes = shVBO
|
|
, _floorVBO = floorvbo
|
|
, _floorShader = floorshader
|
|
, _wallVBO = wallvbo
|
|
, _wallShader = wallshader
|
|
, _cloudVBO = cloudvbo
|
|
, _cloudShader = cloudshader
|
|
, _cloudEBO = cloudebo
|
|
, _screenTextureVAO = screentexturevao
|
|
}
|
|
|
|
--------------------end preloadRender
|
|
cornerList :: [[Float]]
|
|
cornerList =
|
|
[ [-1, 1, 0, 1]
|
|
, [-1, -1, 0, 0]
|
|
, [1, 1, 1, 1]
|
|
, [1, -1, 1, 0]
|
|
]
|
|
|
|
--cornerListForTriangles :: [[Float]]
|
|
--cornerListForTriangles =
|
|
-- [ [-1, 1, 0, 1]
|
|
-- , [-1, -1, 0, 0]
|
|
-- , [1, 1, 1, 1]
|
|
-- , [-1, -1, 0, 0]
|
|
-- , [1, 1, 1, 1]
|
|
-- , [1, -1, 1, 0]
|
|
-- ]
|
|
|
|
initializeGLState :: IO ()
|
|
initializeGLState = do
|
|
glEnable GL_DEPTH_TEST
|
|
|
|
cleanUpRenderPreload :: RenderData -> IO ()
|
|
cleanUpRenderPreload _ = return ()
|
|
|
|
--cleanUpRenderPreload pd = do
|
|
-- TODO fix this
|
|
--mapM_ freeShaderPointers $ _pictureShaders pd
|
|
--freeShaderPointers' $ _lightingWallShadShader pd
|
|
--freeShaderPointers' $ _fullscreenShader pd
|