[svn] r5977: nemerle/trunk/snippets/raytracer/ray.n

malekith svnadmin at nemerle.org
Mon Nov 28 13:16:30 CET 2005


Log:
This gives assert in the compiler.

Author: malekith
Date: Mon Nov 28 13:16:30 2005
New Revision: 5977

Modified:
   nemerle/trunk/snippets/raytracer/ray.n

Modified: nemerle/trunk/snippets/raytracer/ray.n
==============================================================================
--- nemerle/trunk/snippets/raytracer/ray.n	(original)
+++ nemerle/trunk/snippets/raytracer/ray.n	Mon Nov 28 13:16:30 2005
@@ -4,17 +4,6 @@
 
 #define BETTER_MATCHING
 
-/*
-let delta = Sqrt epsilon_float
-type vec = { x: float; y: float; z: float }
-let ( *| ) s r = {x = s *. r.x; y = s *. r.y; z = s *. r.z}
-let ( +| ) a b = {x = a.x +. b.x; y = a.y +. b.y; z = a.z +. b.z}
-let ( -| ) a b = {x = a.x -. b.x; y = a.y -. b.y; z = a.z -. b.z}
-let dot a b = a.x *. b.x +. a.y *. b.y +. a.z *. b.z
-let unitise r = (1. /. Sqrt (dot r r)) *| r
-type scene = Sphere of vec * float | Group of vec * float * scene list
-*/
-
 [Record] \
 struct Vec
   x : double
@@ -41,18 +30,8 @@
 def delta = 1.49011611938476562e-08
 def inf = double.PositiveInfinity
 
-/*
-let ray_sphere orig dir center radius =
-  let v = center -| orig in
-  let b = dot v dir in
-  let disc = b *. b -. dot v v +. radius *. radius in
-  if disc < 0. then infinity else
-    let disc = Sqrt disc in
-    (fun t2 -> if t2 < 0. then infinity else
-       ((fun t1 -> if t1 > 0. then t1 else t2) (b -. disc))) (b +. disc)
-       */
-
-def ray_sphere (orig, dir, center, radius : double)
+def intersect (orig, dir : Vec, scene)
+  def ray_sphere (center, radius : double)
   def v = center - orig
   def b = v ** dir
   def disc = b * b - (v ** v) + radius * radius
@@ -65,18 +44,6 @@
     else if (t1 > 0) t1
     else t2
 
-/*
-let intersect orig dir =
-  let rec aux ((l, _) as first) = function
-      Sphere (center, radius) ->
-	let l' = ray_sphere orig dir center radius in
-	if l' >= l then first else l', unitise (orig +| l' *| dir -| center)
-    | Group (center, radius, scenes) ->
-	let l' = ray_sphere orig dir center radius in
-	if l' >= l then first else List.fold_left aux first scenes in
-  aux (infinity, {x=0.; y=0.; z=0.})
-  */
-def intersect (orig, dir : Vec, scene)
   def aux (elt, first)
     def l = first [0]
     match (elt)
@@ -85,14 +52,14 @@
       | Scene.Sphere as s =>
         def center = s.m
         def radius = s.r
-        def l' = ray_sphere (orig, dir, center, radius)
+        def l' = ray_sphere (center, radius)
         if (l' >= l) first
         else (l', (orig + l' * dir - center).Unitise ())
       | Scene.Group as g =>
         def center = g.m
         def radius = g.r
         def scenes = g.l
-        def l' = ray_sphere (orig, dir, center, radius)
+        def l' = ray_sphere (center, radius)
         if (l' >= l) first
         else scenes.FoldLeft (first, aux)
 #else
@@ -107,15 +74,7 @@
 #endif
   aux (scene, (inf, Vec ()))
 
-/*
-let rec ray_trace light orig dir scene =
-  let lambda, normal = intersect orig dir scene in
-  if lambda = infinity then 0. else
-    let g = dot normal light in
-    if g >= 0. then 0. else
-      let p = orig +| lambda *| dir +| delta *| normal in
-      if fst (intersect p (-1. *| light) scene) < infinity then 0. else -. g
-*/
+
 def ray_trace (light, orig, dir, scene)
   def (lambda, normal) = intersect (orig, dir, scene)
   if (lambda == inf) 0.0
@@ -127,14 +86,6 @@
       if ((intersect (p, -1 * light, scene)) [0] < inf) 0.0
       else -g
 
-/*
-let rec create level c r =
-  let obj = Sphere (c, r) in
-  if level = 1 then obj else
-    let a = 3. *. r /. Sqrt 12. in
-    let aux x' z' = create (level - 1) (c +| {x=x'; y=a; z=z'}) (0.5 *. r) in
-    Group (c, 3.*.r, [obj; aux (-.a) (-.a); aux a (-.a); aux (-.a) a; aux a a])
-    */
 def create (level, c, r)
   def obj = Scene.Sphere (c, r)
   if (level == 1) obj
@@ -143,26 +94,7 @@
     def aux (x', z')
       create (level - 1, c + Vec (x', a, z'), 0.5 * r)
     Scene.Group (c, 3 * r , [obj, aux (-a, -a), aux (a, -a), aux (-a, a), aux (a, a)])
-   /* 
-let main level n =
-  let scene = create level { x = 0.; y = -1.; z = 0. } 1. in
-  let light = unitise {x= -1.; y= -3.; z=2.} and ss = 4 in
-  Printf.printf "P5\n%d %d\n255\n" n n;
-  for y = n - 1 downto 0 do
-    for x = 0 to n - 1 do
-      let g = ref 0. in
-      for dx = 0 to ss - 1 do
-	for dy = 0 to ss - 1 do
-	  let aux x d = float x -. float n /. 2. +. float d /. float ss in
-	  let dir = unitise {x = aux x dx; y = aux y dy; z = float n } in
-	  g := !g +. ray_trace light {x=0.; y=0.; z= -4.} dir scene
-	done
-      done;
-      let g = 0.5 +. 255. *. !g /. float (ss*ss) in
-      Printf.printf "%c" (char_of_int (int_of_float g))
-    done
-  done
-  */
+
 def main (level, n)
   def scene = create (level, Vec (0, -1, 0), 1)
   def light = Vec (-1, -3, 2).Unitise ()
@@ -180,11 +112,7 @@
           g += ray_trace (light, Vec (0,0,-4), dir, scene)
       def res = (0.5 + 255 * g / (ss*ss)) :> int
       s.WriteByte (res :> byte)
-/*
-let () = match Sys.argv with
-    [| _; level; n|] -> main (int_of_string level) (int_of_string n)
-  | _ -> main 9 512
-  */
+      
 match (Nemerle.Collections.List.FromArray (System.Environment.GetCommandLineArgs()))
   | [_, level, n] => main (int.Parse (level), int.Parse (n))
   | _ => main (9, 512)



More information about the svn mailing list