Merge branch 'master' into testing
This commit is contained in:
+3
-13
@@ -10,7 +10,7 @@ import Dodge.Layout
|
|||||||
import Dodge.LoadSound
|
import Dodge.LoadSound
|
||||||
import Dodge.Update
|
import Dodge.Update
|
||||||
import Dodge.Event
|
import Dodge.Event
|
||||||
import Dodge.Rendering
|
import Dodge.Render
|
||||||
import Dodge.Menu
|
import Dodge.Menu
|
||||||
import Dodge.Floor
|
import Dodge.Floor
|
||||||
import Dodge.LoadConfig
|
import Dodge.LoadConfig
|
||||||
@@ -24,6 +24,7 @@ import Sound.Preload
|
|||||||
|
|
||||||
import Control.Concurrent
|
import Control.Concurrent
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
|
import Foreign (Word32)
|
||||||
|
|
||||||
import Control.Monad (when)
|
import Control.Monad (when)
|
||||||
|
|
||||||
@@ -52,18 +53,7 @@ main = do
|
|||||||
(fmap (setWindowSize sizex sizey keyConfig) firstWorld)
|
(fmap (setWindowSize sizex sizey keyConfig) firstWorld)
|
||||||
( \preData w -> do
|
( \preData w -> do
|
||||||
startTicks <- SDL.ticks
|
startTicks <- SDL.ticks
|
||||||
clear [ColorBuffer,DepthBuffer]
|
doDrawing (_renderData preData) w
|
||||||
(lightTicks,timeSpentPoking) <- renderPicture' (_renderData preData)
|
|
||||||
(_cameraRot w) (_cameraZoom w)
|
|
||||||
(_cameraCenter w)
|
|
||||||
(_windowX w,_windowY w)
|
|
||||||
(wallsPointsAndCols w)
|
|
||||||
(wallsWindows w)
|
|
||||||
(lightsForGloom' w)
|
|
||||||
(_cameraViewFrom w)
|
|
||||||
(worldPictures w)
|
|
||||||
blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
|
|
||||||
renderFoldable (_renderData preData) (picToLTree Nothing $ fixedCoordPictures w)
|
|
||||||
playSoundQueue (_soundData preData) (_soundQueue w)
|
playSoundQueue (_soundData preData) (_soundQueue w)
|
||||||
newSoundData <- playAndUpdate (_sounds w) (_soundData preData)
|
newSoundData <- playAndUpdate (_sounds w) (_soundData preData)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
import Criterion.Main
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = putStrLn "h"
|
||||||
@@ -79,3 +79,23 @@ tests:
|
|||||||
- -with-rtsopts=-N
|
- -with-rtsopts=-N
|
||||||
dependencies:
|
dependencies:
|
||||||
- loop
|
- loop
|
||||||
|
|
||||||
|
benchmarks:
|
||||||
|
loop-benchmarks:
|
||||||
|
dependencies:
|
||||||
|
- criterion
|
||||||
|
ghc-options:
|
||||||
|
- -threaded
|
||||||
|
- -O2
|
||||||
|
- -rtsopts
|
||||||
|
- -with-rtsopts=-N
|
||||||
|
- -flate-dmd-anal
|
||||||
|
- -fno-liberate-case
|
||||||
|
- -fno-state-hack
|
||||||
|
- -funfolding-use-threshold1000
|
||||||
|
- -funfolding-keeness-factor1000
|
||||||
|
- -fllvm
|
||||||
|
- -optlo-O3
|
||||||
|
main: Bench.hs
|
||||||
|
source-dirs: bench
|
||||||
|
|
||||||
|
|||||||
+6
-5
@@ -280,6 +280,12 @@ zoneOfLine :: Point2 -> Point2 -> [(Int,Int)]
|
|||||||
zoneOfLine (aa,ab) (ba,bb) = nub $ concatMap f
|
zoneOfLine (aa,ab) (ba,bb) = nub $ concatMap f
|
||||||
$ digitalLine (zoneOfPoint (aa,ab)) (zoneOfPoint (ba,bb))
|
$ digitalLine (zoneOfPoint (aa,ab)) (zoneOfPoint (ba,bb))
|
||||||
where f (x,y) = [(p,r) | p <-[x-1,x,x+1] , r<-[y-1,y,y+1]]
|
where f (x,y) = [(p,r) | p <-[x-1,x,x+1] , r<-[y-1,y,y+1]]
|
||||||
|
|
||||||
|
zoneOfLine' :: Point2 -> Point2 -> IM.IntMap IS.IntSet
|
||||||
|
{-# INLINE zoneOfLine' #-}
|
||||||
|
zoneOfLine' a b = expandLine $ digitalLine (x-1,y-1) (x'-1,y'-1)
|
||||||
|
where (x,y) = zoneOfPoint a
|
||||||
|
(x',y') = zoneOfPoint b
|
||||||
--zoneOfLine (aa,ab) (ba,bb) = nub $ concatMap f
|
--zoneOfLine (aa,ab) (ba,bb) = nub $ concatMap f
|
||||||
-- $ digitalLine (zoneOfPoint (aa-n,ab-n)) (zoneOfPoint (ba-n,bb-n))
|
-- $ digitalLine (zoneOfPoint (aa-n,ab-n)) (zoneOfPoint (ba-n,bb-n))
|
||||||
-- where f (x,y) = [(p,r) | p <-[x,x+1] , r<-[y,y+1]]
|
-- where f (x,y) = [(p,r) | p <-[x,x+1] , r<-[y,y+1]]
|
||||||
@@ -294,11 +300,6 @@ expandLine xs = IM.map expandSet
|
|||||||
--expandSet s = s
|
--expandSet s = s
|
||||||
where mk = IS.findMax s
|
where mk = IS.findMax s
|
||||||
|
|
||||||
zoneOfLine' :: Point2 -> Point2 -> IM.IntMap IS.IntSet
|
|
||||||
{-# INLINE zoneOfLine' #-}
|
|
||||||
zoneOfLine' a b = expandLine $ digitalLine (x-1,y-1) (x'-1,y'-1)
|
|
||||||
where (x,y) = zoneOfPoint a
|
|
||||||
(x',y') = zoneOfPoint b
|
|
||||||
|
|
||||||
--zoneOfLine a b = concatMap zoneNearPoint $ divideLine (2 * zoneSize) a b
|
--zoneOfLine a b = concatMap zoneNearPoint $ divideLine (2 * zoneSize) a b
|
||||||
--zoneOfLine a b = concatMap zoneNearPoint $ divideLine zoneSize a b
|
--zoneOfLine a b = concatMap zoneNearPoint $ divideLine zoneSize a b
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ startCr = defaultCreature
|
|||||||
(
|
(
|
||||||
[pistol
|
[pistol
|
||||||
,blinkGun
|
,blinkGun
|
||||||
|
,spawnGun lamp
|
||||||
,flameGrenade
|
,flameGrenade
|
||||||
,teslaGrenade
|
,teslaGrenade
|
||||||
,autoGun
|
,autoGun
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import Dodge.Base
|
|||||||
import Dodge.Default
|
import Dodge.Default
|
||||||
import Dodge.CreatureState
|
import Dodge.CreatureState
|
||||||
import Dodge.LightSources
|
import Dodge.LightSources
|
||||||
|
import Dodge.WorldEvent.Flash
|
||||||
|
|
||||||
import Dodge.WorldEvent.Sound
|
import Dodge.WorldEvent.Sound
|
||||||
|
|
||||||
@@ -34,7 +35,7 @@ updateLamp :: Int -> CRUpdate
|
|||||||
updateLamp i = unrandUpdate handleLS internalUpdate
|
updateLamp i = unrandUpdate handleLS internalUpdate
|
||||||
where
|
where
|
||||||
handleLS cr w
|
handleLS cr w
|
||||||
| _crHP cr < 0 = mkSoundBreakGlass w & lightSources %~ IM.delete i
|
| _crHP cr < 0 = explosionFlashAt (_crPos cr) $ mkSoundBreakGlass w & lightSources %~ IM.delete i
|
||||||
| otherwise = w & lightSources . ix i . lsPos .~ _crPos cr
|
| otherwise = w & lightSources . ix i . lsPos .~ _crPos cr
|
||||||
internalUpdate cr
|
internalUpdate cr
|
||||||
| _crHP cr < 0 = Nothing
|
| _crHP cr < 0 = Nothing
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ pistol = Weapon
|
|||||||
, _itInvColor = white
|
, _itInvColor = white
|
||||||
}
|
}
|
||||||
defaultGun = pistol
|
defaultGun = pistol
|
||||||
|
|
||||||
defaultAutoGun = autoGun {_itScrollUp = const id
|
defaultAutoGun = autoGun {_itScrollUp = const id
|
||||||
, _itScrollDown = const id, _itInvDisplay = basicWeaponDisplay}
|
, _itScrollDown = const id, _itInvDisplay = basicWeaponDisplay}
|
||||||
effectGun :: String -> (Int -> World -> World) -> Item
|
effectGun :: String -> (Int -> World -> World) -> Item
|
||||||
@@ -900,13 +901,14 @@ aFlame a cid w
|
|||||||
w
|
w
|
||||||
where
|
where
|
||||||
(a2,g) = randomR (-0.1,0.1) (_randGen w)
|
(a2,g) = randomR (-0.1,0.1) (_randGen w)
|
||||||
|
(t,_) = randomR (99,101) (_randGen w)
|
||||||
angle = min flamerAngle $ max (-flamerAngle) (a + a2)
|
angle = min flamerAngle $ max (-flamerAngle) (a + a2)
|
||||||
cr = (_creatures w IM.! cid)
|
cr = (_creatures w IM.! cid)
|
||||||
dir = _crDir cr + angle
|
dir = _crDir cr + angle
|
||||||
pos = _crPos cr +.+ ((_crRad cr + 2.9) *.* unitVectorAtAngle (_crDir cr))
|
pos = _crPos cr +.+ ((_crRad cr + 2.9) *.* unitVectorAtAngle (_crDir cr))
|
||||||
w1 = set randGen g w
|
w1 = set randGen g w
|
||||||
vel = (_crPos cr -.- _crOldPos cr) +.+ 4 *.* unitVectorAtAngle dir
|
vel = (_crPos cr -.- _crOldPos cr) +.+ 4 *.* unitVectorAtAngle dir
|
||||||
insertFlame = makeFlame pos vel (Just cid) -- . makeFlame pos2 vel (Just cid)
|
insertFlame = makeFlame t pos vel (Just cid) -- . makeFlame pos2 vel (Just cid)
|
||||||
resetAngle = set (creatures . ix cid . crInv . ix (_crInvSel cr) . wpFire)
|
resetAngle = set (creatures . ix cid . crInv . ix (_crInvSel cr) . wpFire)
|
||||||
(shoot $ aFlame angle)
|
(shoot $ aFlame angle)
|
||||||
|
|
||||||
@@ -1942,4 +1944,23 @@ makeLaserScope p ep d relFrac = Particle'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
spawnGun :: Creature -> Item
|
||||||
|
spawnGun cr = defaultGun
|
||||||
|
{ _itName = "SPAWNER"
|
||||||
|
, _wpMaxAmmo = 1
|
||||||
|
, _wpLoadedAmmo = 1
|
||||||
|
, _wpReloadTime = 80
|
||||||
|
, _wpReloadState = 0
|
||||||
|
, _wpFireRate = 100
|
||||||
|
, _wpFire = spawnCrNextTo cr
|
||||||
|
}
|
||||||
|
|
||||||
|
spawnCrNextTo :: Creature -> Int -> World -> World
|
||||||
|
spawnCrNextTo cr i w = w & creatures %~ IM.insert k newCr
|
||||||
|
where
|
||||||
|
k = newKey $ _creatures w
|
||||||
|
sCr = _creatures w IM.! i
|
||||||
|
newCr = cr
|
||||||
|
& crID .~ k
|
||||||
|
& crPos .~ _crPos sCr +.+ unitVectorAtAngle (_crDir sCr)
|
||||||
|
& crOldPos .~ _crPos sCr +.+ unitVectorAtAngle (_crDir sCr)
|
||||||
|
|||||||
@@ -0,0 +1,122 @@
|
|||||||
|
module Dodge.Render
|
||||||
|
( module Dodge.Render.Picture
|
||||||
|
, doDrawing
|
||||||
|
, doDrawing'
|
||||||
|
)
|
||||||
|
where
|
||||||
|
import Dodge.Data
|
||||||
|
import Dodge.Base
|
||||||
|
|
||||||
|
import Dodge.Render.HUD
|
||||||
|
import Dodge.Render.MenuScreen
|
||||||
|
import Dodge.Render.Picture
|
||||||
|
import Dodge.Render.PerspectiveMatrix
|
||||||
|
|
||||||
|
import Geometry
|
||||||
|
import Picture
|
||||||
|
import Shader
|
||||||
|
|
||||||
|
import Picture.Render
|
||||||
|
import Picture.Preload
|
||||||
|
|
||||||
|
import Data.Graph.Inductive.Query.DFS
|
||||||
|
import Data.Graph.Inductive.Graph
|
||||||
|
|
||||||
|
import Control.Monad.State
|
||||||
|
import Data.List
|
||||||
|
import Data.Bifunctor
|
||||||
|
|
||||||
|
import Foreign (Word32)
|
||||||
|
import Data.Function
|
||||||
|
import Control.Applicative
|
||||||
|
import Control.Lens
|
||||||
|
import Data.Maybe
|
||||||
|
import qualified Data.IntMap.Strict as IM
|
||||||
|
import qualified Data.Map as M
|
||||||
|
import qualified Data.Set as S
|
||||||
|
import Graphics.Rendering.OpenGL hiding (color,scale,translate,rotate)
|
||||||
|
|
||||||
|
import qualified SDL
|
||||||
|
|
||||||
|
doDrawing :: RenderData -> World -> IO (Word32)
|
||||||
|
doDrawing pdata w = do
|
||||||
|
sTicks <- SDL.ticks
|
||||||
|
clear [ColorBuffer,DepthBuffer]
|
||||||
|
let rot = _cameraRot w
|
||||||
|
zoom = _cameraZoom w
|
||||||
|
trans@(tranx,trany) = _cameraCenter w
|
||||||
|
wins@(winx,winy) = (_windowX w,_windowY w)
|
||||||
|
wallPointsCol = wallsPointsAndCols w
|
||||||
|
windowPoints = wallsWindows w
|
||||||
|
lightPoints = lightsForGloom' w
|
||||||
|
viewFroms@(viewFromx,viewFromy) = _cameraViewFrom w
|
||||||
|
pic = worldPictures w
|
||||||
|
wallPoints = map fst wallPointsCol
|
||||||
|
setCommonUniforms pdata rot zoom trans wins
|
||||||
|
depthFunc $= Just Less
|
||||||
|
pmat <- (newMatrix RowMajor $ perspectiveMatrix w) :: IO (GLmatrix GLfloat)
|
||||||
|
createLightMap pdata rot zoom trans wins wallPoints lightPoints viewFroms pmat
|
||||||
|
blendFuncSeparate $= ((SrcAlphaSaturate, OneMinusSrcAlpha), (Zero,One))
|
||||||
|
-- clear [DepthBuffer]
|
||||||
|
depthFunc $= Just Always
|
||||||
|
renderBackground pdata rot zoom trans wins
|
||||||
|
depthFunc $= Just Lequal
|
||||||
|
renderWalls pdata wallPointsCol pmat
|
||||||
|
setWallDepth pdata wallPoints (viewFromx,viewFromy) pmat
|
||||||
|
-- depthFunc $= Just Lequal
|
||||||
|
renderFoldable pdata $ picToLTree (Just 0) pic
|
||||||
|
-- reset blend so that light map doesn't apply
|
||||||
|
-- blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
|
||||||
|
blendFuncSeparate $= ((SrcAlpha,OneMinusSrcAlpha) , (Zero,One))
|
||||||
|
-- blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
|
||||||
|
renderFoldable pdata $ picToLTree (Just 1) pic
|
||||||
|
|
||||||
|
-- set drawing for on top
|
||||||
|
blendFuncSeparate $= ((SrcAlphaSaturate, OneMinusSrcAlpha), (Zero,One))
|
||||||
|
|
||||||
|
renderFoldable pdata $ picToLTree (Just 2) pic
|
||||||
|
|
||||||
|
depthMask $= Disabled
|
||||||
|
renderWalls pdata windowPoints pmat
|
||||||
|
depthMask $= Enabled
|
||||||
|
|
||||||
|
resetShaderUniforms (map extractProgAndUnis $ _listShaders pdata)
|
||||||
|
----------------------
|
||||||
|
blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
|
||||||
|
renderFoldable pdata (picToLTree Nothing $ fixedCoordPictures w)
|
||||||
|
eTicks <- SDL.ticks
|
||||||
|
return (eTicks - sTicks)
|
||||||
|
doDrawing' :: RenderData -> World -> IO (Word32)
|
||||||
|
doDrawing' pdata w = do
|
||||||
|
bindFramebuffer Framebuffer $= defaultFramebufferObject
|
||||||
|
sTicks <- SDL.ticks
|
||||||
|
clear [ColorBuffer,DepthBuffer]
|
||||||
|
let rot = _cameraRot w
|
||||||
|
zoom = _cameraZoom w
|
||||||
|
trans@(tranx,trany) = _cameraCenter w
|
||||||
|
wins@(winx,winy) = (_windowX w,_windowY w)
|
||||||
|
wallPointsCol = wallsPointsAndCols w
|
||||||
|
windowPoints = wallsWindows w
|
||||||
|
lightPoints = lightsForGloom' w
|
||||||
|
viewFroms@(viewFromx,viewFromy) = _cameraViewFrom w
|
||||||
|
pic = worldPictures w
|
||||||
|
wallPoints = map fst wallPointsCol
|
||||||
|
pmat <- (newMatrix RowMajor
|
||||||
|
$ perspectiveMatrix w) :: IO (GLmatrix GLfloat)
|
||||||
|
setCommonUniforms pdata rot zoom trans wins
|
||||||
|
|
||||||
|
depthMask $= Disabled
|
||||||
|
renderBackground pdata rot zoom trans wins
|
||||||
|
depthMask $= Enabled
|
||||||
|
blend $= Enabled
|
||||||
|
blendFunc $= (SrcAlpha, OneMinusSrcAlpha)
|
||||||
|
-- not sure why renderWalls and setWallDepth aren't combined
|
||||||
|
renderWalls pdata wallPointsCol pmat
|
||||||
|
setWallDepth pdata wallPoints (viewFromx,viewFromy) pmat
|
||||||
|
depthFunc $= Just Lequal
|
||||||
|
renderFoldable pdata $ picToLTree (Just 0) pic
|
||||||
|
renderFoldable pdata $ picToLTree (Just 1) pic
|
||||||
|
renderFoldable pdata $ picToLTree (Just 2) pic
|
||||||
|
eTicks <- SDL.ticks
|
||||||
|
return (eTicks - sTicks)
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
module Dodge.Rendering.HUD
|
module Dodge.Render.HUD
|
||||||
where
|
where
|
||||||
|
|
||||||
import Dodge.Data
|
import Dodge.Data
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
module Dodge.Rendering.MenuScreen
|
module Dodge.Render.MenuScreen
|
||||||
( menuScreen
|
( menuScreen
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
module Dodge.Render.PerspectiveMatrix
|
||||||
|
where
|
||||||
|
import Dodge.Data
|
||||||
|
|
||||||
|
import Geometry
|
||||||
|
|
||||||
|
import Linear.Matrix
|
||||||
|
import Linear.V4
|
||||||
|
import Graphics.Rendering.OpenGL (GLfloat)
|
||||||
|
|
||||||
|
perspectiveMatrix :: World -> [GLfloat]
|
||||||
|
perspectiveMatrix w =
|
||||||
|
let rot = _cameraRot w
|
||||||
|
zoom = _cameraZoom w
|
||||||
|
(tranx,trany) = _cameraCenter w
|
||||||
|
(winx,winy) = (_windowX w,_windowY w)
|
||||||
|
(viewFromx,viewFromy) = _cameraViewFrom w
|
||||||
|
scalMat = Linear.Matrix.transpose $ V4
|
||||||
|
(V4 (2*zoom/winx) 0 0 (0::GLfloat))
|
||||||
|
(V4 0 (2*zoom/winy) 0 0)
|
||||||
|
(V4 0 0 0.5 0) --scaled to make walls shorter
|
||||||
|
(V4 0 0 0 1)
|
||||||
|
rotMat = Linear.Matrix.transpose $
|
||||||
|
V4 (V4 (cos rot) (sin (-rot)) 0 0)
|
||||||
|
(V4 (sin rot) (cos rot) 0 0)
|
||||||
|
(V4 0 0 1 0)
|
||||||
|
(V4 0 0 0 1)
|
||||||
|
tranMat3 = Linear.Matrix.transpose $
|
||||||
|
V4 (V4 1 0 0 0)
|
||||||
|
(V4 0 1 0 0)
|
||||||
|
(V4 0 0 1 0)
|
||||||
|
(V4 (-tranx) (-trany) 0 1)
|
||||||
|
tranMat2 = Linear.Matrix.transpose $
|
||||||
|
V4 (V4 1 0 0 0)
|
||||||
|
(V4 0 1 0 0)
|
||||||
|
(V4 0 0 1 0)
|
||||||
|
(V4 (viewFromx-tranx) (viewFromy-trany) 0 1)
|
||||||
|
perMat = Linear.Matrix.transpose $
|
||||||
|
V4 (V4 1 0 0 0)
|
||||||
|
(V4 0 1 0 0)
|
||||||
|
(V4 0 0 1 1)
|
||||||
|
(V4 0 0 0 1)
|
||||||
|
tranMat1 = Linear.Matrix.transpose $
|
||||||
|
V4 (V4 1 0 0 0)
|
||||||
|
(V4 0 1 0 0)
|
||||||
|
(V4 0 0 1 0)
|
||||||
|
(V4 (-viewFromx) (-viewFromy) 0 1)
|
||||||
|
wmat = scalMat !*! rotMat !*! tranMat2 !*! perMat !*! tranMat1
|
||||||
|
vToL (V4 a b c d) = [a,b,c,d]
|
||||||
|
in concatMap vToL $ vToL wmat
|
||||||
@@ -1,29 +1,17 @@
|
|||||||
module Dodge.Rendering where
|
module Dodge.Render.Picture
|
||||||
-- imports {{{
|
where
|
||||||
import Dodge.Data
|
import Dodge.Data
|
||||||
import Dodge.Base
|
import Dodge.Base
|
||||||
--import Dodge.Inventory
|
|
||||||
|
|
||||||
import Dodge.Rendering.HUD
|
import Dodge.Render.HUD
|
||||||
import Dodge.Rendering.MenuScreen
|
import Dodge.Render.MenuScreen
|
||||||
|
|
||||||
import Geometry
|
import Geometry
|
||||||
import Picture
|
import Picture
|
||||||
|
|
||||||
import Data.Graph.Inductive.Query.DFS
|
|
||||||
import Data.Graph.Inductive.Graph
|
|
||||||
|
|
||||||
import Control.Monad.State
|
|
||||||
import Data.List
|
|
||||||
import Data.Bifunctor
|
|
||||||
|
|
||||||
import Data.Function
|
|
||||||
import Control.Applicative
|
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import qualified Data.IntMap.Strict as IM
|
import qualified Data.IntMap.Strict as IM
|
||||||
import qualified Data.Map as M
|
|
||||||
import qualified Data.Set as S
|
|
||||||
|
|
||||||
worldPictures :: World -> Picture
|
worldPictures :: World -> Picture
|
||||||
worldPictures w = pictures $ concat
|
worldPictures w = pictures $ concat
|
||||||
+5
-2
@@ -71,8 +71,11 @@ updateLightSources w = set tempLightSources (catMaybes tlss) w'
|
|||||||
updateProjectiles w = IM.foldr' _pjUpdate w $ _projectiles w
|
updateProjectiles w = IM.foldr' _pjUpdate w $ _projectiles w
|
||||||
|
|
||||||
updateParticles' :: World -> World
|
updateParticles' :: World -> World
|
||||||
updateParticles' w = set particles' (catMaybes ps) w'
|
updateParticles' w =
|
||||||
where (w',ps) = mapAccumR (\a b -> _ptUpdate' b a b) w $ _particles' w
|
--set particles' [] w
|
||||||
|
set particles' (catMaybes ps) w'
|
||||||
|
where
|
||||||
|
(w',ps) = mapAccumR (\a b -> _ptUpdate' b a b) w $ _particles' w
|
||||||
|
|
||||||
updateCreatures :: World -> World
|
updateCreatures :: World -> World
|
||||||
updateCreatures w = f $ set randGen newG $ set creatures (IM.mapMaybe id crs) w
|
updateCreatures w = f $ set randGen newG $ set creatures (IM.mapMaybe id crs) w
|
||||||
|
|||||||
@@ -40,18 +40,17 @@ wallBuffer = 3
|
|||||||
|
|
||||||
-- the following tests whether or not a point is on a wall, and if so pushes it
|
-- the following tests whether or not a point is on a wall, and if so pushes it
|
||||||
-- out from the wall
|
-- out from the wall
|
||||||
-- If the resultant push out is itself on another wall, the original point is
|
-- this is then repeated if the point ends up on a new wall
|
||||||
-- returned
|
|
||||||
collideWalls :: Float -> Point2 -> [[Point2]] -> Point2 -> Point2
|
collideWalls :: Float -> Point2 -> [[Point2]] -> Point2 -> Point2
|
||||||
collideWalls rad cp1 walls cp2
|
collideWalls rad cp1 walls cp2
|
||||||
= case (listToMaybe.mapMaybe (pushOutFromWall rad cp2)) walls of
|
= case (listToMaybe.mapMaybe (pushOutFromWall rad cp2)) walls of
|
||||||
Nothing -> cp2
|
Nothing -> cp2
|
||||||
Just cp3 -> case (listToMaybe.reverse.mapMaybe (pushOutFromWall rad cp3)) walls of
|
Just cp3 -> case (listToMaybe.reverse.mapMaybe (pushOutFromWall rad cp3)) walls of
|
||||||
Nothing -> cp3
|
Nothing -> cp3
|
||||||
Just cp4 -> cp1
|
Just cp4 -> cp4
|
||||||
|
|
||||||
-- pushes a point out from a list of walls
|
-- pushes a point out from a list of walls
|
||||||
-- if multiple new points occur, chooses the one closest to the orignal pointjk
|
-- if multiple new points occur, chooses the one closest to the orignal point
|
||||||
pushOutFromWalls :: Float -> [[Point2]] -> Point2 -> Point2
|
pushOutFromWalls :: Float -> [[Point2]] -> Point2 -> Point2
|
||||||
pushOutFromWalls rad walls p =
|
pushOutFromWalls rad walls p =
|
||||||
fromMaybe p
|
fromMaybe p
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ glareBetween t len wdth col a b w
|
|||||||
|
|
||||||
lowLightPic :: Float -> Float -> Color -> (Point2, Point2) -> World -> Picture
|
lowLightPic :: Float -> Float -> Color -> (Point2, Point2) -> World -> Picture
|
||||||
lowLightPic len wdth col (a,b) w
|
lowLightPic len wdth col (a,b) w
|
||||||
= case thingsHitLongLine a b w of
|
= case thingsHit a b w of
|
||||||
((p, E3x2 wall):_)
|
((p, E3x2 wall):_)
|
||||||
-> setCol . lineOfThickness wdth $ [alongLineBy len p wa, alongLineBy len p wb]
|
-> setCol . lineOfThickness wdth $ [alongLineBy len p wa, alongLineBy len p wb]
|
||||||
where x = len *.* (normalizeV $ wa -.- wb)
|
where x = len *.* (normalizeV $ wa -.- wb)
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ aFlameParticle t pos vel maycid = Pt'
|
|||||||
, _btHitEffect' = destroyOnImpact (doFlameDam 1) noEff noEff
|
, _btHitEffect' = destroyOnImpact (doFlameDam 1) noEff noEff
|
||||||
}
|
}
|
||||||
|
|
||||||
makeFlame :: Point2 -> Point2 -> Maybe Int -> World -> World
|
makeFlame :: Int -> Point2 -> Point2 -> Maybe Int -> World -> World
|
||||||
makeFlame pos vel maycid = over particles' (aFlameParticle 100 pos vel maycid : )
|
makeFlame t pos vel maycid = over particles' (aFlameParticle t pos vel maycid : )
|
||||||
|
|
||||||
drawFlame :: Point2 -> Particle' -> Picture
|
drawFlame :: Point2 -> Particle' -> Picture
|
||||||
drawFlame rotd pt = thePic
|
drawFlame rotd pt = thePic
|
||||||
@@ -167,6 +167,7 @@ moveFlamelet w pt
|
|||||||
& btPassThrough' .~ Nothing
|
& btPassThrough' .~ Nothing
|
||||||
& btVel' .~ 0.8 *.* vel
|
& btVel' .~ 0.8 *.* vel
|
||||||
damcrs = foldr ($) w $ map dodam $ filter closeCrs $ IM.elems $ _creatures w
|
damcrs = foldr ($) w $ map dodam $ filter closeCrs $ IM.elems $ _creatures w
|
||||||
|
-- damcrs = w
|
||||||
closeCrs cr = dist ep (_crPos cr) < _crRad cr + size
|
closeCrs cr = dist ep (_crPos cr) < _crRad cr + size
|
||||||
dodam cr = over (creatures . ix (_crID cr) . crState . crDamage)
|
dodam cr = over (creatures . ix (_crID cr) . crState . crDamage)
|
||||||
((:) $ Flaming 3 sp ep ep)
|
((:) $ Flaming 3 sp ep ep)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ thingsHit sp ep w
|
|||||||
where
|
where
|
||||||
hitCrs = IM.elems $ IM.filter (\cr -> circOnLine sp ep (_crPos cr) (_crRad cr))
|
hitCrs = IM.elems $ IM.filter (\cr -> circOnLine sp ep (_crPos cr) (_crRad cr))
|
||||||
$ _creatures w
|
$ _creatures w
|
||||||
|
-- $ creaturesAlongLine sp ep w
|
||||||
crPs = map (\cr -> ssaTriPoint ep (_crPos cr) sp (_crRad cr)) hitCrs
|
crPs = map (\cr -> ssaTriPoint ep (_crPos cr) sp (_crRad cr)) hitCrs
|
||||||
crs = zip crPs (map E3x1 hitCrs)
|
crs = zip crPs (map E3x1 hitCrs)
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ circOnLine' !p1 !p2 !c !rad = isJustTrue (fmap (\p -> magV (p -.- c) < rad) y)
|
|||||||
|
|
||||||
-- this should probably be circOnSeg
|
-- this should probably be circOnSeg
|
||||||
circOnLine :: Point2 -> Point2 -> Point2 -> Float -> Bool
|
circOnLine :: Point2 -> Point2 -> Point2 -> Float -> Bool
|
||||||
|
{-# INLINE circOnLine #-}
|
||||||
circOnLine !p1 !p2 !c !rad = magV (p1 -.- c) <= rad || magV (p2 -.- c) <= rad
|
circOnLine !p1 !p2 !c !rad = magV (p1 -.- c) <= rad || magV (p2 -.- c) <= rad
|
||||||
|| isJustTrue (fmap (\p -> magV (p -.- c) < rad) y)
|
|| isJustTrue (fmap (\p -> magV (p -.- c) < rad) y)
|
||||||
where
|
where
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ perspectiveMatrix rot zoom (tranx,trany) (winx,winy) (viewFromx,viewFromy) =
|
|||||||
let scalMat = Linear.Matrix.transpose $ V4
|
let scalMat = Linear.Matrix.transpose $ V4
|
||||||
(V4 (2*zoom/winx) 0 0 (0::GLfloat))
|
(V4 (2*zoom/winx) 0 0 (0::GLfloat))
|
||||||
(V4 0 (2*zoom/winy) 0 0)
|
(V4 0 (2*zoom/winy) 0 0)
|
||||||
(V4 0 0 0.5 0) --scale to make walls shorter
|
(V4 0 0 0.5 0) --scaled to make walls shorter
|
||||||
(V4 0 0 0 1)
|
(V4 0 0 0 1)
|
||||||
rotMat = Linear.Matrix.transpose $
|
rotMat = Linear.Matrix.transpose $
|
||||||
V4 (V4 (cos rot) (sin (-rot)) 0 0)
|
V4 (V4 (cos rot) (sin (-rot)) 0 0)
|
||||||
|
|||||||
+39
-56
@@ -1,9 +1,9 @@
|
|||||||
--{-# LANGUAGE Strict #-}
|
--{-# LANGUAGE Strict #-}
|
||||||
{-# LANGUAGE DeriveFoldable, StandaloneDeriving #-}
|
{-# LANGUAGE DeriveFoldable, StandaloneDeriving #-}
|
||||||
module Picture.Render
|
module Picture.Render
|
||||||
( renderPicture'
|
( module Picture.Render
|
||||||
, renderFoldable
|
|
||||||
, picToLTree
|
, picToLTree
|
||||||
|
-- , perspectiveMatrix
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
@@ -33,25 +33,22 @@ import qualified SDL as SDL
|
|||||||
|
|
||||||
renderPicture' :: RenderData -> Float -> Float -> Point2 -> Point2 ->
|
renderPicture' :: RenderData -> Float -> Float -> Point2 -> Point2 ->
|
||||||
[((Point2,Point2),Point4)] -> [((Point2,Point2),Point4)] -> [Point4] ->
|
[((Point2,Point2),Point4)] -> [((Point2,Point2),Point4)] -> [Point4] ->
|
||||||
(Float,Float) -> Picture -> IO (Word32,Word32)
|
(Float,Float) -> Picture -> IO (Word32)
|
||||||
renderPicture' pdata rot zoom trans@(tranx,trany) wins@(winx,winy) wallPointsCol windowPoints lightPoints
|
renderPicture' pdata rot zoom trans@(tranx,trany) wins@(winx,winy) wallPointsCol windowPoints lightPoints
|
||||||
viewFroms@(viewFromx,viewFromy) pic = do
|
viewFroms@(viewFromx,viewFromy) pic = do
|
||||||
let wallPoints = map fst wallPointsCol
|
|
||||||
startTicks <- SDL.ticks
|
startTicks <- SDL.ticks
|
||||||
|
let wallPoints = map fst wallPointsCol
|
||||||
|
|
||||||
setCommonUniforms pdata rot zoom trans wins
|
setCommonUniforms pdata rot zoom trans wins
|
||||||
|
|
||||||
depthFunc $= Just Less
|
depthFunc $= Just Less
|
||||||
|
|
||||||
-- calculate perspective matrix
|
|
||||||
pmat <- (newMatrix RowMajor
|
pmat <- (newMatrix RowMajor
|
||||||
$ perspectiveMatrix rot zoom (tranx,trany) (winx,winy) (viewFromx,viewFromy)
|
$ perspectiveMatrix rot zoom (tranx,trany) (winx,winy) (viewFromx,viewFromy)
|
||||||
) :: IO (GLmatrix GLfloat)
|
) :: IO (GLmatrix GLfloat)
|
||||||
|
|
||||||
createLightMap pdata rot zoom trans wins wallPoints lightPoints viewFroms pmat
|
createLightMap pdata rot zoom trans wins wallPoints lightPoints viewFroms pmat
|
||||||
|
|
||||||
ticksAfterLighting <- SDL.ticks
|
|
||||||
|
|
||||||
renderBackground pdata rot zoom trans wins
|
renderBackground pdata rot zoom trans wins
|
||||||
|
|
||||||
renderWalls pdata wallPointsCol pmat
|
renderWalls pdata wallPointsCol pmat
|
||||||
@@ -65,6 +62,7 @@ renderPicture' pdata rot zoom trans@(tranx,trany) wins@(winx,winy) wallPointsCol
|
|||||||
-- reset blend so that light map doesn't apply
|
-- reset blend so that light map doesn't apply
|
||||||
-- blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
|
-- blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
|
||||||
blendFuncSeparate $= ((SrcAlpha,OneMinusSrcAlpha) , (Zero,One))
|
blendFuncSeparate $= ((SrcAlpha,OneMinusSrcAlpha) , (Zero,One))
|
||||||
|
-- blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
|
||||||
renderFoldable pdata $ picToLTree (Just 1) pic
|
renderFoldable pdata $ picToLTree (Just 1) pic
|
||||||
|
|
||||||
-- set drawing for on top
|
-- set drawing for on top
|
||||||
@@ -78,7 +76,7 @@ renderPicture' pdata rot zoom trans@(tranx,trany) wins@(winx,winy) wallPointsCol
|
|||||||
|
|
||||||
resetShaderUniforms (map extractProgAndUnis $ _listShaders pdata)
|
resetShaderUniforms (map extractProgAndUnis $ _listShaders pdata)
|
||||||
endTicks <- SDL.ticks
|
endTicks <- SDL.ticks
|
||||||
return (ticksAfterLighting, endTicks - startTicks)
|
return (endTicks - startTicks)
|
||||||
|
|
||||||
renderWalls :: RenderData -> [((Point2,Point2),Point4)] -> GLmatrix GLfloat -> IO ()
|
renderWalls :: RenderData -> [((Point2,Point2),Point4)] -> GLmatrix GLfloat -> IO ()
|
||||||
renderWalls pdata wps pmat = do
|
renderWalls pdata wps pmat = do
|
||||||
@@ -116,22 +114,23 @@ createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
|
|||||||
(viewFromx,viewFromy) pmat = do
|
(viewFromx,viewFromy) pmat = do
|
||||||
|
|
||||||
bindFramebuffer Framebuffer $= (_spareFBO pdata)
|
bindFramebuffer Framebuffer $= (_spareFBO pdata)
|
||||||
clearColor $= Color4 0 0.5 0 1
|
-- clear buffer to full alpha and furthest depth
|
||||||
depthFunc $= Just Less
|
clearColor $= Color4 0 0 0 1
|
||||||
clearDepth $= 1
|
clearDepth $= 1
|
||||||
clear [ColorBuffer,DepthBuffer]
|
clear [ColorBuffer,DepthBuffer]
|
||||||
|
depthFunc $= Just Less
|
||||||
|
-- store wall and light positions into buffer
|
||||||
nWallLights <- F.foldM (pokeShader $ _wallLightShader pdata) wallPoints
|
nWallLights <- F.foldM (pokeShader $ _wallLightShader pdata) wallPoints
|
||||||
bindShaderBuffers [_wallLightShader pdata] [nWallLights]
|
bindShaderBuffers [_wallLightShader pdata] [nWallLights]
|
||||||
|
nWalls <- F.foldM (pokeShader $ _wallShadowShader pdata) wallPoints
|
||||||
|
bindShaderBuffers [_wallShadowShader pdata] [nWalls]
|
||||||
|
-- set uniforms for shader that draws lights
|
||||||
currentProgram $= Just (_shaderProgram $ _wallLightShader pdata)
|
currentProgram $= Just (_shaderProgram $ _wallLightShader pdata)
|
||||||
uniform ( (fromJust $ _shaderCustomUnis $ _wallLightShader pdata) !! 1)
|
uniform ( (fromJust $ _shaderCustomUnis $ _wallLightShader pdata) !! 1)
|
||||||
$= pmat
|
$= pmat
|
||||||
|
-- draw walls from your point of view in order to set z buffer
|
||||||
nWalls <- F.foldM (pokeShader $ _wallShadowShader pdata) wallPoints
|
colorMask $= (Color4 Disabled Disabled Disabled Disabled)
|
||||||
bindShaderBuffers [_wallShadowShader pdata] [nWalls]
|
|
||||||
|
|
||||||
let (tx,ty) = (tranx,trany) -.- (viewFromx,viewFromy)
|
let (tx,ty) = (tranx,trany) -.- (viewFromx,viewFromy)
|
||||||
|
|
||||||
currentProgram $= Just (_shaderProgram $ _wallShadowShader pdata)
|
currentProgram $= Just (_shaderProgram $ _wallShadowShader pdata)
|
||||||
uniform (head $ fromJust $ _shaderCustomUnis $ _wallShadowShader pdata)
|
uniform (head $ fromJust $ _shaderCustomUnis $ _wallShadowShader pdata)
|
||||||
$= Vector2 viewFromx viewFromy
|
$= Vector2 viewFromx viewFromy
|
||||||
@@ -141,81 +140,65 @@ createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
|
|||||||
$= (0 :: Float)
|
$= (0 :: Float)
|
||||||
cullFace $= Just Back
|
cullFace $= Just Back
|
||||||
drawShader (_wallShadowShader pdata) nWalls
|
drawShader (_wallShadowShader pdata) nWalls
|
||||||
|
-- for each of the lights:
|
||||||
|
-- stencil out the walls from this light's point of view
|
||||||
|
-- draw fading lightmap circles on the floor
|
||||||
|
-- draw fading lightmaps on the walls
|
||||||
depthMask $= Disabled
|
depthMask $= Disabled
|
||||||
blendFunc $= (Zero, OneMinusSrcAlpha)
|
blendFunc $= (Zero, OneMinusSrcAlpha)
|
||||||
-- blendFuncSeparate $= ((Zero,Zero),(Zero, OneMinusSrcAlpha))
|
|
||||||
stencilTest $= Enabled
|
stencilTest $= Enabled
|
||||||
forM_ lightPoints $ \(x,y,r,lum) -> do
|
forM_ lightPoints $ \(x,y,r,lum) -> do
|
||||||
-- depthFunc $= Just Less
|
-- bind buffer for floor light circle
|
||||||
colorMask $= (Color4 Disabled Disabled Disabled Disabled)
|
|
||||||
clear [StencilBuffer]
|
|
||||||
cullFace $= Just Back
|
|
||||||
-- stencilOp $= (OpKeep,OpKeep,OpReplace)
|
|
||||||
stencilOp $= (OpKeep,OpKeep,OpIncr)
|
|
||||||
stencilFunc $= (Always, 0, 255)
|
|
||||||
-- currentProgram does get called twice: here and inside drawShader below
|
|
||||||
currentProgram $= Just (_shaderProgram $ _wallShadowShader pdata)
|
|
||||||
uniform (head $ fromJust $ _shaderCustomUnis $ _wallShadowShader pdata)
|
|
||||||
$= Vector2 x y
|
|
||||||
-- blendFunc $= (Zero,One)
|
|
||||||
drawShader (_wallShadowShader pdata) nWalls
|
|
||||||
|
|
||||||
cullFace $= Just Front
|
|
||||||
stencilOp $= (OpKeep,OpKeep,OpDecr)
|
|
||||||
drawShader (_wallShadowShader pdata) nWalls
|
|
||||||
|
|
||||||
cullFace $= Nothing
|
|
||||||
|
|
||||||
colorMask $= (Color4 Enabled Enabled Enabled Enabled)
|
|
||||||
let lightPtr = (\(_,ptr,_) -> ptr) $ head
|
let lightPtr = (\(_,ptr,_) -> ptr) $ head
|
||||||
$ _vaoBufferTargets $ _shaderVAO $ _lightSourceShader pdata
|
$ _vaoBufferTargets $ _shaderVAO $ _lightSourceShader pdata
|
||||||
(x',y') = zTran $ rotateV (0 - rot) $ (x,y) -.- (tranx,trany)
|
(x',y') = zTran $ rotateV (0 - rot) $ (x,y) -.- (tranx,trany)
|
||||||
zTran (a,b) = (a*2*zoom / winx, b*2*zoom / winy)
|
zTran (a,b) = (a*2*zoom / winx, b*2*zoom / winy)
|
||||||
pokeFourOff lightPtr 0 (x',y',r,lum)
|
pokeFourOff lightPtr 0 (x',y',r,lum)
|
||||||
|
-- stencil out walls
|
||||||
|
colorMask $= (Color4 Disabled Disabled Disabled Disabled)
|
||||||
|
clear [StencilBuffer]
|
||||||
|
cullFace $= Just Back
|
||||||
|
stencilOp $= (OpKeep,OpKeep,OpIncr)
|
||||||
|
stencilFunc $= (Always, 0, 255)
|
||||||
|
currentProgram $= Just (_shaderProgram $ _wallShadowShader pdata)
|
||||||
|
uniform (head $ fromJust $ _shaderCustomUnis $ _wallShadowShader pdata)
|
||||||
|
$= Vector2 x y
|
||||||
|
drawShader (_wallShadowShader pdata) nWalls
|
||||||
|
cullFace $= Just Front
|
||||||
|
stencilOp $= (OpKeep,OpKeep,OpDecr)
|
||||||
|
drawShader (_wallShadowShader pdata) nWalls
|
||||||
|
-- draw floor light circles
|
||||||
|
cullFace $= Nothing
|
||||||
|
colorMask $= (Color4 Disabled Disabled Disabled Enabled)
|
||||||
bindShaderBuffers [_lightSourceShader pdata] [1]
|
bindShaderBuffers [_lightSourceShader pdata] [1]
|
||||||
stencilFunc $= (Equal, 0, 255)
|
stencilFunc $= (Equal, 0, 255)
|
||||||
drawShader (_lightSourceShader pdata) 1
|
drawShader (_lightSourceShader pdata) 1
|
||||||
|
-- draw wall light "circles"
|
||||||
currentProgram $= Just (_shaderProgram $ _wallLightShader pdata)
|
currentProgram $= Just (_shaderProgram $ _wallLightShader pdata)
|
||||||
uniform (head $ fromJust $ _shaderCustomUnis $ _wallLightShader pdata)
|
uniform (head $ fromJust $ _shaderCustomUnis $ _wallLightShader pdata)
|
||||||
$= Vector2 x y
|
$= Vector2 x y
|
||||||
uniform ( (fromJust $ _shaderCustomUnis $ _wallLightShader pdata) !! 2)
|
uniform ( (fromJust $ _shaderCustomUnis $ _wallLightShader pdata) !! 2)
|
||||||
$= Vector2 r lum
|
$= Vector2 r lum
|
||||||
drawShader (_wallLightShader pdata) nWallLights
|
drawShader (_wallLightShader pdata) nWallLights
|
||||||
|
|
||||||
depthMask $= Enabled
|
depthMask $= Enabled
|
||||||
cullFace $= Nothing
|
cullFace $= Nothing
|
||||||
stencilTest $= Disabled
|
stencilTest $= Disabled
|
||||||
|
|
||||||
blend $= Disabled
|
blend $= Disabled
|
||||||
|
|
||||||
-- blendFunc $= (Zero,One)
|
|
||||||
bindFramebuffer Framebuffer $= defaultFramebufferObject
|
bindFramebuffer Framebuffer $= defaultFramebufferObject
|
||||||
|
|
||||||
colorMask $= (Color4 Disabled Disabled Disabled Enabled)
|
colorMask $= (Color4 Disabled Disabled Disabled Enabled)
|
||||||
--
|
|
||||||
-- blendFunc $= (SrcAlpha, OneMinusSrcAlpha)
|
|
||||||
bindShaderBuffers [_fullscreenShader pdata] [4]
|
bindShaderBuffers [_fullscreenShader pdata] [4]
|
||||||
textureBinding Texture2D $= Just (_fboTexture pdata)
|
textureBinding Texture2D $= Just (_fboTexture pdata)
|
||||||
-- blendFunc $= (One, Zero)
|
|
||||||
drawShader (_fullscreenShader pdata) 4
|
drawShader (_fullscreenShader pdata) 4
|
||||||
|
|
||||||
colorMask $= (Color4 Enabled Enabled Enabled Enabled)
|
colorMask $= (Color4 Enabled Enabled Enabled Enabled)
|
||||||
|
|
||||||
blend $= Enabled
|
blend $= Enabled
|
||||||
|
|
||||||
renderBackground :: RenderData -> Float -> Float -> (Float,Float) -> (Float,Float) -> IO ()
|
renderBackground :: RenderData -> Float -> Float -> (Float,Float) -> (Float,Float) -> IO ()
|
||||||
renderBackground pdata rot zoom (tranx,trany) (winx,winy) = do
|
renderBackground pdata rot zoom (tranx,trany) (winx,winy) = do
|
||||||
depthFunc $= Just Less
|
-- depthFunc $= Just Less
|
||||||
|
|
||||||
-- set drawing for on top
|
-- set drawing for on top
|
||||||
blendFuncSeparate $= ((SrcAlphaSaturate, OneMinusSrcAlpha), (Zero,One))
|
--blendFuncSeparate $= ((SrcAlphaSaturate, OneMinusSrcAlpha), (Zero,One))
|
||||||
clear [DepthBuffer]
|
|
||||||
|
|
||||||
-- draw background
|
-- draw background
|
||||||
bindArrayBuffers 1 $ _vaoBufferTargets $ _shaderVAO $ _backgroundShader pdata
|
bindArrayBuffers 1 $ _vaoBufferTargets $ _shaderVAO $ _backgroundShader pdata
|
||||||
|
|
||||||
currentProgram $= Just (_shaderProgram $ _backgroundShader pdata)
|
currentProgram $= Just (_shaderProgram $ _backgroundShader pdata)
|
||||||
bindVertexArrayObject $= Just (_vao $ _shaderVAO $ _backgroundShader pdata)
|
bindVertexArrayObject $= Just (_vao $ _shaderVAO $ _backgroundShader pdata)
|
||||||
let backPtr = (\(_,x,_) -> x) $ head $ _vaoBufferTargets $ _shaderVAO $ _backgroundShader pdata
|
let backPtr = (\(_,x,_) -> x) $ head $ _vaoBufferTargets $ _shaderVAO $ _backgroundShader pdata
|
||||||
|
|||||||
Reference in New Issue
Block a user