Guest User

Untitled

a guest
Oct 18th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1. {-# LANGUAGE ScopedTypeVariables #-}
  2. {-# LANGUAGE ViewPatterns #-}
  3.  
  4. module Ray.Trace where
  5.  
  6. import Common.Type
  7. import Scene.Object
  8. import Scene.World
  9.  
  10. import Data.Array.Accelerate as A
  11. import Data.Array.Accelerate.Data.Colour.Names
  12. import Data.Array.Accelerate.Data.Colour.RGB as RGB
  13. import Data.Array.Accelerate.Linear.Metric
  14. import Data.Array.Accelerate.Linear.V3
  15. import Data.Array.Accelerate.Linear.Vector
  16. import Graphics.Gloss.Accelerate.Data.Point
  17.  
  18. import qualified Prelude as P
  19.  
  20.  
  21. castViewRays :: Int -> Int -> Float -> Acc (Array DIM2 Direction)
  22. castViewRays sizeX sizeY fov =
  23. let sizeX' = P.fromIntegral sizeX
  24. sizeY' = P.fromIntegral sizeY
  25. aspect = sizeX' / sizeY'
  26. fov' = constant (P.sin (fov / 2))
  27. fovX = fov' * aspect
  28. fovY = fov'
  29. in A.generate
  30. (constant (Z :. sizeY :. sizeX))
  31. (\ix ->
  32. let (x, y) = xyOfPoint $ pointOfIndex sizeX sizeY ix
  33. in normalize $ lift (V3 (x * fovX) ((-y) * fovY) 1))
  34.  
  35. normEstimate :: Estimator a => Scene a -> Exp Position -> Exp Direction
  36. normEstimate scene p =
  37. let del = 0.0001
  38.  
  39. e = sceneEstimator scene
  40. gx1 = estimate e (p - constant (V3 del 0 0))
  41. gx2 = estimate e (p + constant (V3 del 0 0))
  42. gy1 = estimate e (p - constant (V3 0 del 0))
  43. gy2 = estimate e (p + constant (V3 0 del 0))
  44. gz1 = estimate e (p - constant (V3 0 0 del))
  45. gz2 = estimate e (p + constant (V3 0 0 del))
  46.  
  47. gradX = (gx2 - gx1) / (constant del)
  48. gradY = (gy2 - gy1) / (constant del)
  49. gradZ = (gz2 - gz1) / (constant del)
  50. in normalize $ lift (V3 gradX gradY gradZ)
  51.  
  52. traceRay :: Estimator a => Scene a -> Exp Position -> Exp Direction -> Exp (Float, Position)
  53. traceRay scene p d =
  54. let test :: Exp (Int, Float, Position) -> Exp Bool
  55. test (unlift -> (i :: Exp Int, r :: Exp Float, _ :: Exp Position)) =
  56. i < constant (sceneMaxiter scene) && r > constant (sceneEps scene) && r < 5
  57.  
  58. step :: Exp (Int, Float, Position) -> Exp (Int, Float, Position)
  59. step (unlift -> (i :: Exp Int, _ :: Exp Float, p :: Exp Position)) =
  60. let r = estimate (sceneEstimator scene) p
  61. in lift (i + 1, r, p + r *^ d)
  62.  
  63. (_ :: Exp Int, r' :: Exp Float, p' :: Exp Position) = unlift $ while test step (lift (0 :: Exp Int, 1 :: Exp Float, p))
  64. in lift (r', p')
  65.  
  66. phong :: Light -> Exp Position -> Exp Position -> Exp Direction -> Exp Colour
  67. phong light eye p n =
  68. let ambient = 1
  69. diffuse = constant (lightColour light)
  70. specularExponent = 10 :: Exp Int
  71. specularity = 0.5
  72.  
  73. lightP = constant (lightPosition light)
  74.  
  75. l = normalize (lightP - p)
  76. e = normalize (eye - p)
  77. mag = n `dot` l
  78. r = 2 * mag *^ n - l
  79. in (ambient *^ lightGrey +
  80. diffuse ^* (max mag 0) ^+
  81. (specularity * (max (e `dot` r) 0) ^ specularExponent)) ^/
  82. (ambient + 1 + specularity)
  83.  
  84. simpleShading :: Estimator a => Scene a -> Exp Direction -> Exp Float -> Exp Colour
  85. simpleShading scene d noise =
  86. let o = constant (sceneEye scene) + noise *^ d
  87. (r :: Exp Float, p :: Exp Position) = unlift $ traceRay scene o d
  88. n = normEstimate scene p
  89.  
  90. calc :: Light -> Exp Colour
  91. calc light = let l = normalize (constant (lightPosition light) - p)
  92. o' = p + (constant (10 * (sceneEps scene))) *^ n
  93. (r' :: Exp Float, p' :: Exp Position) = unlift $ traceRay scene o' l
  94. -- shadow = (r' < constant (sceneEps scene) ? (constant 0.4, constant 1))
  95. in (r < constant (sceneEps scene) ?
  96. ( phong light (constant (sceneEye scene)) p n
  97. , constant (sceneColour scene)))
  98. in (P.foldr (+) (constant 0) (P.fmap calc (sceneLights scene)))/2
Add Comment
Please, Sign In to add comment