Files
loop/src/Preload/Render.hs
T
2025-11-21 00:25:50 +00:00

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