module FRP.Spice.Engine (startEngine) where
import Graphics.Rendering.OpenGL
import Graphics.UI.GLFW as GLFW
import FRP.Elerea.Param
import Data.IORef
import FRP.Spice.Engine.RunInput
import FRP.Spice.Engine.Network
import FRP.Spice.Engine.Driver
import FRP.Spice.Config
import FRP.Spice.Input
import FRP.Spice.Game
madeRef :: IO (IORef Bool)
madeRef = newIORef False
makeSize :: WindowConfig -> Size
makeSize wc = Size (fromIntegral $ getWindowWidth wc) (fromIntegral $ getWindowHeight wc)
makeDisplayBits :: [DisplayBits]
makeDisplayBits = [DisplayRGBBits 8 8 8, DisplayAlphaBits 8, DisplayDepthBits 24]
makeWindowMode :: WindowConfig -> WindowMode
makeWindowMode wc =
if getWindowFullscreen wc
then FullScreen
else Window
startEngine :: Game a => WindowConfig -> a -> IO ()
startEngine wc game = do
made <- madeRef
isMade <- readIORef made
if isMade
then error "You cannot run 'startEngine' more than once per program."
else do
writeIORef made True
initialize
openWindow (makeSize wc) makeDisplayBits (makeWindowMode wc)
windowTitle $= getWindowTitle wc
closed <- newIORef False
windowCloseCallback $= do
writeIORef closed True
return True
(gameSignal, gameSink) <- external game
ic <- makeInputContainer
mousePosCallback $= makeMousePositionCallback wc ic
keyCallback $= makeKeyboardCallback ic
mouseButtonCallback $= makeMouseCallback ic
network <- makeNetwork (getInput ic) gameSignal gameSink
GLFW.time $= 0
driveNetwork network $ runInput closed
closeWindow