{-# OPTIONS_GHC -Wall #-}

module Vis.Camera ( Camera0(..)
                  , Camera(..)
                  , makeCamera
                  ) where

import Data.IORef ( IORef, newIORef )
import Graphics.UI.GLUT ( GLdouble, GLint )

data Camera0 = Camera0 { phi0 :: GLdouble
                       , theta0 :: GLdouble
                       , rho0 :: GLdouble
                       }

data Camera = Camera { phi :: IORef GLdouble
                     , theta :: IORef GLdouble
                     , rho :: IORef GLdouble
                     , x0c :: IORef GLdouble
                     , y0c :: IORef GLdouble
                     , z0c :: IORef GLdouble
                     , ballX :: IORef GLint
                     , ballY :: IORef GLint 
                     , leftButton :: IORef GLint
                     , rightButton :: IORef GLint
                     }

makeCamera :: Camera0 -> IO Camera
makeCamera camera0 = do
  phi'   <- newIORef $ phi0 camera0
  theta' <- newIORef $ theta0 camera0
  rho'   <- newIORef $ rho0 camera0
  x0    <- newIORef 0
  y0    <- newIORef 0
  z0    <- newIORef 0
  ballX'  <- newIORef (-1)
  ballY'  <- newIORef (-1)
  leftButton' <- newIORef 0
  rightButton' <- newIORef 0
  return Camera { phi = phi'
                , theta = theta'
                , rho = rho'
                , x0c = x0
                , y0c = y0
                , z0c = z0
                , ballX = ballX'
                , ballY = ballY'
                , leftButton = leftButton'
                , rightButton = rightButton'
                }