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

malekith svnadmin at nemerle.org
Sun Nov 27 18:50:59 CET 2005


Log:
Redundant castclass, huh?

Author: malekith
Date: Sun Nov 27 18:50:59 2005
New Revision: 5973

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	Sun Nov 27 18:50:59 2005
@@ -34,7 +34,7 @@
 
 variant Scene
   | Sphere { m : Vec; r : double; }
-  | Group { m : Vec; s : double; l : list [Scene]; }
+  | Group { m : Vec; r : double; l : list [Scene]; }
 
 def delta = 1.49011611938476562e-08
 def inf = double.PositiveInfinity
@@ -78,6 +78,22 @@
   def aux (elt, first)
     def l = first [0]
     match (elt)
+// this gives 5% speedup...
+#if BETTER_MATCHING
+      | Scene.Sphere as s =>
+        def center = s.m
+        def radius = s.r
+        def l' = ray_sphere (orig, dir, 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)
+        if (l' >= l) first
+        else scenes.FoldLeft (first, aux)
+#else
       | Scene.Sphere (center, radius) =>
         def l' = ray_sphere (orig, dir, center, radius)
         if (l' >= l) first
@@ -86,6 +102,7 @@
         def l' = ray_sphere (orig, dir, center, radius)
         if (l' >= l) first
         else scenes.FoldLeft (first, aux)
+#endif
   aux (scene, (inf, Vec ()))
 
 /*



More information about the svn mailing list