[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