{-# LANGUAGE OverloadedStrings #-} module YampaSDL2.Internal.SDL.Start ( initSDL ) where import Control.Concurrent.MVar import Data.StateVar (($=)) import Data.Text (pack) import FRP.Yampa import Linear.V2 import qualified SDL import qualified YampaSDL2.Internal.SDL.Close as Close import qualified YampaSDL2.Internal.SDL.Init as Init import qualified YampaSDL2.Internal.SDL.Input as Input import qualified YampaSDL2.Internal.SDL.Output as Output import qualified YampaSDL2.Internal.SDL.Parse as Parse import YampaSDL2.Internal.AppOutput (AppOutput) import YampaSDL2.Internal.SDL.Init (SDLConfiguration(..), SDLInit(..)) -- | Set up SDL initSDL :: SDLConfiguration -> IO (SDLInit (Event SDL.EventPayload) AppOutput) initSDL bc = do SDL.initialize [SDL.InitVideo] window <- SDL.createWindow (pack $ windowName bc) windowConf SDL.showWindow window renderer <- SDL.createRenderer window (-1) SDL.defaultRenderer SDL.rendererDrawBlendMode renderer $= SDL.BlendAlphaBlend lastInteraction <- newMVar =<< SDL.time lastScene <- newMVar Nothing lastRender <- newMVar 0 cache <- newMVar [] ready <- newMVar True return $ SDLInit { initAction = Init.firstEvent , inputAction = Input.inputAction lastInteraction , outputAction = Output.outputAction cache (fps bc) lastRender ready lastScene window renderer , parseInput = Parse.parseInput , closeAction = Close.closeAction renderer window } where windowConf = SDL.defaultWindow { SDL.windowInitialSize = V2 (fromIntegral (windowWidth bc)) (fromIntegral (windowHeight bc)) , SDL.windowResizable = windowResizable (bc) }