Files
loop/src/Preload/Render.hs
T

291 lines
11 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.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