-- | Getting the window size geometry. module Dodge.Base.Window ( halfWidth, halfHeight, screenPolygon, screenPolygonBord, screenBox, pointIsOnScreen, ) where import Linear import Control.Lens import Dodge.Data.Camera import Dodge.Data.Config import Geometry -- | A box covering the screen in world coordinates screenPolygon :: Config -> Camera -> [Point2] screenPolygon cfig w = map (scTran . scRot . scZoom) $ screenBox cfig where scRot = rotateV (w ^. camRot) scZoom p | (w ^. camZoom) /= 0 = (1 / (w ^. camZoom)) *^ p | otherwise = p scTran p = p + (w ^. camCenter) -- | A box covering the screen in world coordinates, with a x and y border screenPolygonBord :: -- | X border Float -> -- | Y border Float -> Config -> Camera -> [Point2] screenPolygonBord xbord ybord cfig w = [tr, tl, bl, br] where hw = halfWidth cfig - xbord hh = halfHeight cfig - ybord scZoom p | (w ^. camZoom) /= 0 = (1 / (w ^. camZoom)) *^ p | otherwise = p theTransform = (+ (w ^. camCenter)) . rotateV (w ^. camRot) . scZoom tr = theTransform (V2 hw hh) tl = theTransform (V2 (- hw) hh) br = theTransform (V2 hw (- hh)) bl = theTransform (V2 (- hw) (- hh)) halfWidth, halfHeight :: Config -> Float halfWidth = (0.5 *) . windowXFloat halfHeight = (0.5 *) . windowYFloat -- | A box of the size of the screen in screen centered coordinates screenBox :: Config -> [Point2] screenBox w = rectNSWE hh (- hh) (- hw) hw where hw = halfWidth w hh = halfHeight w pointIsOnScreen :: Config -> Camera -> Point2 -> Bool pointIsOnScreen cfig = flip pointInPoly . screenPolygon cfig