module RenderRubik where 

import Graphics.Rendering.OpenGL as OpenGL hiding (Red,Green,Blue)
import Graphics.UI.GLUT  as GLUT hiding (Red,Green,Blue)

import PointsForRendering
import RubikLogic
import RubikFace
import Squares

_FIELD_WIDTH :: GLfloat
_FIELD_WIDTH = 1/3

renderCube (Rubik front top back bottom left right) = do
 render RubikLogic.Top     top
 render RubikLogic.Back    back
 render RubikLogic.Front   front
 render RubikLogic.Bottom  bottom
 render RubikLogic.Left    left
 render RubikLogic.Right   right

render Top    cs = preservingMatrix$do
  translate $Vector3 (1.5*_FIELD_WIDTH) 0 0
  rotate (90)$Vector3  0 1 (0::GLfloat)
  renderCubeSide cs

render RubikLogic.Back   cs = preservingMatrix$ do
  translate $Vector3 0 0 (-1.5*_FIELD_WIDTH)
  rotate (180)$Vector3 0 0 (1::GLfloat)
  rotate (180)$Vector3 1 0 (0::GLfloat)
  renderCubeSide cs

render Bottom cs = preservingMatrix$ do
  translate $Vector3  (-1.5*_FIELD_WIDTH) 0 0
  rotate (270)$Vector3  0 1 (0::GLfloat)
  renderCubeSide cs

render RubikLogic.Front  cs = preservingMatrix$ do
  translate $Vector3 0 0 (1.5*_FIELD_WIDTH)
  renderCubeSide cs

render RubikLogic.Left   cs = preservingMatrix$ do
  translate $Vector3 0 (1.5*_FIELD_WIDTH)  0
  rotate (270) $Vector3 1 0 (0::GLfloat)
  renderCubeSide cs

render RubikLogic.Right  cs = preservingMatrix$ do
  translate $Vector3 0 (-1.5*_FIELD_WIDTH)  0
  rotate (270) $Vector3 1 0 (0::GLfloat)
  rotate (180)$Vector3 1 0 (0::GLfloat)
  renderCubeSide cs

renderCubeSide css = renderArea _FIELD_WIDTH  css

field = square _FIELD_WIDTH
doColor Red    = Color4 1 0 0 1.0
doColor Green  = Color4 0 1 0 1.0
doColor Blue   = Color4 0 0 1 1.0
doColor Yellow = Color4 1 1 0 1.0
doColor Orange = Color4 1 0.5 0.5 1
doColor White  = Color4 1 1 1 1.0
doColor Black  = Color4 0 0 0 1.0
