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

malekith svnadmin at nemerle.org
Mon Nov 28 13:19:47 CET 2005


Log:
Reduce copying.

Author: malekith
Date: Mon Nov 28 13:19:46 2005
New Revision: 5978

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

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:19:46 2005
@@ -21,18 +21,23 @@
     (1 / Sqrt (this ** this)) * this
 
 
+[Record] \
+class Ray
+  public orig : Vec
+  public dir : Vec
+  
 abstract class Scene
-  public abstract intersect (orig : Vec, dir : Vec, first : double * Vec) : double * Vec
+  public abstract intersect (r : Ray, first : double * Vec) : double * Vec
   
   [Record] \
   internal sealed class Sphere : Scene
     public center : Vec
     public radius : double
-    public override intersect (orig : Vec, dir : Vec, first : double * Vec) : double * Vec
+    public override intersect (r : Ray, first : double * Vec) : double * Vec
       def l = first [0]
-      def l' = M.ray_sphere (orig, dir, center, radius)
+      def l' = M.ray_sphere (r, center, radius)
       if (l' >= l) first
-      else (l', (orig + l' * dir - center).Unitise ())
+      else (l', (r.orig + l' * r.dir - center).Unitise ())
   
   [Record] \
   internal sealed class Group : Scene
@@ -40,23 +45,23 @@
     public radius : double
     public scenes : list [Scene]
     
-    public override intersect (orig : Vec, dir : Vec, first : double * Vec) : double * Vec
+    public override intersect (r : Ray, first : double * Vec) : double * Vec
         def l = first [0]
-        def l' = M.ray_sphere (orig, dir, center, radius)
+        def l' = M.ray_sphere (r, center, radius)
         if (l' >= l) first
         else
           mutable acc = first
           foreach (s in scenes)
-            acc = s.intersect (orig, dir, acc)
+            acc = s.intersect (r, acc)
           acc
   
 module M
   delta = 1.49011611938476562e-08
   inf : double = 1.0 / 0.0
 
-  internal ray_sphere (orig : Vec, dir : Vec, center : Vec, radius : double) : double
-    def v = center - orig
-    def b = v ** dir
+  internal ray_sphere (r : Ray, center : Vec, radius : double) : double
+    def v = center - r.orig
+    def b = v ** r.dir
     def disc = b * b - (v ** v) + radius * radius
     if (disc < 0) inf
     else
@@ -68,14 +73,14 @@
       else t2
 
   ray_trace (light:Vec, orig:Vec, dir:Vec, scene:Scene) : double
-    def (lambda, normal) = scene.intersect (orig, dir, (inf, Vec()))
+    def (lambda, normal) = scene.intersect (Ray (orig, dir), (inf, Vec()))
     if (lambda == inf) 0.0
     else
       def g = normal ** light
       if (g >= 0) 0.0
       else
         def p = orig + lambda * dir + delta * normal
-        if ((scene.intersect (p, -1 * light, (inf,Vec()))) [0] < inf) 0.0
+        if ((scene.intersect (Ray (p, -1 * light), (inf,Vec()))) [0] < inf) 0.0
         else -g
 
   internal main (level : int, n : int) : void



More information about the svn mailing list