Performance improvements, combine cap and geometry buffer
This commit is contained in:
@@ -32,6 +32,7 @@ import Sound.Data
|
|||||||
import qualified DoubleStack as DS
|
import qualified DoubleStack as DS
|
||||||
import Dodge.GameRoom
|
import Dodge.GameRoom
|
||||||
import Color
|
import Color
|
||||||
|
import Shape
|
||||||
|
|
||||||
import GHC.Generics
|
import GHC.Generics
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
@@ -74,6 +75,7 @@ data World = World
|
|||||||
, _sounds :: M.Map SoundOrigin Sound
|
, _sounds :: M.Map SoundOrigin Sound
|
||||||
, _playingSounds :: M.Map SoundOrigin Sound
|
, _playingSounds :: M.Map SoundOrigin Sound
|
||||||
, _decorations :: IM.IntMap Picture
|
, _decorations :: IM.IntMap Picture
|
||||||
|
, _foregroundShape :: Shape
|
||||||
, _foregroundDecorations :: [Polyhedra]
|
, _foregroundDecorations :: [Polyhedra]
|
||||||
, _foregroundEdgeVerx :: [Point3]
|
, _foregroundEdgeVerx :: [Point3]
|
||||||
, _corpses :: Zone [Corpse]
|
, _corpses :: Zone [Corpse]
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ defaultWorld = World
|
|||||||
, _debugFlags = defaultDebugFlags
|
, _debugFlags = defaultDebugFlags
|
||||||
, _inventoryMode = TopInventory
|
, _inventoryMode = TopInventory
|
||||||
, _lClickHammer = HammerUp
|
, _lClickHammer = HammerUp
|
||||||
|
, _foregroundShape = mempty
|
||||||
, _foregroundDecorations = []
|
, _foregroundDecorations = []
|
||||||
, _foregroundEdgeVerx = []
|
, _foregroundEdgeVerx = []
|
||||||
, _radDistortion = []
|
, _radDistortion = []
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import Picture.Data
|
|||||||
import Tile
|
import Tile
|
||||||
import Polyhedra
|
import Polyhedra
|
||||||
import Polyhedra.Data
|
import Polyhedra.Data
|
||||||
|
import Shape
|
||||||
|
|
||||||
import Control.Monad.State
|
import Control.Monad.State
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
@@ -78,6 +79,11 @@ setupWorldBounds w = w
|
|||||||
|
|
||||||
setupForegroundEdgeVerxs :: World -> World
|
setupForegroundEdgeVerxs :: World -> World
|
||||||
setupForegroundEdgeVerxs w = w & foregroundEdgeVerx .~ polyhedrasToEdges (_foregroundDecorations w)
|
setupForegroundEdgeVerxs w = w & foregroundEdgeVerx .~ polyhedrasToEdges (_foregroundDecorations w)
|
||||||
|
& foregroundShape .~ Shape vs es
|
||||||
|
where
|
||||||
|
vs = shVfromList $ concatMap (polyToTris . map toShape) $ concatMap _pyFaces $ _foregroundDecorations w
|
||||||
|
es = shEfromList $ polyhedrasToEdges (_foregroundDecorations w)
|
||||||
|
toShape (p3,p4) = ShapeV p3 p4
|
||||||
|
|
||||||
polyhedrasToEdges :: [Polyhedra] -> [Point3]
|
polyhedrasToEdges :: [Polyhedra] -> [Point3]
|
||||||
polyhedrasToEdges = concatMap tflat4 . concatMap polyToEdges
|
polyhedrasToEdges = concatMap tflat4 . concatMap polyToEdges
|
||||||
|
|||||||
+9
-10
@@ -59,17 +59,19 @@ doDrawing pdata w = do
|
|||||||
nSils <- pokePoint3s (shadVBOptr $ _lightingLineShadowShader pdata)
|
nSils <- pokePoint3s (shadVBOptr $ _lightingLineShadowShader pdata)
|
||||||
$ VS.fromList
|
$ VS.fromList
|
||||||
$ (shEList $ worldShape w)
|
$ (shEList $ worldShape w)
|
||||||
++ (_foregroundEdgeVerx w)
|
-- -- poke foreground geometry for caps
|
||||||
-- poke foreground geometry for caps
|
-- nCaps <- pokePoint3s (shadVBOptr $ _lightingCapShader pdata)
|
||||||
nCaps <- pokePoint3s (shadVBOptr $ _lightingCapShader pdata)
|
-- $ VS.fromList
|
||||||
$ VS.fromList
|
-- (fmap _svPos (shVList $ worldShape w))
|
||||||
$ concatMap polyToGeoRender (foregroundPics w)
|
numShapeVs <- pokeShapeVs (_vboPtr $ _vaoVBO $ _shadVAO $ _shapeShader pdata)
|
||||||
++ (fmap _svPos (shVList $ worldShape w))
|
$ VS.fromList $ shVList $ worldShape w
|
||||||
|
let nCaps = numShapeVs
|
||||||
-- bind wall points, silhouette data, surface geometry
|
-- bind wall points, silhouette data, surface geometry
|
||||||
uncurry bindShaderBuffers $ unzip
|
uncurry bindShaderBuffers $ unzip
|
||||||
[ ( _wallTextureShader pdata, nWalls)
|
[ ( _wallTextureShader pdata, nWalls)
|
||||||
, (_lightingLineShadowShader pdata, nSils)
|
, (_lightingLineShadowShader pdata, nSils)
|
||||||
, (_lightingCapShader pdata, nCaps)
|
-- , (_lightingCapShader pdata, nCaps)
|
||||||
|
, (_shapeShader pdata, numShapeVs)
|
||||||
]
|
]
|
||||||
-- set the coordinate uniform ready for drawing elements using world coordinates
|
-- set the coordinate uniform ready for drawing elements using world coordinates
|
||||||
bufferUBO $ perspectiveMatrixb rot camzoom trans wins viewFroms
|
bufferUBO $ perspectiveMatrixb rot camzoom trans wins viewFroms
|
||||||
@@ -93,9 +95,6 @@ doDrawing pdata w = do
|
|||||||
pokeBindFoldableLayer shadV layerCounts $ worldPictures w
|
pokeBindFoldableLayer shadV layerCounts $ worldPictures w
|
||||||
renderLayer 0 shadV layerCounts
|
renderLayer 0 shadV layerCounts
|
||||||
|
|
||||||
numShapeVs <- pokeShapeVs (_vboPtr $ _vaoVBO $ _shadVAO $ _shapeShader pdata)
|
|
||||||
$ VS.fromList $ shVList $ worldShape w
|
|
||||||
bindShaderBuffers [_shapeShader pdata] [numShapeVs]
|
|
||||||
drawShader (_shapeShader pdata) numShapeVs
|
drawShader (_shapeShader pdata) numShapeVs
|
||||||
|
|
||||||
--draw floor onto base buffer
|
--draw floor onto base buffer
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ import Dodge.Base.Window
|
|||||||
|
|
||||||
import qualified Data.IntMap as IM
|
import qualified Data.IntMap as IM
|
||||||
worldShape :: World -> Shape
|
worldShape :: World -> Shape
|
||||||
worldShape w = mconcat (map (crShape w) (IM.elems $ IM.filter crIsClose (_creatures w)))
|
worldShape w = _foregroundShape w
|
||||||
|
<> mconcat (map (crShape w) (IM.elems $ IM.filter crIsClose (_creatures w)))
|
||||||
where
|
where
|
||||||
crIsClose cr = dist (_crPos cr) camCen < winSize
|
crIsClose cr = dist (_crPos cr) camCen < winSize
|
||||||
winSize = 30 + max (getWindowX w) (getWindowY w)
|
winSize = 30 + max (getWindowX w) (getWindowY w)
|
||||||
|
|||||||
+23
-7
@@ -66,6 +66,27 @@ preloadRender = do
|
|||||||
setupVertexAttribPointer 0 4 8 0
|
setupVertexAttribPointer 0 4 8 0
|
||||||
setupVertexAttribPointer 1 4 8 4
|
setupVertexAttribPointer 1 4 8 4
|
||||||
let winColVAO = VAO {_vao = winColVAOname, _vaoVBO = winVBO}
|
let winColVAO = VAO {_vao = winColVAOname, _vaoVBO = winVBO}
|
||||||
|
-- setup shape geometry/cap VBO and two VAOs
|
||||||
|
shVBOname <- genObjectName
|
||||||
|
shVBOptr <- mallocArray (7 * numDrawableElements)
|
||||||
|
bindBuffer ArrayBuffer $= Just shVBOname
|
||||||
|
bufferData ArrayBuffer $=
|
||||||
|
( fromIntegral $ floatSize * numDrawableElements * 7
|
||||||
|
, nullPtr
|
||||||
|
, DynamicDraw
|
||||||
|
)
|
||||||
|
let shVBO = VBO {_vbo = shVBOname, _vboPtr = shVBOptr, _vboAttribSizes = [4,4], _vboStride = 8}
|
||||||
|
shPosColVAOname <- genObjectName
|
||||||
|
bindVertexArrayObject $= Just shPosColVAOname
|
||||||
|
bindBuffer ArrayBuffer $= Just shVBOname
|
||||||
|
setupVertexAttribPointer 0 3 7 0
|
||||||
|
setupVertexAttribPointer 1 4 7 3
|
||||||
|
shPosVAOname <- genObjectName
|
||||||
|
bindVertexArrayObject $= Just shPosVAOname
|
||||||
|
bindBuffer ArrayBuffer $= Just shVBOname
|
||||||
|
setupVertexAttribPointer 0 3 7 0
|
||||||
|
let shPosColVAO = VAO { _vao = shPosColVAOname, _vaoVBO = shVBO }
|
||||||
|
shPosVAO = VAO { _vao = shPosVAOname, _vaoVBO = shVBO }
|
||||||
-- lighting shaders
|
-- lighting shaders
|
||||||
wsShad <- makeShader "lighting/occlude" [vert,geom,frag] [4] EPoints
|
wsShad <- makeShader "lighting/occlude" [vert,geom,frag] [4] EPoints
|
||||||
>>= addUniforms ["lightPos"]
|
>>= addUniforms ["lightPos"]
|
||||||
@@ -113,11 +134,6 @@ preloadRender = do
|
|||||||
framebuf2 <- setupTextureFramebuffer 800 600
|
framebuf2 <- setupTextureFramebuffer 800 600
|
||||||
framebuf3 <- setupTextureFramebuffer 800 600
|
framebuf3 <- setupTextureFramebuffer 800 600
|
||||||
|
|
||||||
--rboLightingName <- genObjectName
|
|
||||||
--bindRenderbuffer Renderbuffer $= rboLightingName
|
|
||||||
--renderbufferStorage Renderbuffer Depth24Stencil8 (RenderbufferSize 800 600)
|
|
||||||
--fboLightingName <- setupFramebufferGivenStencil rboLightingName
|
|
||||||
|
|
||||||
rboBaseBloomName <- genObjectName
|
rboBaseBloomName <- genObjectName
|
||||||
bindRenderbuffer Renderbuffer $= rboBaseBloomName
|
bindRenderbuffer Renderbuffer $= rboBaseBloomName
|
||||||
renderbufferStorage Renderbuffer Depth24Stencil8 (RenderbufferSize 800 600)
|
renderbufferStorage Renderbuffer Depth24Stencil8 (RenderbufferSize 800 600)
|
||||||
@@ -152,8 +168,8 @@ preloadRender = do
|
|||||||
|
|
||||||
return $ RenderData
|
return $ RenderData
|
||||||
{ _pictureShaders = shadV
|
{ _pictureShaders = shadV
|
||||||
, _shapeShader = bslista
|
, _shapeShader = bslista {_shadVAO = shPosColVAO }
|
||||||
, _lightingCapShader = lightingCapShad
|
, _lightingCapShader = lightingCapShad { _shadVAO = shPosVAO }
|
||||||
, _lightingLineShadowShader = lightingLineShadowShad
|
, _lightingLineShadowShader = lightingLineShadowShad
|
||||||
, _lightingOccludeShader = wsShad {_shadVAO = wpVAO}
|
, _lightingOccludeShader = wsShad {_shadVAO = wpVAO}
|
||||||
, _wallBlankShader = wlBlank { _shadVAO = wpColVAO }
|
, _wallBlankShader = wlBlank { _shadVAO = wpColVAO }
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
--{-# LANGUAGE TupleSections #-}
|
--{-# LANGUAGE TupleSections #-}
|
||||||
{-# LANGUAGE BangPatterns #-}
|
--{-# LANGUAGE BangPatterns #-}
|
||||||
module Shader.Poke
|
module Shader.Poke
|
||||||
( pokeVerxs
|
( pokeVerxs
|
||||||
, pokeLayVerxs
|
, pokeLayVerxs
|
||||||
@@ -21,7 +21,7 @@ import qualified Data.Vector.Unboxed.Mutable as UMV
|
|||||||
import qualified Data.Vector.Mutable as MV
|
import qualified Data.Vector.Mutable as MV
|
||||||
import qualified Data.Vector.Fusion.Stream.Monadic as VS
|
import qualified Data.Vector.Fusion.Stream.Monadic as VS
|
||||||
import Control.Monad.Primitive
|
import Control.Monad.Primitive
|
||||||
import qualified Data.DList as DL
|
--import qualified Data.DList as DL
|
||||||
|
|
||||||
pokeVerxs
|
pokeVerxs
|
||||||
:: MV.MVector (PrimState IO) FullShader
|
:: MV.MVector (PrimState IO) FullShader
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
{-# OPTIONS_GHC -Wno-missing-signatures #-}
|
||||||
{-# LANGUAGE StrictData #-}
|
{-# LANGUAGE StrictData #-}
|
||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
module Shape.Data
|
module Shape.Data
|
||||||
@@ -18,8 +19,10 @@ instance Semigroup Shape where
|
|||||||
instance Monoid Shape where
|
instance Monoid Shape where
|
||||||
mempty = Shape mempty mempty
|
mempty = Shape mempty mempty
|
||||||
|
|
||||||
|
shVList :: Shape -> [ShapeV]
|
||||||
{-# INLINE shVList #-}
|
{-# INLINE shVList #-}
|
||||||
shVList = DL.toList . _shVertices
|
shVList = DL.toList . _shVertices
|
||||||
|
shEList :: Shape -> [Point3]
|
||||||
{-# INLINE shEList #-}
|
{-# INLINE shEList #-}
|
||||||
shEList = DL.toList . _shEdges
|
shEList = DL.toList . _shEdges
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user