{-# 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(..))
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)
}