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