60 lines
1.8 KiB
Haskell
60 lines
1.8 KiB
Haskell
module Dodge.Particle.Draw where
|
|
import Dodge.Data
|
|
import Geometry
|
|
import Picture
|
|
|
|
drawParticle :: Particle -> Picture
|
|
drawParticle pt = case pt of
|
|
Shockwave {} -> drawShockwave pt
|
|
PtInvShockwave {} -> drawInverseShockwave pt
|
|
PtTeslaArc {} -> drawTeslaArc pt
|
|
PtTargetLaser {} -> drawTargetLaser pt
|
|
ShockLine {} -> drawSonicWave pt
|
|
|
|
drawShockwave :: Particle -> Picture
|
|
drawShockwave pt = setDepth 20
|
|
. setLayer BloomLayer
|
|
. uncurryV translate (_ptPos pt)
|
|
. color (_ptColor pt)
|
|
$ thickCircle rad thickness
|
|
where
|
|
r = _ptRad pt
|
|
thickness = tFraction**2 * r
|
|
rad = r - (3/4) * r * tFraction
|
|
tFraction = fromIntegral (_ptTimer pt) / fromIntegral (_ptMaxTime pt)
|
|
|
|
drawInverseShockwave :: Particle -> Picture
|
|
drawInverseShockwave pt
|
|
= setLayer BloomLayer $ setDepth 20 $ uncurryV translate p
|
|
$ color cyan $ thickCircle rad thickness
|
|
where
|
|
p = _ptPos pt
|
|
r = _ptRad pt
|
|
t = _ptTimer pt
|
|
rad = r - 0.1 * r * fromIntegral (10 - t)
|
|
thickness = fromIntegral (10 - t) **2 * rad / 40
|
|
|
|
drawTeslaArc :: Particle -> Picture
|
|
drawTeslaArc pt = setLayer BloomNoZWrite $ pictures
|
|
[ setDepth 20.5 $ color (brightX 2 1 $ _ptColor pt) $ thickLine 3 ps
|
|
, setDepth 20 $ color (V4 0 0 0 0.5) $ thickLine 10 ps
|
|
]
|
|
where
|
|
ps = _ptPoints pt
|
|
|
|
drawTargetLaser :: Particle -> Picture
|
|
drawTargetLaser pt = setLayer BloomNoZWrite $ pictures
|
|
[ setDepth 19 . color (brightX 0 0.5 col) $ thickLine 5 (sp:ps)
|
|
, setDepth 19.5 . color (brightX 5 1 col) $ thickLine 1 (sp:ps)
|
|
]
|
|
where
|
|
col = _ptColor pt
|
|
(sp:ps) = _ptPoints pt
|
|
|
|
drawSonicWave :: Particle -> Picture
|
|
drawSonicWave pt = foldMap (color (_ptColor pt) . setLayer BloomNoZWrite . setDepth 20
|
|
. lineThick 20
|
|
. map fst)
|
|
$ _ptPointDirs pt
|
|
|