module Dodge.Base.Coordinate where
import Dodge.Data
import Dodge.Base.WinScale

import Geometry
{- | Transform coordinates from world position to screen coordinates.  -}
worldPosToScreenNorm :: Configuration -> World -> Point2 -> Point2
worldPosToScreenNorm cfig w = doWindowScale cfig . doRotate . doZoom . doTranslate
  where
    doTranslate p = p -.- _cameraCenter w
    doZoom p      = _cameraZoom w *.* p
    doRotate p    = rotateV (negate $ _cameraRot w) p
{- | Transform world coordinates to scaled screen coordinates. 
 - These have to be scaled according to the size of the window to get actual screen positions.
 - This allows for line thicknesses etc to correspond to pixel sizes.-}
worldPosToScreen :: World -> Point2 -> Point2
worldPosToScreen w 
    = rotateV (negate $ _cameraRot w) 
    . (_cameraZoom w *.*)
    . (-.- _cameraCenter w)
{- | Transform coordinates from the map position to screen
coordinates.  -}
cartePosToScreen :: Configuration -> World -> Point2 -> Point2
cartePosToScreen cfig w = doWindowScale cfig . doRotate . doZoom . doTranslate
  where
    doTranslate p       = p -.- _carteCenter (_hud w)
    doZoom p            = _carteZoom (_hud w) *.* p
    doRotate p          = rotateV (negate $ _carteRot (_hud w)) p
crToMousePosOffset :: Creature -> World -> (Point2,Float)
crToMousePosOffset cr w = (mouseWorldPos w -.- _crPos cr,0)
{- | The mouse position in world coordinates.  -}
mouseWorldPos :: World -> Point2
mouseWorldPos w = _cameraCenter w +.+ (1/_cameraZoom w) *.* rotateV (_cameraRot w) (_mousePos w)
{- | The mouse position in map coordinates -}
mouseCartePos :: World -> Point2
mouseCartePos w = _carteCenter (_hud w) +.+ (1/_carteZoom (_hud w)) 
    *.* rotateV (_carteRot (_hud w)) (_mousePos w)
