added shadow-map
- added shadow-map - compiles and smap gets initialized/generated - generation ist stil incorrect (cam, light-dir, ...)
This commit is contained in:
		@@ -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]
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user