packages feed

sdl2-compositor-1.2: example.hs

import Control.Concurrent (threadDelay)
import Data.Text (pack)
import Linear.V2 (V2(..))
import SDL (initialize, InitFlag(InitVideo), createWindow, defaultWindow,
            createRenderer, RendererConfig(rendererTargetTexture),
            defaultRenderer, rendererLogicalSize, ($=), present, clear, quit,
            BlendMode(BlendAlphaBlend))
import SDL.Compositor (filledRectangleC, translateA, runRenderer, overC,
                       modulateAlphaM, blendMode, rgba)

main :: IO ()
main = do
  -- intialize SDL
  initialize [InitVideo]
  -- create a window
  window <- createWindow (pack "test window") defaultWindow
  -- create a renderer for the window
  rend <- createRenderer window (-1) (defaultRenderer {rendererTargetTexture = True})
  -- set the logical size of the window to 800x600
  rendererLogicalSize rend $= (Just (V2 800 600))
  -- clear the renderer
  clear rend
  let
    -- 3 rectangles, one in red, one in green and one in blue, width:
    -- 100, height 150
    rectRed = filledRectangleC (V2 100 150) (rgba 255 100 100 255)
    rectGreen = filledRectangleC (V2 100 150) (rgba 100 255 100 255)
    rectBlue = filledRectangleC (V2 100 150) (rgba 100 100 255 255)
    -- translate an image by (250,300) pixels
    translateToCenter = translateA (V2 250 300)
  -- draw everything
  runRenderer rend
    ( ( -- enable alpha blending for the whole subtree
        blendMode BlendAlphaBlend .
        -- make all the images slightly transparent
        modulateAlphaM 150 .
        -- align the images in the center
        translateToCenter
      )
      ( -- red, green and blue
        rectRed `overC`
        translateA (V2 150 0) (rectGreen `overC`
                               translateA (V2 150 0) rectBlue)
      )
    )
  -- show the drawn image on the screen
  present rend
  -- pause for 5 seconds
  threadDelay (5 * (10::Int)^(6::Int))
  -- quit SDL
  quit