--{-# LANGUAGE TemplateHaskell #-} --{-# OPTIONS_GHC -Wno-unused-top-binds #-} module Preload.Render (preloadRender) 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 objects 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)) * 4 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 <- makeSourcedShader "pull/window" [vert, frag] wallpull <- makeSourcedShader "pull/wall" [vert, frag] shapeshader <- makeSourcedShader "shape/basic" [vert, frag] cloudshader <- makeSourcedShader "pull/cloud" [vert, frag] putStrLn "Setup lighting shaders" shadwallshader <- makeSourcedShader "lighting/wallShadow" [vert] lightingCapShad <- makeSourcedShader "lighting/cap" [vert] lightingLineShadowShad <- makeSourcedShader "lighting/lineShadow" [vert] ceilingstencilshader <- makeSourcedShader "ceiling/stencil" [vert] putStrLn "Setup 2D shaders" bslist <- makeShaderVBO "picture/basic" [vert, frag] (toFloatVAs [4, 4]) cslist <- makeShaderVBO "picture/charArray" [vert, frag] (toFloatVAs [4, 4, 4]) aslist <- makeShaderVBO "picture/arc" [vert, frag] (toFloatVAs [4, 4, 4]) eslist <- makeShaderVBO "picture/ellipse" [vert, frag] (toFloatVAs [4, 4]) shadV <- MV.new 4 zipWithM_ (MV.write shadV) [0 .. 3] [ bslist -- note the ordering is very important , cslist , aslist , eslist ] zipWithM_ (\i vbo -> glBindBufferBase GL_SHADER_STORAGE_BUFFER i (vbo ^. _2 . vboName)) [10 .. 13] [ 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" alphadivideshader <- makeSourcedShader "texture2D/alphaDivide" [vert, frag] fsShad <- makeSourcedShader "texture/simple" [vert, frag] bloomBlurShad <- makeSourcedShader "texture/bloomBlur" [vert, frag] lightingTextureShad <- makeSourcedShader "lighting/texture" [vert, frag] lightingCloudShad <- makeSourcedShader "lighting/cloud" [vert, frag] distbo <- mglCreate glCreateBuffers let distbosize = sizeOf (0 :: Float) * 8 * 1024 glNamedBufferStorage distbo (fromIntegral distbosize) nullPtr GL_DYNAMIC_STORAGE_BIT glBindBufferBase GL_SHADER_STORAGE_BUFFER 9 distbo distptr <- mallocBytes distbosize let distvbo = VBO distbo distptr (sizeOf (0::Float) * 8) barrelShad <- makeSourcedShader "texture/barrel" [vert,frag] putStrLn "Setup floor VBO, shader" flvbo <- mglCreate glCreateBuffers flptr <- mallocArray (8 * 65536) let floorvbo = VBO flvbo flptr (8 * floatSize) floorshader <- makeSourcedShader "floor/arrayPos" [vert, frag] 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" chvbo <- mglCreate glCreateBuffers chptr <- mallocArray (2 * 65536) let chasmvbo = VBO chvbo chptr (2 * floatSize) chasmshader <- makeSourcedShader "chasm" [vert] 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 withArray [GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2] $ glNamedFramebufferDrawBuffers (fboBaseName ^. _1 . unFBO) 3 fboCloudName <- setupFramebuffer3GivenStencil rboBaseBloomName fbowindow <- setupFramebuffer2GivenStencil rboBaseBloomName withArray [GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1] $ glNamedFramebufferDrawBuffers (fbowindow ^. _1 . unFBO) 2 fboBloomName <- setupFramebufferGivenStencil rboBaseBloomName fboPosName <- setupFramebufferGivenStencil rboBaseBloomName fboLightingName <- setupFramebufferGivenStencil rboBaseBloomName -- framebuf2 <- newTextureFramebuffer 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 , _alphaDivideShader = alphadivideshader , _lightingTextureShader = lightingTextureShad , _lightingCloudShader = lightingCloudShad , _bloomBlurShader = bloomBlurShad , _barrelShader = (barrelShad,distvbo) -- , _fbo2 = framebuf2 , _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 , _dummyVAO = dummyvao } --------------------end preloadRender 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