{-|
  This module provides a unified API for specifying every kind of rendering
  datatype and how they get rendered. All of this -- of course -- is only in
  the scope the spice project.
-}
module FRP.Spice.Graphics.Element ( Element (..)
                                  , renderElement
                                  ) where

--------------------
-- Global Imports --
import Graphics.Rendering.OpenGL
import Control.Monad

-------------------
-- Local Imports --
import FRP.Spice.Graphics.Utils
import FRP.Spice.Math

----------
-- Code --

{-|
  A type to purely contain the information for any kind of render call (that
  has been implemented so far.)
-}
data Element = RenderPrimitive PrimitiveMode [Vector Float]
             | RenderSprite (Vector Float) (Vector Float) Float
             | SetColor Float Float Float Float

{-|
  Converting an @'Element'@ into its matching OpenGL call.
-}
renderElement :: Element -> IO ()
renderElement (RenderPrimitive mode vertecies) =
  renderPrimitive mode $
    forM_ vertecies $ \(Vector x y) ->
      vertex $ Vertex2 (togl x) (togl y)
renderElement (RenderSprite pos size rot) = return ()
renderElement (SetColor r g b a) =
  color $ Color4 (togl r) (togl g) (togl b) (togl a)