diff --git a/shader/.wallShadow.frag.swp b/shader/.wallShadow.frag.swp new file mode 100644 index 000000000..bb5e04a6d Binary files /dev/null and b/shader/.wallShadow.frag.swp differ diff --git a/shader/.wallShadow.geom.swp b/shader/.wallShadow.geom.swp new file mode 100644 index 000000000..82feeac23 Binary files /dev/null and b/shader/.wallShadow.geom.swp differ diff --git a/shader/wallShadow.frag b/shader/wallShadow.frag new file mode 100644 index 000000000..e8c6b5aca --- /dev/null +++ b/shader/wallShadow.frag @@ -0,0 +1,7 @@ +#version 430 core +out vec4 fColor; + +void main() +{ + fColor = vec4 (0.9,0.9,0,1); +} diff --git a/shader/wallShadow.geom b/shader/wallShadow.geom new file mode 100644 index 000000000..7c248e807 --- /dev/null +++ b/shader/wallShadow.geom @@ -0,0 +1,26 @@ +#version 430 core +layout (points) in; +layout (triangle_strip, max_vertices = 4) out; + +in vec4 vBackPoss[]; +uniform vec2 lightPos; + +void main() +{ + vec2 posa = gl_in[0].gl_Position.xy; + vec2 posb = gl_in[0].gl_Position.zw; + vec2 v = normalize( posb - posa); + vec2 off = vec2( -(v.y *0.2) + , v.x *0.2 ); + + gl_Position = vec4 (posa, 0 , 1); + EmitVertex(); + gl_Position = vec4 (posb, 0 , 1); + EmitVertex(); + gl_Position = vec4 (posa + off, 0 , 1); + EmitVertex(); + gl_Position = vec4 (posb + off, 0 , 1); + EmitVertex(); + + EndPrimitive(); +} diff --git a/shader/wallShadow.vert b/shader/wallShadow.vert new file mode 100644 index 000000000..731d182aa --- /dev/null +++ b/shader/wallShadow.vert @@ -0,0 +1,11 @@ +#version 430 core +layout (location = 0) in vec4 poss; +layout (location = 1) in vec4 backPoss; + +out vec4 vBackPoss; + +void main() +{ + gl_Position = poss; + vBackPoss = backPoss; +} diff --git a/src/Picture/Preload.hs b/src/Picture/Preload.hs index 91cc7d6c3..7be31c4c7 100644 --- a/src/Picture/Preload.hs +++ b/src/Picture/Preload.hs @@ -25,12 +25,14 @@ data PreloadData = PreloadData , _arcShader :: Program , _fadeCircleShader :: Program , _backShader :: Program + , _wallShadowShader :: Program , _triVAO :: VAO , _lineVAO :: VAO , _textVAO :: VAO , _circVAO :: VAO , _arcVAO :: VAO , _backVAO :: VAO + , _wallVAO :: VAO , _posVBO :: BufferObject , _colVBO :: BufferObject , _texVBO :: BufferObject @@ -103,11 +105,13 @@ doPreload' = do as <- makeArcShader fcs <- makeFadeShader bgs <- makeBackgroundShader + wss <- makeWallShadowShader winSizeUni <- GL.uniformLocation cs "winSize" zoomUni <- GL.uniformLocation cs "zoom" asWinSizeUniLoc <- GL.uniformLocation as "winSize" asZoomUniLoc <- GL.uniformLocation as "zoom" + wssLightPosUniLoc <- GL.uniformLocation wss "lightPos" -- get uniform locations --setup vbos @@ -159,6 +163,7 @@ doPreload' = do circvao <- setupVAO [(posVBO,0,3),(colVBO,1,4),(texVBO,2,1)] arcvao <- setupVAO [(posVBO,0,3),(colVBO,1,4),(texVBO,2,4)] backgroundvao <- setupVAO [(posVBO,0,4),(colVBO,1,2)] + wallvao <- setupVAO [(posVBO,0,4),(colVBO,1,4)] return $ PreloadData { -- _charMap = convertRGBA8 cmap @@ -169,12 +174,14 @@ doPreload' = do , _arcShader = as , _fadeCircleShader = fcs , _backShader = bgs + , _wallShadowShader = wss , _triVAO = trivao , _textVAO = textvao , _circVAO = circvao , _arcVAO = arcvao , _lineVAO = linevao , _backVAO = backgroundvao + , _wallVAO = wallvao , _posVBO = posVBO , _colVBO = colVBO , _texVBO = texVBO diff --git a/src/Shaders.hs b/src/Shaders.hs index 1cfc7d165..d08a06069 100644 --- a/src/Shaders.hs +++ b/src/Shaders.hs @@ -1,14 +1,12 @@ {-# LANGUAGE QuasiQuotes #-} module Shaders - (setupBasicShader - ,setupFadeShader - ,setupShaders - ,makeTextureShader + (makeTextureShader ,makeBasicShader ,makeFadeShader ,makeCircleShader ,makeArcShader ,makeBackgroundShader + ,makeWallShadowShader ) where import Graphics.Rendering.OpenGL @@ -16,13 +14,6 @@ import Control.Monad (when) import Text.RawString.QQ import qualified Data.ByteString as BS -setupShaders :: IO [Program] -setupShaders = do - basicShader <- makeBasicShader - fadeShader <- makeFadeShader - textureShader <- makeTextureShader - return [basicShader,fadeShader,textureShader] - makeBasicShader :: IO Program makeBasicShader = do vsSource <- BS.readFile "shader/basic.vert" @@ -32,11 +23,6 @@ makeBasicShader = do ,(FragmentShader, fsSource) ] -setupBasicShader :: IO () -setupBasicShader = do - shaderProgram <- makeBasicShader - currentProgram $= (Just shaderProgram) - makeCircleShader :: IO Program makeCircleShader = do vsSource <- BS.readFile "shader/circle.vert" @@ -80,11 +66,16 @@ makeBackgroundShader = do ,(FragmentShader, fsSource ) ] -setupFadeShader :: IO Program -setupFadeShader = do - shaderProgram <- makeFadeShader - currentProgram $= (Just shaderProgram) - return shaderProgram +makeWallShadowShader :: IO Program +makeWallShadowShader = do + vsSource <- BS.readFile "shader/wallShadow.vert" + gsSource <- BS.readFile "shader/wallShadow.geom" + fsSource <- BS.readFile "shader/wallShadow.frag" + + makeShaderProgram [(VertexShader, vsSource ) + ,(GeometryShader, gsSource ) + ,(FragmentShader, fsSource ) + ] makeTextureShader :: IO Program makeTextureShader = do