packages feed

tidal-vis-1.0.14: src/Realtime/Animation.hs

module Realtime.Animation
       ( movingPatterns
       ) where

import Control.Concurrent
import Data.Maybe (fromMaybe)
import Data.Sequence (Seq (..), (<|))
import Graphics.Gloss
import Graphics.Gloss.Interface.IO.Simulate
import Realtime.Types (ColorI)

import qualified Data.Sequence as S


window :: Display
window = InWindow "Nice Window" (500, 500) (20, 20)

background :: Color
background = greyN 0.1

movingPatterns :: MVar [ColorI] -> IO ()
movingPatterns tp = simulateIO window background 12
  (S.singleton [(200,100,200,250)])
  (pure . pictures . seqToPics)
  $ \_ _ seqColors -> do
    mColors <- tryTakeMVar tp
    let colsNew = fromMaybe [] mColors
    let headColors = seqColors `S.index` 0
    pure $ if headColors==colsNew || null colsNew then seqColors else addColorList colsNew seqColors
  where
    seqToPics :: Seq [ColorI] -> [Picture]
    seqToPics = S.foldMapWithIndex (\i c -> makeLine (length c) i c)

    makeLine :: Int -> Int -> [ColorI] -> [Picture]
    makeLine cLength i = map (\(n,col) -> rectLinesDown col n cLength i) . zip [0..]
    -- Keep circle list length equal to 'n'.
    refrain :: Int -> Seq [ColorI] -> Seq [ColorI]
    refrain n xs
      | S.length xs <= n = xs
      | otherwise        = S.take n xs
    -- Every round number spawn circle and add it to right end. Colorize new circle with new color.
    addColorList :: [ColorI] -> Seq [ColorI] -> Seq [ColorI]
    addColorList colors seqColors = colors <| refrain 10 seqColors

    rectLinesDown :: ColorI -> Float -> Int -> Int -> Picture
    rectLinesDown col n l i
        = translate (piece * n - 250 + piece / 2) (225 - 50 * fromIntegral i)
        $ color (makeColorFromIntTuple col)
        $ rectangleSolid piece 50
      where
        piece = 500 / fromIntegral l

makeColorFromIntTuple :: (Int, Int, Int, Int) -> Color
makeColorFromIntTuple (r,g,b,a) = makeColorI r g b a