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)}