module Dodge.Placement.Instance.LightSource.Cover where import Dodge.Data import Dodge.Base import Geometry.Data import ShapePicture import Shape import Geometry import Control.Lens lampCover :: Float -> Prop lampCover h = ShapeProp { _pjPos = V2 0 0 , _pjID = 0 , _pjRot = 0 , _pjUpdate = rotateProp 0.15 , _prDraw = drawLampCover h , _prToggle = True } lampCoverWhen :: (World -> Bool) -> Point2 -> Float -> Prop lampCoverWhen cond pos h = ShapeProp { _pjPos = pos , _pjID = 0 , _pjRot = 0 , _pjUpdate = setToggle cond `dbArgChain` rotateProp 0.15 , _prDraw = drawLampCover h , _prToggle = True } doubleLampCover :: Float -> Prop doubleLampCover h = ShapeProp { _pjPos = V2 0 0 , _pjID = 0 , _pjRot = 0 , _pjUpdate = rotateProp 0.15 , _prDraw = drawDoubleLampCover h , _prToggle = True } -- on the current (27/9/21) version of shadow stencilling, this glitches -- slightly when the shadow rotates towards the screen verticalLampCover :: Float -> Prop verticalLampCover h = ShapeProp { _pjPos = V2 0 0 , _pjID = 0 , _pjRot = 0 , _pjUpdate = rotateProp 0.15 , _prDraw = drawVerticalLampCover h , _prToggle = True } rotateProp :: Float -> Prop -> World -> World rotateProp rotAmount pr w = w & props . ix (_pjID pr) . pjRot +~ rotAmount setToggle :: (World -> Bool) -> Prop -> World -> World setToggle cond pr w = w & props . ix (_pjID pr) . prToggle .~ cond w drawLampCover :: Float -> Prop -> SPic drawLampCover h pr | not (_prToggle pr) = mempty | otherwise = ( translateSHz (h-2.5) . uncurryV translateSHf pos $ rotateSH a $ mconcat [ translateSHz 1 . upperPrismPoly 1 $ rectNSEW 3 2 3 (-1) , translateSHz 1 . upperPrismPoly 1 $ rectNSEW 3 (-1) 3 2 , translateSHz 2 . upperPrismPoly 1 $ rectNSEW 3 2 3 (-1) , translateSHz 2 . upperPrismPoly 1 $ rectNSEW 3 (-1) 3 2 , upperPrismPoly 1 [V2 2 2,V2 (-1) 2,V2 2 (-1)] ] , mempty ) where a = _pjRot pr pos = _pjPos pr drawDoubleLampCover :: Float -> Prop -> SPic drawDoubleLampCover h pr = ( translateSHz (h-2.5) . uncurryV translateSHf pos $ rotateSH a $ mconcat [ upperPrismPoly 5 $ rectNSEW 6 5 6 (-6) , upperPrismPoly 5 $ rectNSEW (-5) (-6) 6 (-6) , upperPrismPoly 1 [V2 0 (-1),V2 6 5,V2 (-6) 5] , upperPrismPoly 1 [V2 0 1 ,V2 (-6) (-5),V2 6 (-5)] ] , mempty ) where a = _pjRot pr pos = _pjPos pr drawVerticalLampCover :: Float -> Prop -> SPic drawVerticalLampCover h pr = ( translateSHz h . uncurryV translateSHf pos $ rotateSHx a $ mconcat [ translateSHz (-3) . upperPrismPoly 1 $ rectNSEW 2 (-2) 5 (-5) ] , mempty ) where a = _pjRot pr pos = _pjPos pr