Commit before attempt to remove geometry shaders from shadow extrusion
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
@@ -18,24 +18,19 @@ void main()
|
|||||||
vec4 p0 = gl_in[0].gl_Position ;
|
vec4 p0 = gl_in[0].gl_Position ;
|
||||||
vec4 p1 = gl_in[1].gl_Position ;
|
vec4 p1 = gl_in[1].gl_Position ;
|
||||||
vec4 p2 = gl_in[2].gl_Position ;
|
vec4 p2 = gl_in[2].gl_Position ;
|
||||||
if ( //dot( p0.xyz - vec3 (0,0,1), cross( p0.xyz - p1.xyz, p1.xyz - p2.xyz)) < 0
|
if ( //if Light Source is below all vertices, draw cap
|
||||||
// &&
|
// TODO think about when LS is beside the object
|
||||||
( p0.z - lightPos.z > 0 )
|
( p0.z - lightPos.z > 0 )
|
||||||
&& ( p1.z - lightPos.z > 0 )
|
&& ( p1.z - lightPos.z > 0 )
|
||||||
&& ( p2.z - lightPos.z > 0 )
|
&& ( p2.z - lightPos.z > 0 )
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// front cap
|
// the front cap
|
||||||
vec4 v1 = vec4 (0,0,1,0) ;
|
vec4 v1 = vec4 (0,0,1,0) ;
|
||||||
gl_Position = theMat * projNear(p0); EmitVertex();
|
gl_Position = theMat * projNear(p0); EmitVertex();
|
||||||
gl_Position = theMat * projNear(p1); EmitVertex();
|
gl_Position = theMat * projNear(p1); EmitVertex();
|
||||||
gl_Position = theMat * projNear(p2); EmitVertex();
|
gl_Position = theMat * projNear(p2); EmitVertex();
|
||||||
EndPrimitive();
|
EndPrimitive();
|
||||||
// if light points downwards onto surface, draw back cap too
|
|
||||||
if (dot ( p0.xyz - lightPos, vec3 ( 0,0,1) ) > 0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
else {}
|
|
||||||
}
|
}
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ layout (lines_adjacency) in;
|
|||||||
layout (triangle_strip, max_vertices = 4) out;
|
layout (triangle_strip, max_vertices = 4) out;
|
||||||
layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ;
|
layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ;
|
||||||
uniform vec3 lightPos;
|
uniform vec3 lightPos;
|
||||||
vec4 shift (vec4 p) { return (vec4 (p.xyz + (100000*(p.xyz-lightPos)), 1));}
|
//vec4 shift (vec4 p) { return (vec4 (p.xyz + (100000*(p.xyz-lightPos)), 1));}
|
||||||
|
vec4 shift (vec4 p) { return (vec4 (p.xyz + (1000*(p.xyz-lightPos)), 1));}
|
||||||
// copied from lighting/cap.geom, should not be changed on its own
|
// copied from lighting/cap.geom, should not be changed on its own
|
||||||
vec4 projNear (vec4 pos)
|
vec4 projNear (vec4 pos)
|
||||||
{
|
{
|
||||||
@@ -34,7 +35,7 @@ void main()
|
|||||||
//vec3 n2 = n0 + n1; // assumes the summands are normalized
|
//vec3 n2 = n0 + n1; // assumes the summands are normalized
|
||||||
vec3 lightDir = p0.xyz - lightPos.xyz;
|
vec3 lightDir = p0.xyz - lightPos.xyz;
|
||||||
// first test if the edge is part of the silhouette
|
// first test if the edge is part of the silhouette
|
||||||
// that is, if the normals of the faces connected by the edge point in
|
// that is, if the normals of the faces connected by the edge point are in
|
||||||
// "different directions" wrt the light direction
|
// "different directions" wrt the light direction
|
||||||
if ( dot(n0 , lightDir) * dot(n1 , lightDir) <= 0 )
|
if ( dot(n0 , lightDir) * dot(n1 , lightDir) <= 0 )
|
||||||
// using <= rather than < seems to get rid of overlapping shadow
|
// using <= rather than < seems to get rid of overlapping shadow
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ visibleWalls sp ep =
|
|||||||
|
|
||||||
allVisibleWalls :: World -> [(Point2, Wall)]
|
allVisibleWalls :: World -> [(Point2, Wall)]
|
||||||
{-# INLINE allVisibleWalls #-}
|
{-# INLINE allVisibleWalls #-}
|
||||||
allVisibleWalls w = concatMap (flip (visibleWalls vPos) w . (+.+ vPos)) $ nRays 20
|
allVisibleWalls w = concatMap (flip (visibleWalls vPos) w . (+.+ vPos)) $ nRays 15
|
||||||
where
|
where
|
||||||
vPos = w ^. cWorld . camPos . camViewFrom
|
vPos = w ^. cWorld . camPos . camViewFrom
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -73,7 +73,8 @@ maybeClearPath :: World -> PathEdgeNodes -> World
|
|||||||
maybeClearPath w (PathEdgeNodes x y pe)
|
maybeClearPath w (PathEdgeNodes x y pe)
|
||||||
| not . null $ overlapSegWalls (_peStart pe) (_peEnd pe) $ wlsNearSeg (_peStart pe) (_peEnd pe) w =
|
| not . null $ overlapSegWalls (_peStart pe) (_peEnd pe) $ wlsNearSeg (_peStart pe) (_peEnd pe) w =
|
||||||
w
|
w
|
||||||
| otherwise = w & cWorld . lWorld . pathGraph %~ FGL.insEdge (x, y, pe & peObstacles .~ mempty) . FGL.delEdge (x, y)
|
| otherwise = w
|
||||||
|
& cWorld . pathGraph %~ FGL.insEdge (x, y, pe & peObstacles .~ mempty) . FGL.delEdge (x, y)
|
||||||
|
|
||||||
destroyDoor :: Door -> World -> World
|
destroyDoor :: Door -> World -> World
|
||||||
destroyDoor dr w =
|
destroyDoor dr w =
|
||||||
|
|||||||
@@ -54,4 +54,4 @@ chaseCrit =
|
|||||||
0
|
0
|
||||||
, _crMvType = defaultChaseMvType
|
, _crMvType = defaultChaseMvType
|
||||||
}
|
}
|
||||||
& crType . humanoidAI .~ ChaseAI
|
-- & crType . humanoidAI .~ ChaseAI
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import Dodge.GameRoom
|
|||||||
import Geometry.ConvexPoly
|
import Geometry.ConvexPoly
|
||||||
import Dodge.Data.CamPos
|
import Dodge.Data.CamPos
|
||||||
import qualified Data.IntSet as IS
|
import qualified Data.IntSet as IS
|
||||||
|
import Data.Graph.Inductive
|
||||||
|
|
||||||
data CWorld = CWorld
|
data CWorld = CWorld
|
||||||
{ _lWorld :: LWorld
|
{ _lWorld :: LWorld
|
||||||
@@ -29,6 +30,7 @@ data CWorld = CWorld
|
|||||||
, _timeFlow :: TimeFlowStatus
|
, _timeFlow :: TimeFlowStatus
|
||||||
, _seenWalls :: IS.IntSet
|
, _seenWalls :: IS.IntSet
|
||||||
, _floorTiles :: [(Point3, Point3)]
|
, _floorTiles :: [(Point3, Point3)]
|
||||||
|
, _pathGraph :: Gr Point2 PathEdge
|
||||||
}
|
}
|
||||||
|
|
||||||
data TimeFlowStatus
|
data TimeFlowStatus
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ module Dodge.Data.LWorld (
|
|||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.TH
|
import Data.Aeson.TH
|
||||||
import Data.Graph.Inductive
|
|
||||||
import Dodge.Data.Beam
|
import Dodge.Data.Beam
|
||||||
import Dodge.Data.Block
|
import Dodge.Data.Block
|
||||||
import Dodge.Data.Bounds
|
import Dodge.Data.Bounds
|
||||||
@@ -138,7 +137,6 @@ data LWorld = LWorld
|
|||||||
, _decorations :: IM.IntMap Picture
|
, _decorations :: IM.IntMap Picture
|
||||||
, _foregroundShapes :: IM.IntMap ForegroundShape
|
, _foregroundShapes :: IM.IntMap ForegroundShape
|
||||||
, _corpses :: IM.IntMap Corpse
|
, _corpses :: IM.IntMap Corpse
|
||||||
, _pathGraph :: Gr Point2 PathEdge
|
|
||||||
, _lightSources :: IM.IntMap LightSource
|
, _lightSources :: IM.IntMap LightSource
|
||||||
, _tempLightSources :: [TempLightSource]
|
, _tempLightSources :: [TempLightSource]
|
||||||
, _seenLocations :: IM.IntMap (WdP2, String)
|
, _seenLocations :: IM.IntMap (WdP2, String)
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ defaultCWorld =
|
|||||||
, _timeFlow = NormalTimeFlow
|
, _timeFlow = NormalTimeFlow
|
||||||
, _seenWalls = mempty
|
, _seenWalls = mempty
|
||||||
, _floorTiles = mempty
|
, _floorTiles = mempty
|
||||||
|
--, _pathGraph = mempty
|
||||||
|
, _pathGraph = Data.Graph.Inductive.Graph.empty
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultLWorld :: LWorld
|
defaultLWorld :: LWorld
|
||||||
@@ -130,7 +132,6 @@ defaultLWorld =
|
|||||||
, _buttons = IM.empty
|
, _buttons = IM.empty
|
||||||
, _corpses = IM.empty
|
, _corpses = IM.empty
|
||||||
, _decorations = IM.empty
|
, _decorations = IM.empty
|
||||||
, _pathGraph = Data.Graph.Inductive.Graph.empty
|
|
||||||
, _lightSources = IM.empty
|
, _lightSources = IM.empty
|
||||||
, _tempLightSources = []
|
, _tempLightSources = []
|
||||||
, _seenLocations =
|
, _seenLocations =
|
||||||
|
|||||||
+2
-3
@@ -3,6 +3,7 @@ module Dodge.Layout (
|
|||||||
generateLevelFromRoomList,
|
generateLevelFromRoomList,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import Dodge.Path.Translate
|
||||||
import qualified Control.Foldl as L
|
import qualified Control.Foldl as L
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Foldable
|
import Data.Foldable
|
||||||
@@ -44,7 +45,7 @@ generateLevelFromRoomList gr' w =
|
|||||||
. worldToGenWorld rs'
|
. worldToGenWorld rs'
|
||||||
$ w & cWorld . lWorld . walls .~ wallsFromRooms rs
|
$ w & cWorld . lWorld . walls .~ wallsFromRooms rs
|
||||||
& cWorld . cwGen . cwgGameRooms .~ gameRoomsFromRooms (IM.elems rs')
|
& cWorld . cwGen . cwgGameRooms .~ gameRoomsFromRooms (IM.elems rs')
|
||||||
& cWorld . lWorld . pathGraph .~ path
|
& cWorld . pathGraph .~ path
|
||||||
& pnZoning .~ foldl' (flip zonePn) mempty (labNodes path)
|
& pnZoning .~ foldl' (flip zonePn) mempty (labNodes path)
|
||||||
& peZoning .~ foldl' (flip zonePe) mempty (map fromEdgeTuple $ labEdges path)
|
& peZoning .~ foldl' (flip zonePe) mempty (map fromEdgeTuple $ labEdges path)
|
||||||
where
|
where
|
||||||
@@ -54,8 +55,6 @@ generateLevelFromRoomList gr' w =
|
|||||||
rs = map doRoomShift $ IM.elems rs'
|
rs = map doRoomShift $ IM.elems rs'
|
||||||
rs' = mapM shuffleRoomPos gr' & evalState $ _randGen w
|
rs' = mapM shuffleRoomPos gr' & evalState $ _randGen w
|
||||||
|
|
||||||
fromEdgeTuple :: (Int, Int, PathEdge) -> PathEdgeNodes
|
|
||||||
fromEdgeTuple (a, b, pe) = PathEdgeNodes a b pe
|
|
||||||
|
|
||||||
randomCompass :: World -> World
|
randomCompass :: World -> World
|
||||||
randomCompass w = w & cWorld . camPos . camRot .~ (takeOne [0, 0.5 * pi, pi, 1.5 * pi] & evalState $ _randGen w)
|
randomCompass w = w & cWorld . camPos . camRot .~ (takeOne [0, 0.5 * pi, pi, 1.5 * pi] & evalState $ _randGen w)
|
||||||
|
|||||||
+5
-5
@@ -30,14 +30,14 @@ import Data.Bifunctor
|
|||||||
|
|
||||||
getNodePos :: Int -> World -> Maybe Point2
|
getNodePos :: Int -> World -> Maybe Point2
|
||||||
--getNodePos i w = _pathGraph (_cWorld w) `lab` i
|
--getNodePos i w = _pathGraph (_cWorld w) `lab` i
|
||||||
getNodePos i w = (w ^. cWorld . lWorld . pathGraph) `lab` i
|
getNodePos i w = (w ^. cWorld . pathGraph) `lab` i
|
||||||
|
|
||||||
makePathBetween :: Point2 -> Point2 -> World -> Maybe [Int]
|
makePathBetween :: Point2 -> Point2 -> World -> Maybe [Int]
|
||||||
makePathBetween a b w = do
|
makePathBetween a b w = do
|
||||||
-- join $ sp <$> a' <*> b' <*> return (_pathGraph w)
|
-- join $ sp <$> a' <*> b' <*> return (_pathGraph w)
|
||||||
na <- walkableNodeNear w a
|
na <- walkableNodeNear w a
|
||||||
nb <- walkableNodeNear w b
|
nb <- walkableNodeNear w b
|
||||||
sp na nb (second _peDist (efilter (not . pathEdgeObstructed . (^. _3)) $ w ^. cWorld . lWorld . pathGraph))
|
sp na nb (second _peDist (efilter (not . pathEdgeObstructed . (^. _3)) $ w ^. cWorld . pathGraph))
|
||||||
--_pathGraph (_cWorld w)))
|
--_pathGraph (_cWorld w)))
|
||||||
|
|
||||||
pathEdgeObstructed :: PathEdge -> Bool
|
pathEdgeObstructed :: PathEdge -> Bool
|
||||||
@@ -53,13 +53,13 @@ walkableNodeNear w p = fmap fst . find (flip (isWalkable p) w . snd) $ nodesNear
|
|||||||
|
|
||||||
makePathBetweenPs :: Point2 -> Point2 -> World -> Maybe [Point2]
|
makePathBetweenPs :: Point2 -> Point2 -> World -> Maybe [Point2]
|
||||||
--makePathBetweenPs a b w = mapMaybe (lab $ _pathGraph (_cWorld w)) <$> makePathBetween a b w
|
--makePathBetweenPs a b w = mapMaybe (lab $ _pathGraph (_cWorld w)) <$> makePathBetween a b w
|
||||||
makePathBetweenPs a b w = mapMaybe (lab $ w ^. cWorld . lWorld . pathGraph) <$> makePathBetween a b w
|
makePathBetweenPs a b w = mapMaybe (lab $ w ^. cWorld . pathGraph) <$> makePathBetween a b w
|
||||||
|
|
||||||
bfsNodePoints :: Int -> World -> [Point2]
|
bfsNodePoints :: Int -> World -> [Point2]
|
||||||
bfsNodePoints n w = mapMaybe (lab g) $ bfs n g
|
bfsNodePoints n w = mapMaybe (lab g) $ bfs n g
|
||||||
where
|
where
|
||||||
--g = _pathGraph (_cWorld w)
|
--g = _pathGraph (_cWorld w)
|
||||||
g = w ^. cWorld . lWorld . pathGraph
|
g = w ^. cWorld . pathGraph
|
||||||
|
|
||||||
pointTowardsImpulse :: Point2 -> Point2 -> World -> Maybe Point2
|
pointTowardsImpulse :: Point2 -> Point2 -> World -> Maybe Point2
|
||||||
pointTowardsImpulse a b w = (find (flip (isWalkable a) w) . reverse) =<< makePathBetweenPs a b w
|
pointTowardsImpulse a b w = (find (flip (isWalkable a) w) . reverse) =<< makePathBetweenPs a b w
|
||||||
@@ -138,7 +138,7 @@ addEdges nodemap gr = foldl' f (mempty, gr)
|
|||||||
|
|
||||||
obstructPathsCrossing :: EdgeObstacle -> Point2 -> Point2 -> World -> (World, Set PathEdgeNodes)
|
obstructPathsCrossing :: EdgeObstacle -> Point2 -> Point2 -> World -> (World, Set PathEdgeNodes)
|
||||||
obstructPathsCrossing obstacletype sp' ep w =
|
obstructPathsCrossing obstacletype sp' ep w =
|
||||||
( w & cWorld . lWorld . pathGraph %~ updateedges
|
( w & cWorld . pathGraph %~ updateedges
|
||||||
, es
|
, es
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|||||||
@@ -71,9 +71,9 @@ maybeClearDoorPaths eo es w = foldl' (maybeClearDoorPath eo) w es
|
|||||||
maybeClearDoorPath :: EdgeObstacle -> World -> PathEdgeNodes -> World
|
maybeClearDoorPath :: EdgeObstacle -> World -> PathEdgeNodes -> World
|
||||||
maybeClearDoorPath eo w (PathEdgeNodes x y pe)
|
maybeClearDoorPath eo w (PathEdgeNodes x y pe)
|
||||||
| not . null $ overlapSegWalls (_peStart pe) (_peEnd pe) $ wlsNearSeg (_peStart pe) (_peEnd pe) w =
|
| not . null $ overlapSegWalls (_peStart pe) (_peEnd pe) $ wlsNearSeg (_peStart pe) (_peEnd pe) w =
|
||||||
w & cWorld . lWorld . pathGraph %~ FGL.insEdge (x, y, pe & peObstacles . at eo ?~ ()) . FGL.delEdge (x, y)
|
w & cWorld . pathGraph %~ FGL.insEdge (x, y, pe & peObstacles . at eo ?~ ()) . FGL.delEdge (x, y)
|
||||||
| otherwise =
|
| otherwise =
|
||||||
w & cWorld . lWorld . pathGraph %~ FGL.insEdge (x, y, pe & peObstacles . at eo .~ Nothing) . FGL.delEdge (x, y)
|
w & cWorld . pathGraph %~ FGL.insEdge (x, y, pe & peObstacles . at eo .~ Nothing) . FGL.delEdge (x, y)
|
||||||
|
|
||||||
plSlideDoor ::
|
plSlideDoor ::
|
||||||
Door ->
|
Door ->
|
||||||
|
|||||||
@@ -463,7 +463,7 @@ drawPathing cfig w =
|
|||||||
<> foldMap dispInc (graphToIncidence gr)
|
<> foldMap dispInc (graphToIncidence gr)
|
||||||
where
|
where
|
||||||
dispInc (p, n) = setDepth 2 . uncurryV translate p . scale 0.1 0.1 $ text $ show n
|
dispInc (p, n) = setDepth 2 . uncurryV translate p . scale 0.1 0.1 $ text $ show n
|
||||||
gr = w ^. cWorld . lWorld . pathGraph
|
gr = w ^. cWorld . pathGraph
|
||||||
|
|
||||||
crDisplayInfo :: Configuration -> CamPos -> Creature -> Maybe (Point2, [String])
|
crDisplayInfo :: Configuration -> CamPos -> Creature -> Maybe (Point2, [String])
|
||||||
crDisplayInfo cfig cam cr
|
crDisplayInfo cfig cam cr
|
||||||
|
|||||||
+3
-3
@@ -8,6 +8,8 @@ module Dodge.Save (
|
|||||||
reloadLevelStart,
|
reloadLevelStart,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
|
||||||
|
import Dodge.Path.Translate
|
||||||
import Data.Graph.Inductive (labEdges, labNodes)
|
import Data.Graph.Inductive (labEdges, labNodes)
|
||||||
import Dodge.Zoning.Pathing
|
import Dodge.Zoning.Pathing
|
||||||
import Data.Foldable
|
import Data.Foldable
|
||||||
@@ -53,11 +55,9 @@ readSaveSlot ss = do
|
|||||||
& uvScreenLayers .~ []
|
& uvScreenLayers .~ []
|
||||||
else putStrLn "loadSaveSlot failed to find saved file" >> return removescreenlayers
|
else putStrLn "loadSaveSlot failed to find saved file" >> return removescreenlayers
|
||||||
where
|
where
|
||||||
path uv = uv ^. uvWorld . cWorld . lWorld . pathGraph
|
path uv = uv ^. uvWorld . cWorld . pathGraph
|
||||||
removescreenlayers = Just . (uvScreenLayers .~ [])
|
removescreenlayers = Just . (uvScreenLayers .~ [])
|
||||||
|
|
||||||
fromEdgeTuple :: (Int, Int, PathEdge) -> PathEdgeNodes
|
|
||||||
fromEdgeTuple (a, b, pe) = PathEdgeNodes a b pe
|
|
||||||
|
|
||||||
saveSlotPath :: SaveSlot -> String
|
saveSlotPath :: SaveSlot -> String
|
||||||
saveSlotPath (SaveSlotNum i) = "saveSlot/" ++ show i
|
saveSlotPath (SaveSlotNum i) = "saveSlot/" ++ show i
|
||||||
|
|||||||
+1
-1
@@ -165,7 +165,7 @@ pokeJustV :: Ptr Float
|
|||||||
-> Int
|
-> Int
|
||||||
-> ShapeV
|
-> ShapeV
|
||||||
-> IO Int
|
-> IO Int
|
||||||
--{-# INLINE pokeJustV #-}
|
{-# INLINE pokeJustV #-}
|
||||||
pokeJustV ptr nv sh = do
|
pokeJustV ptr nv sh = do
|
||||||
-- pokeArray (advancePtr ptr (off 0)) [a,b,c,d,e,f,g]
|
-- pokeArray (advancePtr ptr (off 0)) [a,b,c,d,e,f,g]
|
||||||
pokeElemOff ptr (off 0) a
|
pokeElemOff ptr (off 0) a
|
||||||
|
|||||||
Reference in New Issue
Block a user