[svn] r5984: nemerle/trunk/snippets/raytracer: Makefile ray-compressed.n ray-hand-opt.n

malekith svnadmin at nemerle.org
Tue Nov 29 22:25:45 CET 2005


Log:
A little cheat.

Author: malekith
Date: Tue Nov 29 22:25:44 2005
New Revision: 5984

Modified:
   nemerle/trunk/snippets/raytracer/Makefile
   nemerle/trunk/snippets/raytracer/ray-compressed.n
   nemerle/trunk/snippets/raytracer/ray-hand-opt.n

Modified: nemerle/trunk/snippets/raytracer/Makefile
==============================================================================
--- nemerle/trunk/snippets/raytracer/Makefile	(original)
+++ nemerle/trunk/snippets/raytracer/Makefile	Tue Nov 29 22:25:44 2005
@@ -48,8 +48,9 @@
 %.exe: %.cs
 	gmcs $<
 
-run: ray.exe ray-hand-opt.exe ray-cs.exe
+run: ray.exe ray-hand-opt.exe ray-cs.exe ray-compressed.exe
 	time $(EXECUTE) ./ray.exe 9 128 > out1.ppm
+	time $(EXECUTE) ./ray-compressed.exe 9 128 > out4.ppm
 	time $(EXECUTE) ./ray-hand-opt.exe 9 128 > out2.ppm
 	time $(EXECUTE) ./ray-cs.exe 9 128 > out3.ppm
 

Modified: nemerle/trunk/snippets/raytracer/ray-compressed.n
==============================================================================
--- nemerle/trunk/snippets/raytracer/ray-compressed.n	(original)
+++ nemerle/trunk/snippets/raytracer/ray-compressed.n	Tue Nov 29 22:25:44 2005
@@ -10,24 +10,24 @@
   | Sphere { m : Vec; r : double; }
   | Group { m : Vec; r : double; l : list [Scene]; }
 def delta = 1.49011611938476562e-08; def inf = double.PositiveInfinity
-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
   if (disc < 0) inf else
     def disc = System.Math.Sqrt (disc)
     def t2 = b + disc; def t1 = b - disc
     if (t2 < 0) inf else if (t1 > 0) t1 else t2
-def intersect (orig, dir : Vec, scene)
-  def aux (elt, first)
-    def l = first [0]
+  mutable l = inf, v = Vec ()
+  def aux (elt)
     match (elt)
       | Scene.Sphere (center, radius) =>
-        def l' = ray_sphere (orig, dir, center, radius)
-        if (l' >= l) first else (l', (orig + l' * dir - center).Unitise ())
+        def l' = ray_sphere (center, radius)
+        when (l' < l) { l = l'; v = center }
       | Scene.Group (center, radius, scenes) =>
-        def l' = ray_sphere (orig, dir, center, radius)
-        if (l' >= l) first else scenes.FoldLeft (first, aux)
-  aux (scene, (inf, Vec ()))
+        def l' = ray_sphere (center, radius)
+        when (l' < l) foreach (s in scenes) aux (s)
+  aux (scene); (l, (orig + l * dir - v).Unitise ())
 def ray_trace (light, orig, dir, scene)
   def (lambda, normal) = intersect (orig, dir, scene)
   if (lambda == inf) 0.0 else

Modified: nemerle/trunk/snippets/raytracer/ray-hand-opt.n
==============================================================================
--- nemerle/trunk/snippets/raytracer/ray-hand-opt.n	(original)
+++ nemerle/trunk/snippets/raytracer/ray-hand-opt.n	Tue Nov 29 22:25:44 2005
@@ -42,6 +42,7 @@
       def l = M.ray_sphere (r, center, radius)
       when (l < h.lambda)
         h.lambda = l
+        h.dir = center
         h.dir = (r.orig + l * r.dir - center).Unitise ()
   
   [Record] \
@@ -78,6 +79,7 @@
     scene.intersect (Ray (orig, dir), h)
     if (h.lambda == inf) 0.0
     else
+      h.dir = (orig + h.lambda * dir - h.dir).Unitise ()
       def g = h.dir ** light
       if (g >= 0) 0.0
       else



More information about the svn mailing list