packages feed

accelerate-examples-0.15.0.0: examples/ray/Gloss/Draw.hs

module Gloss.Draw
  where

-- friends
import Vec3
import Scene.Light
import Scene.Object
import Scene.State
import Ray.Trace

-- frenemies
import Data.Array.Accelerate                                    as A
import Graphics.Gloss.Accelerate.Data.Color.RGB
import qualified Graphics.Gloss.Accelerate.Raster.Field         as G

--library
import Prelude                                                  as P
import Data.Label                                               ( get )


-- | Prepare the state for rendering
--
prepareState :: State -> (Objects, Lights, Scalar Position)
prepareState state
  = let
        objects         = get stateObjects state
        lights          = get stateLights  state
        eyePos          = fromList Z [get stateEyePos state]
    in
    (objects, lights, eyePos)


-- | Render a single pixel of the image
--
tracePixel
    :: Int
    -> Int
    -> Int
    -> Int
    -> Exp Color
    -> Acc (Objects, Lights, Scalar Position)
    -> Exp G.Point
    -> Exp G.Color
tracePixel sizeX sizeY fov bounces ambient state point
  = let
        sizeX'          = P.fromIntegral sizeX
        sizeY'          = P.fromIntegral sizeY
        aspect          = sizeX' / sizeY'
        fov'            = P.fromIntegral fov
        fovX            = fov' * aspect
        fovY            = fov'

        (x,y)           = G.xyOfPoint point

        eyeDir          = normalise $ makeVec3 (x * fovX) ((-y) * fovY) 0 - eyePos
        eyePos          = the eyePos'
        (objects, lights, eyePos')
                        = unlift state

        (r,g,b)         = rgbOfColor $ traceRay bounces objects lights ambient eyePos eyeDir
    in
    G.rawColor r g b 1