{-# LANGUAGE CPP #-}
module Main where
-- friends
import Config
import ParseArgs
import Monitoring
import Scene.State
import Gloss.Draw
import Gloss.Event
import Ray.Trace
-- frenemies
import Data.Label
import Data.Array.Accelerate as A
import Graphics.Gloss.Accelerate.Data.Color.RGB
import qualified Graphics.Gloss.Accelerate.Raster.Field as G
-- library
import Criterion.Main ( defaultMainWith, bench, whnf )
import System.Environment ( getArgs, withArgs )
main :: IO ()
main = do
beginMonitoring
argv <- getArgs
(conf, cconf, rest) <- parseArgs optHelp optBackend options defaults header footer argv
let width = get optWidth conf
height = get optHeight conf
zoom = get optZoom conf
fov = get optFieldOfView conf
bounces = get optBounces conf
backend = get optBackend conf
fps = get optFramerate conf
state = initState 0
ambient = rawColor 0.3 0.3 0.3
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
if get optBench conf
then withArgs rest
$ defaultMainWith cconf (return ())
[ bench "ray" $ whnf (run1 backend scene)
(get stateObjects state, get stateLights state)
]
#ifndef ACCELERATE_ENABLE_GUI
else return ()
#else
else G.playFieldWith
(run1 backend)
(G.InWindow "Ray" (width, height) (10, 10))
(zoom, zoom)
fps
state
prepareState
(tracePixel width height fov bounces ambient)
handleEvent
advanceState
#endif