{-# LANGUAGE OverloadedStrings #-}
module YampaSDL2.Backend.SDL
(sdlBackend) where
import qualified SDL
import SDL.Vect
import Control.Concurrent.MVar
import FRP.Yampa
import Data.Text (pack)
import qualified YampaSDL2.Backend.Init as Init
import qualified YampaSDL2.Backend.Input as Input
import qualified YampaSDL2.Backend.Output as Output
import qualified YampaSDL2.Backend.Parse as Parse
import qualified YampaSDL2.Backend.Close as Close
import YampaSDL2.AppOutput (AppOutput)
import YampaSDL2.Backend
sdlBackend ::
BackendConfiguration -> IO (Backend (Event SDL.EventPayload) AppOutput)
sdlBackend bc = do
SDL.initialize [SDL.InitVideo]
window <- SDL.createWindow (pack $ windowName bc) windowConf
SDL.showWindow window
renderer <- SDL.createRenderer window (-1) SDL.defaultRenderer
lastInteraction <- newMVar =<< SDL.time
lastGraphics <- newMVar Nothing
lastRender <- newMVar 0
imageTextures <- newMVar []
return $
Backend
{ initAction = Init.initAction
, inputAction = Input.inputAction lastInteraction
, outputAction = Output.outputAction (fps bc) imageTextures lastRender lastGraphics 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)
}