packages feed

starrover2-0.0.9: src/Camera.hs

module Camera
where

import Graphics.Rendering.OpenGL as OpenGL

import OpenGLUtils

type Camera = ((GLdouble, GLdouble), (GLdouble, GLdouble))

setCamera :: Camera -> IO ()
setCamera ((minx, miny), (diffx, diffy)) = do
  matrixMode $= Projection
  loadIdentity
  ortho minx (minx + diffx) miny (miny + diffy) (-10) 10
  matrixMode $= Modelview 0

setZoom :: GLdouble -> Camera -> Camera
setZoom z ((minx, miny), (diffx, diffy)) =
  let ndiffx = z
      ndiffy = z * (diffy / diffx)
      ocent = (minx + diffx / 2, miny + diffy / 2, 0)
  in setCentre ocent ((0, 0), (ndiffx, ndiffy))

setCentre :: GLvector3 -> Camera -> Camera
setCentre (nx, ny, _) ((_, _), (diffx, diffy)) =
  ((nx - diffx / 2, ny - diffy / 2), (diffx, diffy))

data CameraState = CameraState {
    camera :: Camera
  , camzoom :: GLdouble
  , camzoomdelta :: GLdouble
  }

modCamera :: (Camera -> Camera) -> CameraState -> CameraState
modCamera f t = t{camera = f (camera t)}

modCamZoom :: (GLdouble -> GLdouble) -> CameraState -> CameraState
modCamZoom f t = t{camzoom = f (camzoom t)}

modCamZoomDelta :: (GLdouble -> GLdouble) -> CameraState -> CameraState
modCamZoomDelta f t = t{camzoomdelta = f (camzoomdelta t)}