module Loop where
import Data.IORef
import Data.StateVar
import qualified Graphics.UI.GLFW as G
import qualified Graphics.Rendering.OpenGL as G
import qualified Physics.Hipmunk as H
import System.Exit
import World
import Types
import Inits
import Utils
gameLoop :: IO ()
gameLoop = do
initGame
loop =<< newIORef =<< initWorld
loop :: IORef World -> IO ()
loop worldRef = do
world <- get worldRef
drawWorld world
(world, dt) <- updateWorld world
worldRef $= world
G.sleep (max 0 $ frameTime - dt)
loop worldRef
initGame :: IO ()
initGame = do
H.initChipmunk
initGLFW
-- initGLFW
initGLFW :: IO ()
initGLFW = do
G.initialize
G.openWindow (G.Size (d2gli windowWidth) (d2gli windowHeight))
[] G.Window
G.windowTitle $= title
G.windowCloseCallback $= exitWith ExitSuccess
G.windowSizeCallback $= (\size -> G.viewport $= (G.Position 0 0, size))
G.clearColor $= G.Color4 1 1 1 1
G.blend $= G.Enabled
G.blendFunc $= (G.SrcAlpha, G.OneMinusSrcAlpha)
G.ortho (-dw2) (dw2) (-dh2) (dh2) (-1) 1
where dw2 = realToFrac $ windowWidth / 2
dh2 = realToFrac $ windowHeight / 2