-- | Helpers for working with OpenGL viewports.
module Graphics.GLUtil.Viewport where
import Control.Monad.IO.Class
import Graphics.Rendering.OpenGL

-- | @withViewport pos sz m@ runs the action @m@ after setting the
-- viewport with the given 'Position' and 'Size'. The viewport is
-- reset to its original state after the action is run, and the result
-- of the action is returned.
withViewport :: MonadIO m => Position -> Size -> m a -> m a
withViewport :: Position -> Size -> m a -> m a
withViewport p :: Position
p s :: Size
s m :: m a
m = do (Position, Size)
oldVP <- IO (Position, Size) -> m (Position, Size)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Position, Size) -> m (Position, Size))
-> IO (Position, Size) -> m (Position, Size)
forall a b. (a -> b) -> a -> b
$ do (Position, Size)
oldVP <- StateVar (Position, Size) -> IO (Position, Size)
forall t a (m :: * -> *). (HasGetter t a, MonadIO m) => t -> m a
get StateVar (Position, Size)
viewport
                                             StateVar (Position, Size)
viewport StateVar (Position, Size) -> (Position, Size) -> IO ()
forall t a (m :: * -> *).
(HasSetter t a, MonadIO m) =>
t -> a -> m ()
$= (Position
p,Size
s)
                                             (Position, Size) -> IO (Position, Size)
forall (m :: * -> *) a. Monad m => a -> m a
return (Position, Size)
oldVP
                        a
r <- m a
m
                        IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ StateVar (Position, Size)
viewport StateVar (Position, Size) -> (Position, Size) -> IO ()
forall t a (m :: * -> *).
(HasSetter t a, MonadIO m) =>
t -> a -> m ()
$= (Position, Size)
oldVP
                        a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
r