packages feed

affection-0.0.0.6: examples/example01.hs

{-# LANGUAGE RecordWildCards #-}

import Affection
import qualified SDL
import qualified SDL.Raw as Raw
import qualified GEGL as G
import qualified BABL as B
import qualified Data.Map.Strict as M

import Control.Monad (when)

import Foreign.Storable (peek)
import Foreign.C.Types

import Debug.Trace

-- main :: IO ()
-- main = withAllAffection $
--   withDefaultWindow "test" $ do
--     changeColor $ RGBA 255 255 255 255
--     clear
--     present
--     liftIO $ delaySec 2

main :: IO ()
main = do
  conf <- return $ AffectionConfig
    { initComponents = All
    , windowTitle    = "Affection: example00"
    , windowConfig   = SDL.defaultWindow
    , preLoop        = return ()
    , eventLoop      = const $ return ()
    , updateLoop     = update
    , drawLoop       = draw
    , loadState      = load
    , cleanUp        = clean
    }
  withAffection conf

data UserData = UserData
  { nodeGraph   :: M.Map String G.GeglNode
  , foreground  :: G.GeglBuffer
  -- , lastTick    :: Double
  }

load :: SDL.Surface -> IO UserData
load _ = do
  traceM "loading"
  root <- G.gegl_node_new
  traceM "new root node"
  checkerboard <- G.gegl_node_new_child root $ G.checkerboardOperation $
    props $ do
        prop "color1" $ G.RGBA 0.4 0.4 0.4 1
        prop "color2" $ G.RGBA 0.6 0.6 0.6 1
  traceM "checkerboard"
  over <- G.gegl_node_new_child root G.defaultOverOperation
  traceM "over"
  buffer <- G.gegl_buffer_new (Just $ G.GeglRectangle 0 0 800 600) =<<
    B.babl_format (B.PixelFormat B.RGBA B.CFfloat)
  sink <- G.gegl_node_new_child root $ G.Operation "gegl:copy-buffer" $
    props $
    prop "buffer" buffer
  traceM "buffer-source"
  nop <- G.gegl_node_new_child root $ G.Operation "gegl:nop" []
  traceM "nop"
  crop <- G.gegl_node_new_child root $ G.Operation "gegl:crop" $
    props $ do
        prop "width" (800::Double)
        prop "height" (600.0::Double)
  G.gegl_node_link_many [checkerboard, over, crop, sink]
  G.gegl_node_connect_to nop "output" over "aux"
  traceM "connections made"
  myMap <- return $ M.fromList
    [ ("root"        , root)
    , ("over"        , over)
    , ("background"  , checkerboard)
    , ("sink"        , sink)
    , ("nop"         , nop)
    ]
  let roi = G.GeglRectangle 0 0 20 20
  traceM "loading complete"
  return $ UserData
    { nodeGraph = myMap
    , foreground = buffer
    -- , lastTick = 0
    }

draw :: Affection UserData ()
draw = do
  traceM "drawing"
  UserData{..} <- getAffection
  drawRect (nodeGraph M.! "nop") (G.RGB 1 0 0) Fill (G.GeglRectangle 10 10 500 500) foreground
  process $ nodeGraph M.! "sink"

update :: Affection UserData ()
update = do
  traceM "updating"
  ud <- getAffection
  -- let last = lastTick ud
  -- tick <- getTick
  -- putAffection $ ud { lastTick = tick }
  dt <- getDelta
  traceM $ (show $ 1 / dt) ++ " FPS"
  elapsed <- getElapsedTime
  when (elapsed > 20) $
    quit

clean :: UserData -> IO ()
clean _ = return ()