import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import Data.IORef myPoints :: [(GLfloat,GLfloat,GLfloat)] myPoints = map (\k -> (sin(2*pi*k/12),cos(2*pi*k/12),0.0)) [1..12] main = do (progname, _) <- getArgsAndInitialize --enterGameMode tme <- get elapsedTime lasttime <- newIORef(tme) state <- newIORef myPoints createWindow "Hello World" idleCallback $= Just (idle lasttime state) displayCallback $= (display state) mainLoop display s = do state<-readIORef s clear [ColorBuffer] renderPrimitive Triangles $ mapM_ (\(x, y, z)->vertex$Vertex3 x y z) state renderObject Solid (Cube 0.5) flush idle lasttime state = do lTime <- readIORef lasttime currenttime <- get elapsedTime case (currenttime - lTime >= 16) of True -> do s<-readIORef state writeIORef state (map (\(x,y,z)->(x,y-0.01,z)) s) writeIORef lasttime currenttime postRedisplay Nothing return () False -> return ()