packages feed

accelerate-examples-1.0.0.0: examples/ray/Main.hs

module Main where

-- Ray
import Config
import Scene.Object                                             ( Objects )
import Scene.Light                                              ( Lights )
import Scene.State
import Gloss.Draw
import Gloss.Event
import Ray.Trace

-- Friends
import Data.Array.Accelerate                                    as A
import Data.Array.Accelerate.Examples.Internal
import Data.Array.Accelerate.Data.Colour.RGB
import qualified Graphics.Gloss.Accelerate.Raster.Field         as G

-- Enemies
import Data.Label


main :: IO ()
main = do
  beginMonitoring
  (conf, opts, rest)    <- parseArgs options defaults header footer

  let width     = get configWidth conf
      height    = get configHeight conf
      zoom      = get configZoom conf
      fov       = get configFieldOfView conf
      bounces   = get configBounces conf
      fps       = get configFramerate conf
      backend   = get optBackend opts
      state     = initState 0
      ambient   = rgb 0.3 0.3 0.3

      scene :: Acc (Objects,Lights) -> Acc (Array DIM2 Colour)
      scene st
        = let eye               = constant (get stateEyePos state)
              eyeDir            = castViewRays width height fov eye
              eyePos            = fill (constant (Z :. height :. width)) eye
              (objects, lights) = unlift st
          in
          A.zipWith (traceRay bounces objects lights ambient) eyePos eyeDir

  runBenchmarks opts rest
    [ bench "ray"
    $ whnf (run1 backend scene)
           (get stateObjects state, get stateLights state) ]

  runInteractive opts rest
    $ G.playFieldWith
          (run1 backend)
          (G.InWindow "Ray" (width, height) (10, 10))
          (zoom, zoom)
          fps
          state
          prepareState
          (tracePixel width height fov bounces ambient)
          handleEvent
          advanceState