packages feed

sdl2-compositor-1.0.1: example.hs

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

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) (V4 255 100 100 255)
    rectGreen = filledRectangleC (V2 100 150) (V4 100 255 100 255)
    rectBlue = filledRectangleC (V2 100 150) (V4 100 100 255 255)
    -- translate an image by (250,300) pixels
    translateToCenter = translateC (V2 250 300)
  -- draw everything
  runRenderer rend
    ( ( -- enable alpha blending for the whole subtree
        preserveBlendMode BlendAlphaBlend .
        -- make all the images slightly transparent
        modulateAlphaM 150 .
        -- align the images in the center
        translateToCenter
      )
      ( -- red, green and blue
        rectRed `overC`
        translateC (V2 150 0) (rectGreen `overC`
                               translateC (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