content: import Graphics.Rendering.OpenGL
  import Graphics.UI.GLUT
  
  -- Draw a cuboid.  Its vertices are those of a unit cube, which is then scaled
  -- to the required dimensions.  We only specify the visible faces, each of
  -- which is composed of two triangles.  The faces are rotated into position and
  -- rendered with a perspective transformation.
  
  type Fl = GLfloat
  
  cuboid :: IO ()
  cuboid = do
    color red   ; render front
    color green ; render side
    color blue  ; render top
  
  red,green,blue :: Color4 GLfloat
  red   = Color4 1 0 0 1
  green = Color4 0 1 0 1
  blue  = Color4 0 0 1 1
  
  render :: [(Fl, Fl, Fl)] -> IO ()
  render = renderPrimitive TriangleStrip . mapM_ toVertex
    where toVertex (x,y,z) = vertex $ Vertex3 x y z
  
  front,side,top :: [(Fl,Fl,Fl)]
  front = vertices [0,1,2,3]
  side  = vertices [4,1,5,3]
  top   = vertices [3,2,5,6]
  
  vertices :: [Int] -> [(Fl,Fl,Fl)]
  vertices = map (verts !!)
  
  verts :: [(Fl,Fl,Fl)]
  verts = [(0,0,1), (1,0,1), (0,1,1), (1,1,1), (1,0,0), (1,1,0), (0,1,0)]
  
  transform :: IO ()
  transform = do
    translate $ Vector3 0 0 (-10 :: Fl)
    rotate (-14) $ Vector3 0 0 (1 :: Fl)
    rotate (-30) $ Vector3 0 1 (0 :: Fl)
    rotate   25  $ Vector3 1 0 (0 :: Fl)
    scale 2 3 (4 :: Fl)
    translate $ Vector3 (-0.5) (-0.5) (-0.5 :: Fl)
  
  display :: IO ()
  display = do
    clear [ColorBuffer]
    perspective 40 1 1 (15 :: GLdouble)
    transform
    cuboid
    flush
  
  main :: IO ()
  main = do
    let name = "Cuboid"
    initialize name []
    createWindow name
    displayCallback $= display
    mainLoop
  