packages feed

yesod-media-simple-0.1.0.1: examples/plasma.hs

{-# LANGUAGE ViewPatterns #-}
import Codec.Picture
import Data.Time
import Data.Word
import Yesod
import Yesod.Media.Simple

main = serve $ do
    now <- getCurrentTime
    return $ PixelList 640 480
      [ [ pixel now x y
        | x <- [1..640]
        ]
      | y <- [1..480]
      ]

-- See the glsl at http://www.bidouille.org/prog/plasma
pixel :: UTCTime -> Int -> Int -> (Word8, Word8, Word8)
pixel (realToFrac . utctDayTime -> t) ((/ 100) . fromIntegral -> x) ((/ 100) . fromIntegral -> y) =
    (round $ 255 * r, round $ 255 * g, round $ 255 * b)
  where
    r = 1
    g = sin (pi * v) :: Float
    b = cos (pi * v)
    v = sin (x + t)
      + sin ((y + t) / 2)
      + sin ((x + y + t) / 2)
      + sin (sqrt (x' * x' + y' * y' + 1) + t)
    x' = x + sin (t / 2)
    y' = y + cos (t / 2)