packages feed

accelerate-examples-1.0.0.0: examples/smoothlife/Gloss/Draw.hs

{-# LANGUAGE FlexibleContexts #-}

module Gloss.Draw
  where

import Config

import qualified Prelude                                            as P
import Data.Label

import Graphics.Gloss                                               ( Picture, scale )
import Graphics.Gloss.Accelerate.Data.Picture

import Data.Array.Accelerate                                        as A hiding ( size )
import Data.Array.Accelerate.Data.Colour.RGB
import Data.Array.Accelerate.Data.Colour.Names


colourise :: ColourScheme -> Acc (Matrix R) -> Acc (Matrix RGBA32)
colourise scheme = A.map (packRGB . colour scheme)
  where
    phase       = 0.01
    fract x     = x - A.fromIntegral (A.floor x :: Exp Int)
    mix x y a   = x*(1-a) + y*a

    colour :: ColourScheme -> Exp Float -> Exp Colour
    colour RedBlack f    = rgb f 0 0
    colour WhiteBlack f  = rgb f f f
    colour BlackWhite f  = rgb x x x where x = 1-f
    colour BrownGreen f  = rgb (mix 0.5 0.5 f) (mix 0.3 0.75 f) (mix 0 1 f)
    colour GoldBrown f   =
      let ssf = sqrt (sqrt f)
      in  rgb ( mix 0.5 (mix 1 0.3 f) ssf )
              ( mix 0.3 (mix 0.95 0.2 f) ssf )
              0
    colour Rainbow1 f    = rainbow  (fract phase * 6) f
    colour Rainbow2 f    = rainbow  (6 * sqrt (sqrt (1-f))) (sqrt (sqrt f))
    colour Rainbow3 f    = rainbow' (sqrt (sqrt (1-f))) (sqrt (sqrt f))

    rainbow :: Exp Float -> Exp Float -> Exp Colour
    rainbow p x
      = p > 0 && p < 1
              ? (rgb x         (x*p)     0
      , p < 2 ? (rgb (x*(2-p)) x         0
      , p < 3 ? (rgb 0         x         (x*(p-2))
      , p < 4 ? (rgb 0         (x*(4-p)) x
      , p < 5 ? (rgb (x*(p-4)) 0         x
      , p < 6 ? (rgb x         0         (x*(6-p))
      , {-else-}   (constant black)))))))

    rainbow' :: Exp Float -> Exp Float -> Exp Colour
    rainbow' p x
      = let c y = 0.5 * sin (1.7 * cos (pi * (p + y / 3.0 + phase))) + 0.5
        in rgb (x * c 0) (x * c 1) (x * c 2)


draw :: Config -> Matrix RGBA32 -> Picture
draw conf arr = scale zoom zoom pic
  where
    zoom        = P.fromIntegral (get configWindowZoom conf)
    pic         = bitmapOfArray arr False