Advertisement
Guest User

Untitled

a guest
May 16th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.39 KB | None | 0 0
  1. //Makes rectangle
  2.     let mkRectangle tex bl tl br =
  3.         let z = Point.getZ bl
  4.         let width = Vector.magnitude (Point.distance bl br)
  5.         let height = Vector.magnitude (Point.distance bl tl)
  6.  
  7.         let u = Point.direction bl br
  8.         let v = Point.direction bl tl
  9.         let w = Vector.normalise(Vector.crossProduct u v)
  10.  
  11.         let ux = Vector.getX u
  12.         let uy = Vector.getY u
  13.         let uz = Vector.getZ u
  14.  
  15.         let vx = Vector.getX v
  16.         let vy = Vector.getY v
  17.         let vz = Vector.getZ v
  18.  
  19.         let wx = Vector.getX w
  20.         let wy = Vector.getY w
  21.         let wz = Vector.getZ w
  22.  
  23.         let blx = Point.getX bl
  24.         let bly = Point.getY bl
  25.         let blz = Point.getZ bl
  26.  
  27.         let o = mkTransformation (Matrix.Matrix(array2D [|[|ux;vx;wx;0.0|];[|uy;vy;wy;0.0|];[|uz;vz;wz;0.0|];[|0.0;0.0;0.0;1.0|]|]))
  28.         let inverseo = mkTransformation (Matrix.Matrix(array2D [|[|ux;uy;uz;0.0|];[|vx;vy;vz;0.0|];[|wx;wy;wz;0.0|];[|0.0;0.0;0.0;1.0|]|]))
  29.         let translate = translate blx bly blz
  30.  
  31.         let rect = {   new Shape
  32.                        with member this.Texture = tex
  33.                             member this.Inside = None
  34.                             member this.BoundingBox =
  35.                                let lp = bl
  36.                                let hp = mkPoint (Point.getX bl + width) (Point.getY bl + height) (Point.getZ bl)  
  37.                                mkBoundingBox lp hp
  38.                             member this.TransformedBoundingBox = this.BoundingBox
  39.                             member this.Hit (ray:Ray) =
  40.                                
  41.                                 let ox = Point.getX (Ray.getPoint ray)
  42.                                 let oy = Point.getY (Ray.getPoint ray)
  43.                                 let oz = Point.getZ (Ray.getPoint ray)
  44.  
  45.                                
  46.                                 let dx = Vector.getX (Ray.getVector ray)
  47.                                 let dy = Vector.getY (Ray.getVector ray)
  48.                                 let dz = Vector.getZ (Ray.getVector ray)
  49.                                 if dz = 0.0 then
  50.                                     None
  51.                                 else
  52.                                     let t = (0.0 - oz)/dz
  53.                                     let px = ox + t * dx
  54.                                     let py = oy + t * dy
  55.                                    
  56.                                     let normal = mkVector 0.0 0.0 1.0
  57.  
  58.                                     if (px >= 0.0 && px <= width) then
  59.                                         if (py >= 0.0 && py <= height) then
  60.                                             let u = px/width
  61.                                             let v = py/height
  62.                                             if u < 0.0 || u > 1.0 then printfn "%A" "u"
  63.                                                                        printfn "%A" u
  64.                                             if v < 0.0 || v > 1.0 then printfn "%A" "v"
  65.                                                                        printfn "%A" v
  66.                                             Some (mkHit t normal (Texture.getMaterial tex u v))
  67.                                         else None
  68.                                     else None
  69.                  }
  70.         let ortho = mkTransformed rect (o,inverseo)
  71.         mkTransformed ortho translate
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement