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