gloss-rendering-1.9.1.1: Graphics/Gloss/Data/ViewPort.hs
module Graphics.Gloss.Data.ViewPort
( ViewPort(..)
, viewPortInit
, applyViewPortToPicture
, invertViewPort )
where
import Graphics.Gloss.Data.Vector
import Graphics.Gloss.Geometry.Angle
import Graphics.Gloss.Data.Picture (Picture(..))
import Graphics.Gloss.Data.Point
-- | The 'ViewPort' represents the global transformation applied to the displayed picture.
-- When the user pans, zooms, or rotates the display then this changes the 'ViewPort'.
data ViewPort
= ViewPort {
-- | Global translation.
viewPortTranslate :: !(Float, Float)
-- | Global rotation (in degrees).
, viewPortRotate :: !Float
-- | Global scaling (of both x and y coordinates).
, viewPortScale :: !Float
}
-- | The initial state of the viewport.
viewPortInit :: ViewPort
viewPortInit
= ViewPort
{ viewPortTranslate = (0, 0)
, viewPortRotate = 0
, viewPortScale = 1
}
-- | Translates, rotates, and scales an image according to the 'ViewPort'.
applyViewPortToPicture :: ViewPort -> Picture -> Picture
applyViewPortToPicture
ViewPort { viewPortScale = scale
, viewPortTranslate = (transX, transY)
, viewPortRotate = rotate }
= Scale scale scale . Rotate rotate . Translate transX transY
-- | Takes a point using screen coordinates, and uses the `ViewPort` to convert
-- it to Picture coordinates. This is the inverse of `applyViewPortToPicture`
-- for points.
invertViewPort :: ViewPort -> Point -> Point
invertViewPort
ViewPort { viewPortScale = scale
, viewPortTranslate = trans
, viewPortRotate = rotate }
pos
= rotateV (degToRad rotate) (mulSV (1 / scale) pos) - trans