From eba8ff121c85cf98d75e6081fd514bbb791783f3 Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 29 Aug 2021 18:13:55 +0100 Subject: [PATCH] Add "cap" shadow shader --- shader/lighting/cap.frag | 6 ++++++ shader/lighting/cap.geom | 19 +++++++++++++++++++ shader/lighting/cap.vert | 11 +++++++++++ shader/lighting/surfaceCap.vert | 13 +++++++++++++ src/Data/Preload/Render.hs | 1 + src/Dodge/Default.hs | 3 --- src/Dodge/Item/Weapon/TriggerType.hs | 2 +- src/Dodge/LightSources.hs | 1 - src/Dodge/Render.hs | 3 ++- src/Dodge/WorldEvent/Explosion.hs | 7 +++++-- src/Preload/Render.hs | 4 ++++ src/Render.hs | 4 ++++ 12 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 shader/lighting/cap.frag create mode 100644 shader/lighting/cap.geom create mode 100644 shader/lighting/cap.vert create mode 100644 shader/lighting/surfaceCap.vert diff --git a/shader/lighting/cap.frag b/shader/lighting/cap.frag new file mode 100644 index 000000000..b4133d625 --- /dev/null +++ b/shader/lighting/cap.frag @@ -0,0 +1,6 @@ +#version 430 core +out vec4 fColor; +void main() +{ + fColor = vec4(0,1,0,1); +} diff --git a/shader/lighting/cap.geom b/shader/lighting/cap.geom new file mode 100644 index 000000000..e808b3998 --- /dev/null +++ b/shader/lighting/cap.geom @@ -0,0 +1,19 @@ +#version 430 core +layout (triangles) in; +layout (triangle_strip, max_vertices = 3) out; +layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; +uniform vec3 lightPos; +void main() +{ + vec4 p0 = gl_in[0].gl_Position ; + vec4 p1 = gl_in[1].gl_Position ; + vec4 p2 = gl_in[2].gl_Position ; + if ( dot( lightPos, cross( p0.xyz - p1.xyz, p1.xyz - p2.xyz)) < 0) + { + gl_Position = theMat * p0; EmitVertex(); + gl_Position = theMat * p1; EmitVertex(); + gl_Position = theMat * p2; EmitVertex(); + EndPrimitive(); + } + else {} +} diff --git a/shader/lighting/cap.vert b/shader/lighting/cap.vert new file mode 100644 index 000000000..ec2a9b359 --- /dev/null +++ b/shader/lighting/cap.vert @@ -0,0 +1,11 @@ +#version 430 core +layout (location = 0) in vec3 position; +layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; +uniform vec3 lightPos; +uniform vec4 lumRad; +out vec3 dField; +out vec3 lum; +void main() +{ + gl_Position = vec4(position,1); +} diff --git a/shader/lighting/surfaceCap.vert b/shader/lighting/surfaceCap.vert new file mode 100644 index 000000000..734d8eb58 --- /dev/null +++ b/shader/lighting/surfaceCap.vert @@ -0,0 +1,13 @@ +#version 430 core +layout (location = 0) in vec3 position; +layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; +uniform vec3 lightPos; +uniform vec4 lumRad; +out vec3 dField; +out vec3 lum; +void main() +{ + dField = (position - lightPos) / lumRad.a; + lum = lumRad.rgb; + gl_Position = theMat * vec4(position,1); +} diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index 23e861239..6201c2c55 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -16,6 +16,7 @@ data RenderData = RenderData , _lightingWallShader :: FullShader , _lightingSurfaceShader :: FullShader , _lightingLineShadowShader :: FullShader + , _lightingCapShader :: FullShader , _wallBlankShader :: FullShader , _wallTextureShader :: FullShader , _textureArrayShader :: FullShader diff --git a/src/Dodge/Default.hs b/src/Dodge/Default.hs index 66792aaec..2c92573ba 100644 --- a/src/Dodge/Default.hs +++ b/src/Dodge/Default.hs @@ -21,7 +21,6 @@ import qualified Data.IntMap.Strict as IM import qualified Data.Vector as V import Data.List import Data.Monoid - defaultCreature :: Creature defaultCreature = Creature { _crPos = V2 0 0 @@ -178,7 +177,6 @@ defaultPP = PressPlate , _ppID = -1 , _ppText = "Pressure plate" } - defaultTLS :: TempLightSource defaultTLS = TLS { _tlsPos = 0 @@ -192,4 +190,3 @@ defaultTLS = TLS | _tlsTime t <= 0 = (w, Nothing) | otherwise = (w, Just $ t & tlsTime -~ 1) - diff --git a/src/Dodge/Item/Weapon/TriggerType.hs b/src/Dodge/Item/Weapon/TriggerType.hs index dd419fab4..f5398722d 100644 --- a/src/Dodge/Item/Weapon/TriggerType.hs +++ b/src/Dodge/Item/Weapon/TriggerType.hs @@ -274,7 +274,7 @@ withMuzFlareI :: ChainEffect withMuzFlareI f it cr w = tempLightForAt 3 pos2 -- . muzzleFlashAt pos2 $ f it cr w where - pos = _crPos cr +.+ _crRad cr *.* unitVectorAtAngle (_crDir cr) + --pos = _crPos cr +.+ _crRad cr *.* unitVectorAtAngle (_crDir cr) pos2 = _crPos cr +.+ (2 * _crRad cr) *.* unitVectorAtAngle (_crDir cr) {- | Applies the effect to a randomly rotated creature. -} withRandomDirI diff --git a/src/Dodge/LightSources.hs b/src/Dodge/LightSources.hs index c1cf2b472..47a2589c9 100644 --- a/src/Dodge/LightSources.hs +++ b/src/Dodge/LightSources.hs @@ -19,7 +19,6 @@ colorLightAt col pos i = lightAt :: Point3 -> Int -> LightSource lightAt = colorLightAt 0.75 - tLightFade :: Int -> Float -> (Int -> Float) -> Point2 -> TempLightSource tLightFade 0 rmax intensityF (V2 x y) = TLS { _tlsPos = V3 x y 0 diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index 905a36c13..1bc3cb89d 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -60,8 +60,8 @@ doDrawing pdata w = do let addC (V2 xx yy) = V3 xx yy 0 nsurfVs <- pokePoint3s (shadVBOptr $ _lightingSurfaceShader pdata) $ youBox w - ++ polyToTris (map addC $ screenPolygon w) ++ concatMap polyToGeoRender (foregroundPics w) + ++ polyToTris (map addC $ screenPolygon w) -- bind wall points, silhouette data, surface geometry uncurry bindShaderBuffers $ unzip [ ( _wallTextureShader pdata, nWalls) @@ -174,6 +174,7 @@ doDrawing pdata w = do viewport $= (Position 0 0, Size (round $ fstV2 wins) (round $ sndV2 wins)) depthFunc $= Just Always blendFunc $= (One,Zero) + -- perform any radial distortion case _radDistortion w of [] -> do diff --git a/src/Dodge/WorldEvent/Explosion.hs b/src/Dodge/WorldEvent/Explosion.hs index 20c75cdb6..5131b276f 100644 --- a/src/Dodge/WorldEvent/Explosion.hs +++ b/src/Dodge/WorldEvent/Explosion.hs @@ -4,10 +4,11 @@ Explosions: creation of shockwave and particles at a given point. module Dodge.WorldEvent.Explosion where import Dodge.Data +import Dodge.Default import Dodge.Base.Zone import Dodge.Base.Collide import Dodge.WorldEvent.SpawnParticle -import Dodge.WorldEvent.Flash +--import Dodge.WorldEvent.Flash import Dodge.RandomHelp import Dodge.SoundLogic import Dodge.SoundLogic.Synonyms @@ -69,9 +70,11 @@ makeExplosionAt makeExplosionAt p w = soundOncePos grenadeBang p . addFlames - . explosionFlashAt p + -- . explosionFlashAt p + . over tempLightSources (theTLS :) $ makeShockwaveAt [] p 50 50 1 white w where + theTLS = defaultTLS {_tlsPos = addZ 20 p, _tlsIntensity = V3 1 0.5 0, _tlsTime = 20, _tlsRad = 150} fVs = replicateM 15 (randInCirc 1) & evalState $ _randGen w fPs'' = replicateM 15 (fmap (15 *.*.*) randInHemisphere) & evalState $ _randGen w (fPs',zs) = let (a,b,c) = unzip3 $ map fromV3 fPs'' diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index da6198574..ad941dfdf 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -61,6 +61,9 @@ preloadRender = do lightingSurfaceShad <- makeShader "lighting/surface" [vert,frag] [3] ETriangles >>= addUniforms ["lightPos","lumRad"] + lightingCapShad + <- makeShaderUsingShaderVAO "lighting/cap" [vert,geom,frag] ETriangles lightingSurfaceShad + >>= addUniforms ["lightPos"] lightingLineShadowShad <- makeShader "lighting/lineShadow" [vert,geom,frag] [3] ELinesAdjacency >>= addUniforms ["lightPos"] @@ -133,6 +136,7 @@ preloadRender = do return $ RenderData { _pictureShaders = shadV , _lightingSurfaceShader = lightingSurfaceShad + , _lightingCapShader = lightingCapShad , _lightingLineShadowShader = lightingLineShadowShad , _lightingOccludeShader = wsShad {_shaderVAO = wpVAO} , _lightingWallShader = wlLightShad {_shaderVAO = wpVAO} diff --git a/src/Render.hs b/src/Render.hs index 2e2c85dc4..1b229fbcb 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -69,6 +69,8 @@ createLightMap pdata lightPoints nWalls nSils nsurfVs = do uniform (head $ _shaderCustomUnis $ _lightingOccludeShader pdata) $= Vector3 x y z drawShader (_lightingOccludeShader pdata) nWalls + + --stencilOp $= (OpKeep,OpDecr,OpKeep) currentProgram $= Just (_shaderProgram $ _lightingLineShadowShader pdata) uniform (head $ _shaderCustomUnis $ _lightingLineShadowShader pdata) $= Vector3 x y z @@ -80,6 +82,8 @@ createLightMap pdata lightPoints nWalls nSils nsurfVs = do stencilOp $= (OpKeep,OpKeep,OpDecr) currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata) drawShader (_lightingOccludeShader pdata) nWalls + + --stencilOp $= (OpKeep,OpIncr,OpKeep) currentProgram $= Just (_shaderProgram $ _lightingLineShadowShader pdata) depthClamp $= Enabled drawShader (_lightingLineShadowShader pdata) nSils