{-# OPTIONS_HADDOCK hide #-}
module Graphics.Gloss.Internals.Render.Common where

import Graphics.Gloss.Internals.Interface.Backend
import	Graphics.Rendering.OpenGL					(($=))
import qualified Graphics.Rendering.OpenGL.GL	as GL
import Unsafe.Coerce
import Data.IORef

-- | The OpenGL library doesn't seem to provide a nice way convert
--	a Float to a GLfloat, even though they're the same thing
--	under the covers.  
--
--  Using realToFrac is too slow, as it doesn't get fused in at
--	least GHC 6.12.1
--
gf :: Float -> GL.GLfloat
{-# INLINE gf #-}
gf x = unsafeCoerce x

-- | Used for similar reasons to above
gsizei :: Int -> GL.GLsizei
{-# INLINE gsizei #-}
gsizei x = unsafeCoerce x

-- | Perform a rendering action setting up the coords first
renderAction
	:: Backend a
	=> IORef a
	-> IO ()
	-> IO ()

renderAction backendRef action
 = do
 	GL.matrixMode	$= GL.Projection
	GL.preservingMatrix
	 $ do
		-- setup the co-ordinate system
	 	GL.loadIdentity
		(sizeX, sizeY) 	<- getWindowDimensions backendRef
		let (sx, sy)	= (fromIntegral sizeX / 2, fromIntegral sizeY / 2)

		GL.ortho (-sx) sx (-sy) sy 0 (-100)
	
		-- draw the world
		GL.matrixMode 	$= GL.Modelview 0
		action

		GL.matrixMode	$= GL.Projection
	
	GL.matrixMode	$= GL.Modelview 0