41 lines
1.7 KiB
Haskell
41 lines
1.7 KiB
Haskell
module Dodge.WorldLoad (postUniverseLoadSideEffect) where
|
|
|
|
import GLHelp
|
|
import Control.Lens
|
|
import Control.Monad
|
|
import Data.Preload.Render
|
|
import Dodge.Data.Universe
|
|
import Graphics.GL.Core45
|
|
import Shader.Data
|
|
import Shader.Parameters
|
|
import Shader.Poke.Floor
|
|
import Foreign.Marshal
|
|
|
|
postUniverseLoadSideEffect :: Universe -> Universe
|
|
postUniverseLoadSideEffect =
|
|
uvIOEffects %~ (\f uv -> postWorldLoad (uv ^. preloadData . renderData) uv >>= f)
|
|
|
|
postWorldLoad :: RenderData -> Universe -> IO Universe
|
|
postWorldLoad rdata cw = do
|
|
let floorbo = rdata ^. floorVBO . vboName
|
|
floorptr = rdata ^. floorVBO . vboPtr
|
|
chbo = rdata ^. chasmVBO . vboName
|
|
chptr = rdata ^. chasmVBO . vboPtr
|
|
glInvalidateBufferData floorbo
|
|
glInvalidateBufferData chbo
|
|
withArray [floorbo,chbo] $ glDeleteBuffers 2
|
|
[newfloorbo,newchbo] <- glCreate glGenBuffers 2
|
|
nfloorvxs <- foldM (pokeTile floorptr) 0 (cw ^. uvWorld . cWorld . cwTiles)
|
|
glBindBufferBase GL_SHADER_STORAGE_BUFFER 8 newfloorbo
|
|
glNamedBufferStorage newfloorbo (fromIntegral $ 8 * nfloorvxs * floatSize) floorptr 0
|
|
nchasmvxs <- foldM (pokeChasm chptr) 0 (cw ^. uvWorld . cWorld . chasms)
|
|
glBindBufferBase GL_SHADER_STORAGE_BUFFER 7 newchbo
|
|
glNamedBufferStorage newchbo (fromIntegral $ 2 * max 1 nchasmvxs * floatSize) chptr 0
|
|
-- note the max 1, prevents trying to create empty buffer storage
|
|
checkGLError "during postWorldLoad"
|
|
return $
|
|
cw & uvWorld . cWorld . numberFloorVerxs .~ nfloorvxs
|
|
& uvWorld . cWorld . numberChasmVerxs .~ nchasmvxs
|
|
& preloadData . renderData . floorVBO . vboName .~ newfloorbo
|
|
& preloadData . renderData . chasmVBO . vboName .~ newchbo
|