Advertisement
Guest User

Untitled

a guest
Jul 20th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.51 KB | None | 0 0
  1. {-# LANGUAGE ScopedTypeVariables #-}
  2. {-# LANGUAGE ViewPatterns #-}
  3.  
  4. module Ray.Trace where
  5.  
  6. import Common.Type
  7. import Scene.Light
  8. import Scene.Object
  9. import Scene.World
  10.  
  11. import Data.Array.Accelerate as A
  12. import Data.Array.Accelerate.Data.Colour.Names
  13. import Data.Array.Accelerate.Data.Colour.RGB as RGB
  14. import Data.Array.Accelerate.Linear.Metric
  15. import Data.Array.Accelerate.Linear.V3
  16. import Data.Array.Accelerate.Linear.Vector
  17. import Graphics.Gloss.Accelerate.Data.Point
  18.  
  19. import qualified Prelude as P
  20.  
  21.  
  22. castViewRays :: Int -> Int -> Float -> Acc (Array DIM2 Direction)
  23. castViewRays sizeX sizeY fov =
  24. let sizeX' = P.fromIntegral sizeX
  25. sizeY' = P.fromIntegral sizeY
  26. aspect = sizeX' / sizeY'
  27. fov' = constant (P.sin (fov / 2))
  28. fovX = fov' * aspect
  29. fovY = fov'
  30. in A.generate
  31. (constant (Z :. sizeY :. sizeX))
  32. (\ix ->
  33. let (x, y) = xyOfPoint $ pointOfIndex sizeX sizeY ix
  34. in normalize $ lift (V3 (x * fovX) ((-y) * fovY) 1))
  35.  
  36. normEstimate :: Scene -> Exp Position -> Exp Direction
  37. normEstimate scene p =
  38. let del = 0.0001
  39.  
  40. e = sceneEstimator scene
  41. gx1 = e (p - constant (V3 del 0 0))
  42. gx2 = e (p + constant (V3 del 0 0))
  43. gy1 = e (p - constant (V3 0 del 0))
  44. gy2 = e (p + constant (V3 0 del 0))
  45. gz1 = e (p - constant (V3 0 0 del))
  46. gz2 = e (p + constant (V3 0 0 del))
  47.  
  48. gradX = (gx2 - gx1) / (constant del)
  49. gradY = (gy2 - gy1) / (constant del)
  50. gradZ = (gz2 - gz1) / (constant del)
  51. in normalize $ lift (V3 gradX gradY gradZ)
  52.  
  53. traceRay :: Scene -> Exp Position -> Exp Direction -> Exp (Float, Position)
  54. traceRay scene p d =
  55. let test :: Exp (Int, Float, Position) -> Exp Bool
  56. test (unlift -> (i :: Exp Int, r :: Exp Float, _ :: Exp Position)) =
  57. i < sceneMaxiter scene && r > sceneEps scene && r < 5
  58.  
  59. step :: Exp (Int, Float, Position) -> Exp (Int, Float, Position)
  60. step (unlift -> (i :: Exp Int, _ :: Exp Float, p :: Exp Position)) =
  61. let r = (sceneEstimator scene) p
  62. in lift (i + 1, r, p + r *^ d)
  63.  
  64. (_ :: Exp Int, r' :: Exp Float, p' :: Exp Position) = unlift $ while test step (lift (0 :: Exp Int, 1 :: Exp Float, p))
  65. in lift (r', p')
  66.  
  67. simpleShading :: Scene -> Exp Direction -> Exp Float -> Exp Colour
  68. simpleShading scene d noise =
  69. let o = sceneEye scene + noise *^ d
  70. (r :: Exp Float, p :: Exp Position) = unlift $ traceRay scene o d
  71. n = normEstimate scene p
  72. in r < sceneEps scene ?
  73. (applyLights (sceneLights scene) (sceneEye scene) p n, sceneColour scene)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement