277 lines
10 KiB
Haskell
277 lines
10 KiB
Haskell
--{-# 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 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 <- 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 "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 <- makeSourcedShader "texture/simple" [vert, frag]
|
|
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
|