content: -- |
  -- Module      :  HGE2D.GlFunctions
  -- Copyright   :  (c) 2016 Martin Buck
  -- License     :  see LICENSE
  --
  -- Containing functions used to interact with OpenGL
  
  module HGE2D.GlFunctions where
  
  import HGE2D.Types
  import HGE2D.Datas
  import HGE2D.Geometry
  
  import qualified Graphics.Rendering.OpenGL as GL
  
  --------------------------------------------------------------------------------
  
  -- | Renders a RGB color
  colorRGB :: GlColorRGB -> IO ()
  colorRGB (r, g, b) = GL.color $ col3 r g b
    where
      col3 :: GL.GLfloat -> GL.GLfloat -> GL.GLfloat -> GL.Color3 GL.GLfloat
      col3 f1 f2 f3 = GL.Color3 f1 f2 f3
  
  -- | Renders a RGBA color
  colorRGBA :: GlColorRGBA -> IO ()
  colorRGBA (r, g, b, a) = GL.color $ col4 r g b a
    where
      col4 :: GL.GLfloat -> GL.GLfloat -> GL.GLfloat -> GL.GLfloat -> GL.Color4 GL.GLfloat
      col4 f1 f2 f3 f4 = GL.Color4 f1 f2 f3 f4
  
  -- | Adds an alpha value to a RGB color, turning it into a RGBA color
  addAlpha :: GL.GLfloat -> GlColorRGB -> GlColorRGBA
  addAlpha a (r, g, b) = (r, g, b, a)
  
  --------------------------------------------------------------------------------
  
  -- | Sends a translation instruction to OpenGL
  translate2 :: GlPosX -> GlPosY -> IO ()
  translate2 x y = GL.translate $ point3 x y 0.0
  
  -- | Sends a scale instruction to OpenGL
  scale2 :: GlScaleX -> GlScaleY -> IO ()
  scale2 x y = GL.scale x y 1.0
  
  --------------------------------------------------------------------------------
  
  -- | Transforms a string to a RenderInstruction
  text :: String -> RenderInstruction
  text str = RenderText str
  
  --------------------------------------------------------------------------------
  
  -- | Sends a rotation instruction to OpenGL
  rotate2 :: Double -> IO ()
  rotate2 rad = rotTmp (realToFrac $ rad2deg rad)
    where
      rotTmp :: GL.GLfloat -> IO ()
      rotTmp deg = GL.rotate deg $ GL.Vector3 0 0 1
  
  --------------------------------------------------------------------------------
  
  -- | Builds a GLPoint2
  point2 :: GlPosX -> GlPosY -> GlPoint2
  point2 f1 f2 = GL.Vertex2 f1 f2
  
  -- | Builds a GLPoint3
  point3 :: GlPosX -> GlPosY -> GlPosZ -> GlPoint3
  point3 f1 f2 f3 = GL.Vector3 f1 f2 f3
  
  -- | Builds a GLVer3
  vertex3 :: GlPosX -> GlPosY -> GlPosZ -> GlVer3
  vertex3 f1 f2 f3 = GL.Vertex3 f1 f2 f3
  