--{-# 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.AuxAddition import Shader.Compile import Shader.Data import Shader.Parameters import Shape.Parameters --import Shape.Parameters {- 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 -- set up uniform buffer object putStrLn "Setup UBO" theUBO <- mglCreate glCreateBuffers glNamedBufferStorage theUBO 64 nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_UNIFORM_BUFFER 0 theUBO lightubo <- mglCreate glCreateBuffers glNamedBufferStorage lightubo 32 nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_UNIFORM_BUFFER 1 lightubo fulltexbo <- mglCreate glCreateBuffers let ftsize = fromIntegral $ sizeOf (0::Float) * 6 * 4 withArray cornerList' $ \ptr -> glNamedBufferStorage fulltexbo ftsize ptr 0 glBindBufferBase GL_UNIFORM_BUFFER 2 fulltexbo winssbo <- mglCreate glCreateBuffers let winssbosize = sizeOf (0 :: Float) * 8 * 1024 glNamedBufferStorage winssbo (fromIntegral winssbosize) nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_SHADER_STORAGE_BUFFER 1 winssbo winptr <- mallocBytes winssbosize let winvbo = VBO winssbo winptr (sizeOf (0::Float) * 8) let wallsn = 4096 wallssbo <- mglCreate glCreateBuffers let wallssbosize = sizeOf (0 :: Float) * 8 * wallsn glNamedBufferStorage wallssbo (fromIntegral wallssbosize) nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_SHADER_STORAGE_BUFFER 2 wallssbo wallssboptr <- mallocBytes wallssbosize let wallvbo = VBO wallssbo wallssboptr (sizeOf (0::Float) * 8) shapessbo <- mglCreate glCreateBuffers let shapessbosize = fromIntegral shapeVerxSize * 65536 glNamedBufferStorage shapessbo shapessbosize nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_SHADER_STORAGE_BUFFER 3 shapessbo shptr <- mallocArray (8 * 65536) let shVBO = VBO shapessbo shptr shapeVerxSize ishapessbo <- mglCreate glCreateBuffers let ishapessbosize = fromIntegral (sizeOf (0 :: GLuint) * 65536) glNamedBufferStorage ishapessbo ishapessbosize nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_SHADER_STORAGE_BUFFER 4 ishapessbo ishptr <- mallocArray 65536 let shEBO = UintBO ishapessbo ishptr ieshapessbo <- mglCreate glCreateBuffers let ieshapessbosize = fromIntegral (sizeOf (0 :: GLuint) * 65536) glNamedBufferStorage ieshapessbo ieshapessbosize nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_SHADER_STORAGE_BUFFER 5 ieshapessbo ieptr <- mallocArray 65536 -- so we can go back to glushort... cloudbo <- mglCreate glCreateBuffers let cvsize = (sizeOf (0 :: Float)) * 8 cloudbosize = fromIntegral cvsize * 65536 -- this should be changed glNamedBufferStorage cloudbo cloudbosize nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_SHADER_STORAGE_BUFFER 6 cloudbo cloudptr <- mallocBytes (fromIntegral cloudbosize) let cloudvbo = VBO cloudbo cloudptr cvsize dummyvao <- mglCreate glGenVertexArrays winpull <- makeShaderUsingVAO "pull/window" [vert, frag] pmTriangles (VAO dummyvao) wallpull <- makeShaderUsingVAO "pull/wall" [vert, frag] pmTriangles (VAO dummyvao) shapeshader <- makeShaderUsingVAO "shape/basic" [vert, frag] pmTriangles (VAO dummyvao) cloudshader <- makeShaderUsingVAO "pull/cloud" [vert, frag] pmTriangles (VAO dummyvao) putStrLn "Setup lighting shaders" shadwallshader <- makeSourcedShader "lighting/wallShadow" [vert] lightingCapShad <- makeShaderUsingVAO "lighting/cap" [vert] pmTriangles (VAO dummyvao) lightingLineShadowShad <- makeShaderUsingVAO "lighting/lineShadow" [vert] pmTriangles (VAO dummyvao) ceilingstencilshader <- makeShaderUsingVAO "ceiling/stencil" [vert] pmTriangles (VAO dummyvao) putStrLn "Setup 2D shaders" bslist <- makeShaderVBO "dualTwoD/basic" [vert, frag] (toFloatVAs [3, 4]) pmTriangles aslist <- makeShaderVBO "dualTwoD/arc" [vert, frag] (toFloatVAs [3, 4, 3]) pmTriangles eslist <- makeShaderVBO "dualTwoD/ellipse" [vert, geom, frag] (toFloatVAs [3, 4]) pmTriangles cslist <- makeShaderVBO "picture/charArray" [vert, frag] (toFloatVAs [3, 4, 4]) pmTriangles shadV <- MV.new 4 zipWithM_ (MV.write shadV) [0 .. 3] [ bslist -- note the ordering is very important , cslist , aslist , eslist ] -- GL_NEAREST_MIPMAP_LINEAR GL_LINEAR ? initTexture2DArray 50 "data/charMaps/cMap16x32.Custom.png" 2 16 32 256 GL_NEAREST GL_NEAREST putStrLn "Setup full screen shaders" (_, screentexturevao) <- setupStaticVBOVAO (toFloatVAs [2, 2]) (concat cornerList) alphadivideshader <- makeShaderUsingVAO "texture2D/alphaDivide" [vert, frag] pmTriangleStrip screentexturevao fsShad <- makeShaderUsingVAO "texture/simple" [vert, frag] pmTriangleStrip screentexturevao transcompshader <- makeShaderUsingVAO "fullscreen/transparencyComp" [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] (toFloatVAs [2, 2, 2, 1]) pmPoints -- blank wallShader putStrLn "Setup floor VBO, shader" let floorverxstrd = 8 floorvbo <- setupVBOStatic (floatSize * floorverxstrd) floorshader <- makeShaderUsingVBO "floor/arrayPos" [vert, frag] (toFloatVAs [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 chasm VBO, shader" let chasmverxstrd = 3 chasmvbo <- setupVBOStatic (floatSize * chasmverxstrd) chasmshader <- makeShaderUsingVBO "positional/blank" [vert, frag] (toFloatVAs [3]) pmTriangles chasmvbo -- putStrLn "Setup cloud VBO, shader" -- let cloudverxsizes = [4, 4, 4] -- cloudvbo <- setupVBO (floatSize * sum cloudverxsizes) -- (cloudshader, cloudebo) <- -- makeShaderEBO "cloud/basic" [vert, frag] (toFloatVAs cloudverxsizes) pmTriangles cloudvbo framebuf2 <- newTextureFramebuffer framebuf3 <- newTextureFramebuffer putStrLn "Setup framebuffers" rboBaseBloomName <- mglCreate glCreateRenderbuffers glNamedRenderbufferStorage rboBaseBloomName GL_DEPTH24_STENCIL8 800 600 -- if adding to this list, recall you need to sizeFBOs fboBaseName <- setupFramebuffer3GivenStencil rboBaseBloomName fboCloudName <- setupFramebuffer3GivenStencil rboBaseBloomName fbowindow <- setupFramebuffer2GivenStencil rboBaseBloomName fboBloomName <- setupFramebufferGivenStencil rboBaseBloomName fboPosName <- setupFramebufferGivenStencil rboBaseBloomName fboLightingName <- setupFramebufferGivenStencil rboBaseBloomName fboHalf1Name <- newTextureFramebuffer fboHalf2Name <- newTextureFramebuffer -- reset to default framebuffer, ready for drawing direct to screen glBindFramebuffer GL_FRAMEBUFFER 0 initializeGLState putStrLn "Return preload" return $ RenderData { _pictureShaders = shadV , _shapeShader = shapeshader -- & shaderVAO' .~ shPosColVAO , _shapeEBO = shEBO , _silhouetteEBO = UintBO ieshapessbo ieptr , _lightingCapShader = lightingCapShad , _lightingLineShadowShader = lightingLineShadowShad , _shadWallShader = shadwallshader , _ceilingStencilShader = ceilingstencilshader , _windowPullShader = winpull , _pullWallShader = wallpull , _fullscreenShader = fsShad , _transparencyCompShader = transcompshader , _alphaDivideShader = alphadivideshader , _lightingTextureShader = lightingTextureShad , _bloomBlurShader = bloomBlurShad , _colorBlurShader = colorBlurShad , _barrelShader = barrelShad , _grayscaleShader = grayscaleShad , _fbo2 = framebuf2 , _fbo3 = framebuf3 , _fboHalf1 = fboHalf1Name , _fboHalf2 = fboHalf2Name , _fboLighting = fboLightingName , _fboBase = fboBaseName , _fboWindow = fbowindow , _fboCloud = fboCloudName , _fboBloom = fboBloomName , _fboPos = fboPosName , _rboBaseBloom = rboBaseBloomName , _matUBO = theUBO , _lightUBO = lightubo , _vboShapes = shVBO , _floorVBO = floorvbo , _floorShader = floorshader , _chasmVBO = chasmvbo , _chasmShader = chasmshader , _wallVBO = wallvbo , _winVBO = winvbo , _cloudVBO = cloudvbo , _cloudShader = cloudshader , _screenTextureVAO = screentexturevao , _dummyVAO = VAO dummyvao } --------------------end preloadRender cornerList :: [[Float]] cornerList = [ [-1, 1, 0, 1] , [-1, -1, 0, 0] , [1, 1, 1, 1] , [1, -1, 1, 0] ] cornerList' :: [Float] cornerList' = concat [ bl, br, tl , tl, br, tr ] where bl = [-1, -1, 0, 0] br = [ 1, -1, 1, 0] tl = [-1, 1, 0, 1] tr = [ 1, 1, 1, 1] --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 glEnable GL_STENCIL_TEST --cleanUpRenderPreload :: RenderData -> IO () --cleanUpRenderPreload _ = return () --cleanUpRenderPreload pd = do -- TODO fix this --mapM_ freeShaderPointers $ _pictureShaders pd --freeShaderPointers' $ _lightingWallShadShader pd --freeShaderPointers' $ _fullscreenShader pd