added shadow-map
- added shadow-map - compiles and smap gets initialized/generated - generation ist stil incorrect (cam, light-dir, ...)
This commit is contained in:
parent
8dea8d1ed9
commit
8bd8db922e
@ -304,6 +304,7 @@ adjustWindow = do
|
|||||||
|
|
||||||
let hudtexid = state ^. gl.glHud.hudTexture
|
let hudtexid = state ^. gl.glHud.hudTexture
|
||||||
maptexid = state ^. gl.glMap.renderedMapTexture
|
maptexid = state ^. gl.glMap.renderedMapTexture
|
||||||
|
smaptexid = state ^. gl.glMap.shadowMapTexture
|
||||||
allocaBytes (fbWidth*fbHeight*4) $ \ptr -> do
|
allocaBytes (fbWidth*fbHeight*4) $ \ptr -> do
|
||||||
--default to ugly pink to see if
|
--default to ugly pink to see if
|
||||||
--somethings go wrong.
|
--somethings go wrong.
|
||||||
@ -320,6 +321,13 @@ adjustWindow = do
|
|||||||
textureFilter Texture2D GL.$= ((Linear', Nothing), Linear')
|
textureFilter Texture2D GL.$= ((Linear', Nothing), Linear')
|
||||||
texImage2D Texture2D GL.NoProxy 0 RGBA8 (GL.TextureSize2D fbCWidth fbCHeight) 0
|
texImage2D Texture2D GL.NoProxy 0 RGBA8 (GL.TextureSize2D fbCWidth fbCHeight) 0
|
||||||
(GL.PixelData GL.RGBA GL.UnsignedByte ptr)
|
(GL.PixelData GL.RGBA GL.UnsignedByte ptr)
|
||||||
|
allocaBytes (2048*2048) $ \ptr -> do
|
||||||
|
let smapdata = genColorData (2048*2048) [0]
|
||||||
|
pokeArray ptr smapdata
|
||||||
|
textureBinding Texture2D GL.$= Just smaptexid
|
||||||
|
textureFilter Texture2D GL.$= ((Nearest,Nothing), Nearest)
|
||||||
|
texImage2D Texture2D GL.NoProxy 0 GL.DepthComponent16 (GL.TextureSize2D 2048 2048) 0
|
||||||
|
(GL.PixelData GL.DepthComponent GL.UnsignedByte ptr)
|
||||||
checkError "setting up HUD-Tex"
|
checkError "setting up HUD-Tex"
|
||||||
return renderBuffer
|
return renderBuffer
|
||||||
modify $ gl.glRenderbuffer .~ rb
|
modify $ gl.glRenderbuffer .~ rb
|
||||||
|
@ -120,6 +120,8 @@ initMapShader tessFac (buf, vertDes) = do
|
|||||||
|
|
||||||
texts <- genObjectNames 6
|
texts <- genObjectNames 6
|
||||||
|
|
||||||
|
smap <- genObjectName
|
||||||
|
|
||||||
testobj <- parseIQM "sample.iqm"
|
testobj <- parseIQM "sample.iqm"
|
||||||
|
|
||||||
let
|
let
|
||||||
@ -154,6 +156,7 @@ initMapShader tessFac (buf, vertDes) = do
|
|||||||
, _mapVert = vertDes
|
, _mapVert = vertDes
|
||||||
, _overviewTexture = overTex
|
, _overviewTexture = overTex
|
||||||
, _mapTextures = texts
|
, _mapTextures = texts
|
||||||
|
, _shadowMapTexture = smap
|
||||||
, _mapObjects = objs
|
, _mapObjects = objs
|
||||||
, _objectProgram = objProgram
|
, _objectProgram = objProgram
|
||||||
}
|
}
|
||||||
@ -190,7 +193,7 @@ initHud = do
|
|||||||
att <- get (activeAttribs program)
|
att <- get (activeAttribs program)
|
||||||
|
|
||||||
putStrLn $ unlines $ "Attributes: ":map show att
|
putStrLn $ unlines $ "Attributes: ":map show att
|
||||||
putStrLn $ unlines $ ["Indices: ", show (texIndex)]
|
putStrLn $ unlines $ ["Indices: ", show texIndex]
|
||||||
|
|
||||||
checkError "initHud"
|
checkError "initHud"
|
||||||
return GLHud
|
return GLHud
|
||||||
@ -299,38 +302,123 @@ renderObject :: MapObject -> IO ()
|
|||||||
renderObject (MapObject model pos@(L.V3 x y z) _{-state-}) =
|
renderObject (MapObject model pos@(L.V3 x y z) _{-state-}) =
|
||||||
renderIQM model pos (L.V3 1 1 1)
|
renderIQM model pos (L.V3 1 1 1)
|
||||||
|
|
||||||
|
drawMap :: Pioneers ()
|
||||||
|
drawMap = do
|
||||||
|
state <- RWS.get
|
||||||
|
let
|
||||||
|
vi = state ^. gl.glMap.shdrVertexIndex
|
||||||
|
ni = state ^. gl.glMap.shdrNormalIndex
|
||||||
|
ci = state ^. gl.glMap.shdrColorIndex
|
||||||
|
numVert = state ^. gl.glMap.mapVert
|
||||||
|
map' = state ^. gl.glMap.stateMap
|
||||||
|
tessFac = state ^. gl.glMap.stateTessellationFactor
|
||||||
|
(UniformLocation tli) = state ^. gl.glMap.shdrTessInnerIndex
|
||||||
|
(UniformLocation tlo) = state ^. gl.glMap.shdrTessOuterIndex
|
||||||
|
liftIO $ do
|
||||||
|
glUniform1f tli (fromIntegral tessFac)
|
||||||
|
glUniform1f tlo (fromIntegral tessFac)
|
||||||
|
|
||||||
|
bindBuffer ArrayBuffer $= Just map'
|
||||||
|
vertexAttribPointer ci $= fgColorIndex
|
||||||
|
vertexAttribArray ci $= Enabled
|
||||||
|
vertexAttribPointer ni $= fgNormalIndex
|
||||||
|
vertexAttribArray ni $= Enabled
|
||||||
|
vertexAttribPointer vi $= fgVertexIndex
|
||||||
|
vertexAttribArray vi $= Enabled
|
||||||
|
checkError "beforeDraw"
|
||||||
|
|
||||||
|
glPatchParameteri gl_PATCH_VERTICES 3
|
||||||
|
|
||||||
|
cullFace $= Just Front
|
||||||
|
|
||||||
|
glDrawArrays gl_PATCHES 0 (fromIntegral numVert)
|
||||||
|
|
||||||
|
checkError "draw map"
|
||||||
|
|
||||||
|
---- RENDER MAPOBJECTS --------------------------------------------
|
||||||
|
|
||||||
|
currentProgram $= Just (state ^. gl.glMap.objectProgram)
|
||||||
|
|
||||||
|
mapM_ renderObject (state ^. gl.glMap.mapObjects)
|
||||||
|
|
||||||
|
-- set sample 1 as target in renderbuffer
|
||||||
|
{-framebufferRenderbuffer
|
||||||
|
DrawFramebuffer --write-only
|
||||||
|
(ColorAttachment 1) --sample 1
|
||||||
|
Renderbuffer --const
|
||||||
|
rb --buffer-}
|
||||||
|
|
||||||
render :: Pioneers ()
|
render :: Pioneers ()
|
||||||
render = do
|
render = do
|
||||||
state <- RWS.get
|
state <- RWS.get
|
||||||
let xa = state ^. camera.xAngle
|
let xa = state ^. camera.xAngle
|
||||||
ya = state ^. camera.yAngle
|
ya = state ^. camera.yAngle
|
||||||
(UniformLocation proj) = state ^. gl.glMap.shdrProjMatIndex
|
|
||||||
(UniformLocation nmat) = state ^. gl.glMap.shdrNormalMatIndex
|
|
||||||
(UniformLocation vmat) = state ^. gl.glMap.shdrViewMatIndex
|
|
||||||
(UniformLocation tli) = state ^. gl.glMap.shdrTessInnerIndex
|
|
||||||
(UniformLocation tlo) = state ^. gl.glMap.shdrTessOuterIndex
|
|
||||||
vi = state ^. gl.glMap.shdrVertexIndex
|
|
||||||
ni = state ^. gl.glMap.shdrNormalIndex
|
|
||||||
ci = state ^. gl.glMap.shdrColorIndex
|
|
||||||
numVert = state ^. gl.glMap.mapVert
|
|
||||||
map' = state ^. gl.glMap.stateMap
|
|
||||||
frust = state ^. camera.Types.frustum
|
frust = state ^. camera.Types.frustum
|
||||||
camPos = state ^. camera.camObject
|
camPos = state ^. camera.camObject
|
||||||
zDist' = state ^. camera.zDist
|
zDist' = state ^. camera.zDist
|
||||||
tessFac = state ^. gl.glMap.stateTessellationFactor
|
(UniformLocation proj) = state ^. gl.glMap.shdrProjMatIndex
|
||||||
|
(UniformLocation nmat) = state ^. gl.glMap.shdrNormalMatIndex
|
||||||
|
(UniformLocation vmat) = state ^. gl.glMap.shdrViewMatIndex
|
||||||
liftIO $ do
|
liftIO $ do
|
||||||
---- RENDER MAP IN TEXTURE ------------------------------------------
|
---- RENDER MAP IN TEXTURE ------------------------------------------
|
||||||
|
|
||||||
bindFramebuffer Framebuffer $= (state ^. gl.glFramebuffer)
|
bindFramebuffer Framebuffer $= (state ^. gl.glFramebuffer)
|
||||||
bindRenderbuffer Renderbuffer $= (state ^. gl.glRenderbuffer)
|
{-bindRenderbuffer Renderbuffer $= (state ^. gl.glRenderbuffer)
|
||||||
framebufferRenderbuffer
|
framebufferRenderbuffer
|
||||||
Framebuffer
|
Framebuffer
|
||||||
DepthAttachment
|
DepthAttachment
|
||||||
Renderbuffer
|
Renderbuffer
|
||||||
(state ^. gl.glRenderbuffer)
|
(state ^. gl.glRenderbuffer)-}
|
||||||
textureBinding Texture2D $= Just (state ^. gl.glMap.renderedMapTexture)
|
|
||||||
|
|
||||||
|
-- SHADOWMAP
|
||||||
|
textureBinding Texture2D $= Just (state ^. gl.glMap.shadowMapTexture)
|
||||||
|
framebufferTexture2D
|
||||||
|
Framebuffer
|
||||||
|
DepthAttachment
|
||||||
|
Texture2D
|
||||||
|
(state ^. gl.glMap.shadowMapTexture)
|
||||||
|
0
|
||||||
|
|
||||||
|
drawBuffer $= NoBuffers --color-buffer is not needed but must(?) be set up
|
||||||
|
checkError "setup Render-Target"
|
||||||
|
|
||||||
|
clear [DepthBuffer]
|
||||||
|
checkError "clearing shadowmap-buffer"
|
||||||
|
|
||||||
|
--TODO: simplified program for shadows?
|
||||||
|
currentProgram $= Just (state ^. gl.glMap.mapProgram)
|
||||||
|
checkError "setting up shadowmap-program"
|
||||||
|
|
||||||
|
--set up projection (= copy from state)
|
||||||
|
--TODO: Fix
|
||||||
|
with (distribute frust) $ \ptr ->
|
||||||
|
glUniformMatrix4fv proj 1 0 (castPtr (ptr :: Ptr (L.M44 CFloat)))
|
||||||
|
checkError "copy shadowmap-projection"
|
||||||
|
|
||||||
|
--set up camera
|
||||||
|
--TODO: Fix
|
||||||
|
let ! cam = getCam camPos zDist' xa ya
|
||||||
|
with (distribute cam) $ \ptr ->
|
||||||
|
glUniformMatrix4fv vmat 1 0 (castPtr (ptr :: Ptr (L.M44 CFloat)))
|
||||||
|
checkError "copy shadowmap-cam"
|
||||||
|
|
||||||
|
--set up normal--Mat transpose((model*camera)^-1)
|
||||||
|
--needed?
|
||||||
|
let normal' = (case L.inv33 (fmap (^. L._xyz) cam ^. L._xyz) of
|
||||||
|
(Just a) -> a
|
||||||
|
Nothing -> L.eye3) :: L.M33 CFloat
|
||||||
|
nmap = collect id normal' :: L.M33 CFloat --transpose...
|
||||||
|
|
||||||
|
with (distribute nmap) $ \ptr ->
|
||||||
|
glUniformMatrix3fv nmat 1 0 (castPtr (ptr :: Ptr (L.M33 CFloat)))
|
||||||
|
|
||||||
|
checkError "nmat"
|
||||||
|
drawMap
|
||||||
|
liftIO $ do
|
||||||
|
checkError "draw ShadowMap"
|
||||||
|
|
||||||
|
-- COLORMAP
|
||||||
|
textureBinding Texture2D $= Just (state ^. gl.glMap.renderedMapTexture)
|
||||||
framebufferTexture2D
|
framebufferTexture2D
|
||||||
Framebuffer
|
Framebuffer
|
||||||
(ColorAttachment 0)
|
(ColorAttachment 0)
|
||||||
@ -371,38 +459,8 @@ render = do
|
|||||||
|
|
||||||
checkError "nmat"
|
checkError "nmat"
|
||||||
|
|
||||||
glUniform1f tli (fromIntegral tessFac)
|
drawMap --draw map -> put to another function for readability
|
||||||
glUniform1f tlo (fromIntegral tessFac)
|
liftIO $ do
|
||||||
|
|
||||||
bindBuffer ArrayBuffer $= Just map'
|
|
||||||
vertexAttribPointer ci $= fgColorIndex
|
|
||||||
vertexAttribArray ci $= Enabled
|
|
||||||
vertexAttribPointer ni $= fgNormalIndex
|
|
||||||
vertexAttribArray ni $= Enabled
|
|
||||||
vertexAttribPointer vi $= fgVertexIndex
|
|
||||||
vertexAttribArray vi $= Enabled
|
|
||||||
checkError "beforeDraw"
|
|
||||||
|
|
||||||
glPatchParameteri gl_PATCH_VERTICES 3
|
|
||||||
|
|
||||||
cullFace $= Just Front
|
|
||||||
|
|
||||||
glDrawArrays gl_PATCHES 0 (fromIntegral numVert)
|
|
||||||
|
|
||||||
checkError "draw map"
|
|
||||||
|
|
||||||
---- RENDER MAPOBJECTS --------------------------------------------
|
|
||||||
|
|
||||||
currentProgram $= Just (state ^. gl.glMap.objectProgram)
|
|
||||||
|
|
||||||
mapM_ renderObject (state ^. gl.glMap.mapObjects)
|
|
||||||
|
|
||||||
-- set sample 1 as target in renderbuffer
|
|
||||||
{-framebufferRenderbuffer
|
|
||||||
DrawFramebuffer --write-only
|
|
||||||
(ColorAttachment 1) --sample 1
|
|
||||||
Renderbuffer --const
|
|
||||||
rb --buffer-}
|
|
||||||
|
|
||||||
---- COMPOSE RENDERING --------------------------------------------
|
---- COMPOSE RENDERING --------------------------------------------
|
||||||
-- Render to BackBuffer (=Screen)
|
-- Render to BackBuffer (=Screen)
|
||||||
|
@ -116,6 +116,7 @@ data GLMapState = GLMapState
|
|||||||
, _mapProgram :: !GL.Program
|
, _mapProgram :: !GL.Program
|
||||||
, _renderedMapTexture :: !TextureObject --TODO: Probably move to UI?
|
, _renderedMapTexture :: !TextureObject --TODO: Probably move to UI?
|
||||||
, _overviewTexture :: !TextureObject
|
, _overviewTexture :: !TextureObject
|
||||||
|
, _shadowMapTexture :: !TextureObject
|
||||||
, _mapTextures :: ![TextureObject] --TODO: Fix size on list?
|
, _mapTextures :: ![TextureObject] --TODO: Fix size on list?
|
||||||
, _objectProgram :: !GL.Program
|
, _objectProgram :: !GL.Program
|
||||||
, _mapObjects :: ![MapObject]
|
, _mapObjects :: ![MapObject]
|
||||||
|
Loading…
Reference in New Issue
Block a user