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

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


Log:
Reduce copying even more. Now it is as fast as C# version, but how to do it in a Nemerle way?

Author: malekith
Date: Mon Nov 28 13:30:32 2005
New Revision: 5979

Modified:
   nemerle/trunk/snippets/raytracer/Makefile
   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	Mon Nov 28 13:30:32 2005
@@ -49,9 +49,9 @@
 	gmcs $<
 
 run: ray.exe ray-hand-opt.exe ray-cs.exe
-	time $(EXECUTE) ./ray.exe 9 128 > out.ppm
-	time $(EXECUTE) ./ray-hand-opt.exe 9 128 > out.ppm
-	time $(EXECUTE) ./ray-cs.exe 9 128 > out.ppm
+	time $(EXECUTE) ./ray.exe 9 128 > out1.ppm
+	time $(EXECUTE) ./ray-hand-opt.exe 9 128 > out2.ppm
+	time $(EXECUTE) ./ray-cs.exe 9 128 > out3.ppm
 
 links:
 	ln -fs ../../ncc/out.stage3/*.dll .

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	Mon Nov 28 13:30:32 2005
@@ -26,18 +26,23 @@
   public orig : Vec
   public dir : Vec
   
+[Record] \
+class Hit
+  public mutable lambda : double
+  public mutable dir : Vec
+  
 abstract class Scene
-  public abstract intersect (r : Ray, first : double * Vec) : double * Vec
+  public abstract intersect (r : Ray, h : Hit) : void
   
   [Record] \
   internal sealed class Sphere : Scene
     public center : Vec
     public radius : double
-    public override intersect (r : Ray, first : double * Vec) : double * Vec
-      def l = first [0]
-      def l' = M.ray_sphere (r, center, radius)
-      if (l' >= l) first
-      else (l', (r.orig + l' * r.dir - center).Unitise ())
+    public override intersect (r : Ray, h : Hit) : void
+      def l = M.ray_sphere (r, center, radius)
+      when (l < h.lambda)
+        h.lambda = l
+        h.dir = (r.orig + l * r.dir - center).Unitise ()
   
   [Record] \
   internal sealed class Group : Scene
@@ -45,15 +50,11 @@
     public radius : double
     public scenes : list [Scene]
     
-    public override intersect (r : Ray, first : double * Vec) : double * Vec
-        def l = first [0]
-        def l' = M.ray_sphere (r, center, radius)
-        if (l' >= l) first
-        else
-          mutable acc = first
+    public override intersect (r : Ray, h : Hit) : void
+        def l = M.ray_sphere (r, center, radius)
+        when (l < h.lambda)
           foreach (s in scenes)
-            acc = s.intersect (r, acc)
-          acc
+            s.intersect (r, h)
   
 module M
   delta = 1.49011611938476562e-08
@@ -73,14 +74,17 @@
       else t2
 
   ray_trace (light:Vec, orig:Vec, dir:Vec, scene:Scene) : double
-    def (lambda, normal) = scene.intersect (Ray (orig, dir), (inf, Vec()))
-    if (lambda == inf) 0.0
+    def h = Hit (inf, Vec())
+    scene.intersect (Ray (orig, dir), h)
+    if (h.lambda == inf) 0.0
     else
-      def g = normal ** light
+      def g = h.dir ** light
       if (g >= 0) 0.0
       else
-        def p = orig + lambda * dir + delta * normal
-        if ((scene.intersect (Ray (p, -1 * light), (inf,Vec()))) [0] < inf) 0.0
+        def p = orig + h.lambda * dir + delta * h.dir
+        h.lambda = inf
+        scene.intersect (Ray (p, -1 * light), h)
+        if (h.lambda < inf) 0.0
         else -g
 
   internal main (level : int, n : int) : void



More information about the svn mailing list