--{-# 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 -- 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 , _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