263 lines
9.9 KiB
Haskell
263 lines
9.9 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 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
|