[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