--{-# LANGUAGE TemplateHaskell #-} --{-# OPTIONS_GHC -Wno-unused-top-binds #-} module Preload.Render ( preloadRender, cleanUpRenderPreload, ) where import Shader.AuxAddition import Shape.Data import Geometry.Data import MatrixHelper import GLHelp import Control.Lens import Control.Monad import Data.Preload.Render import qualified Data.Vector.Mutable as MV import Foreign import Framebuffer.Setup import Shader import Shader.Compile import Shader.Data import Shader.Parameters import Graphics.GL.Core45 {- BINDING LIST: 0 base 40 texture array diffuse 41 texture array normals 50 charMapVert -} preloadRender :: IO RenderData preloadRender = do -- set up uniform buffer object theUBO <- mglCreate glCreateBuffers glNamedBufferData theUBO 64 nullPtr GL_STREAM_DRAW glBindBufferBase GL_UNIFORM_BUFFER 0 theUBO orthonormalUBO <- mglCreate glCreateBuffers withArray (isoMatrix 0 1 (V2 0 0) (V2 2 2)) $ \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 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 shedgevao <- setupVAOUsingVBO [4] shVBO shedgeebo <- setupEBO shedgevao let wallverxstrd = 8 wallvbo <- setupVBO wallverxstrd 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 -- 2D draw 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 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 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 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" let cloudverxsizes = [4,4,4,4] cloudvbo <- setupVBO (sum cloudverxsizes) (cloudshader, cloudebo) <- makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes pmTriangles cloudvbo framebuf2 <- setupTextureFramebuffer 800 600 framebuf3 <- setupTextureFramebuffer 800 600 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 <- setupTextureFramebuffer 300 300 fboHalf2Name <- setupTextureFramebuffer 300 300 fboHalf3Name <- setupTextureFramebuffer 300 300 -- 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 ] initializeGLState return $ RenderData { _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