topkata-0.2.4: Main.hs
module Main (main) where
import qualified Graphics.UI.GLFW as GLFW
import qualified Topkata.CommandLineArgs as Args
import Graphics.Rendering.OpenGL ( ($=) )
import Data.IORef
import Control.Monad (unless)
import System.IO.Unsafe (unsafePerformIO)
import qualified Graphics.Rendering.OpenGL as GL
import Topkata.Render (render, mkRenderInfo, renderInit)
import Topkata.State
import Topkata.Topka.Topka (animateTop)
import Topkata.Actions
import qualified Topkata.Keyboard as Keyboard
import Control.Concurrent(threadDelay)
import Graphics.Rendering.OpenGL as OpenGL
--windowMode True = GLFW.Window
--windowMode False = GLFW.FullScreen
simpleErrorCallback e s =
putStrLn $ unwords [show e, show s]
initialize actionSlot windowOption = do
GLFW.setErrorCallback $ Just simpleErrorCallback
r <- GLFW.init
--check $ GLFW.openWindow (GL.Size 800 600) [] (windowMode windowOption)
Just win <- GLFW.createWindow 800 600 "Topkata" Nothing Nothing
GLFW.makeContextCurrent $ Just win
--GLFW.setWindowTitle win "Topkata"
GL.lighting $= GL.Enabled
version <- OpenGL.get (OpenGL.majorMinor OpenGL.glVersion)
putStrLn $ "version: " ++ show version
renderInit
version <- OpenGL.get (OpenGL.majorMinor OpenGL.glVersion)
putStrLn $ "version: " ++ show version
GLFW.setKeyCallback win (Just $ Keyboard.callback actionSlot)
GLFW.swapInterval 1
return win
quitRef = unsafePerformIO $ newIORef False
{-# NOINLINE quitRef #-}
keyCallback (GLFW.Key'Escape) GLFW.KeyState'Pressed = writeIORef quitRef True
keyCallback _ _ = return ()
mainLoop win renderInfo actionSlot state = do
render renderInfo state
GLFW.swapBuffers win
threadDelay 10
GLFW.pollEvents
r <- performRecordedActions actionSlot $ stTopka state
case r of
Left () -> return ()
Right ts ->
let state' = state { stTopka = ts } in
mainLoop win renderInfo actionSlot $ animate state'
animate state =
state { stTopka = animateTop 10 (stTopka state) (stLaby state) }
main = do
args <- Args.args
state <- newState
actionSlot <- newSlot
win <- initialize actionSlot $ Args.windowOption args
renderInfo <- mkRenderInfo state
mainLoop win renderInfo actionSlot state
GLFW.terminate