module Gloss.Draw
where
-- friends
import Common.Type
import Scene.Light
import Scene.Object
import Scene.State
import Ray.Trace
-- frenemies
import Data.Array.Accelerate as A hiding ( V3 )
import Data.Array.Accelerate.Data.Colour.RGB as RGB
import Data.Array.Accelerate.Linear.Metric
import qualified Data.Array.Accelerate.Data.Colour.RGBA as RGBA
import Graphics.Gloss.Accelerate.Data.Point
--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 Colour
-> Acc (Objects, Lights, Scalar Position)
-> Exp Point
-> Exp RGBA.Colour
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) = xyOfPoint point
eyeDir = normalize $ lift (V3 (x * fovX) (y * fovY) 0) - eyePos
eyePos = the eyePos'
(objects, lights, eyePos')
= unlift state
RGB r g b = unlift $ traceRay bounces objects lights ambient eyePos eyeDir
in
RGBA.rgba r g b 1