[svn] r5984: nemerle/trunk/snippets/raytracer: Makefile
ray-compressed.n ray-hand-opt.n
malekith
svnadmin at nemerle.org
Tue Nov 29 22:25:45 CET 2005
Log:
A little cheat.
Author: malekith
Date: Tue Nov 29 22:25:44 2005
New Revision: 5984
Modified:
nemerle/trunk/snippets/raytracer/Makefile
nemerle/trunk/snippets/raytracer/ray-compressed.n
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 Tue Nov 29 22:25:44 2005
@@ -48,8 +48,9 @@
%.exe: %.cs
gmcs $<
-run: ray.exe ray-hand-opt.exe ray-cs.exe
+run: ray.exe ray-hand-opt.exe ray-cs.exe ray-compressed.exe
time $(EXECUTE) ./ray.exe 9 128 > out1.ppm
+ time $(EXECUTE) ./ray-compressed.exe 9 128 > out4.ppm
time $(EXECUTE) ./ray-hand-opt.exe 9 128 > out2.ppm
time $(EXECUTE) ./ray-cs.exe 9 128 > out3.ppm
Modified: nemerle/trunk/snippets/raytracer/ray-compressed.n
==============================================================================
--- nemerle/trunk/snippets/raytracer/ray-compressed.n (original)
+++ nemerle/trunk/snippets/raytracer/ray-compressed.n Tue Nov 29 22:25:44 2005
@@ -10,24 +10,24 @@
| Sphere { m : Vec; r : double; }
| Group { m : Vec; r : double; l : list [Scene]; }
def delta = 1.49011611938476562e-08; def inf = double.PositiveInfinity
-def ray_sphere (orig, dir, center, radius : double)
+def intersect (orig, dir : Vec, scene)
+ def ray_sphere (center, radius : double)
def v = center - orig; def b = v ** dir
def disc = b * b - (v ** v) + radius * radius
if (disc < 0) inf else
def disc = System.Math.Sqrt (disc)
def t2 = b + disc; def t1 = b - disc
if (t2 < 0) inf else if (t1 > 0) t1 else t2
-def intersect (orig, dir : Vec, scene)
- def aux (elt, first)
- def l = first [0]
+ mutable l = inf, v = Vec ()
+ def aux (elt)
match (elt)
| Scene.Sphere (center, radius) =>
- def l' = ray_sphere (orig, dir, center, radius)
- if (l' >= l) first else (l', (orig + l' * dir - center).Unitise ())
+ def l' = ray_sphere (center, radius)
+ when (l' < l) { l = l'; v = center }
| Scene.Group (center, radius, scenes) =>
- def l' = ray_sphere (orig, dir, center, radius)
- if (l' >= l) first else scenes.FoldLeft (first, aux)
- aux (scene, (inf, Vec ()))
+ def l' = ray_sphere (center, radius)
+ when (l' < l) foreach (s in scenes) aux (s)
+ aux (scene); (l, (orig + l * dir - v).Unitise ())
def ray_trace (light, orig, dir, scene)
def (lambda, normal) = intersect (orig, dir, scene)
if (lambda == inf) 0.0 else
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 Tue Nov 29 22:25:44 2005
@@ -42,6 +42,7 @@
def l = M.ray_sphere (r, center, radius)
when (l < h.lambda)
h.lambda = l
+ h.dir = center
h.dir = (r.orig + l * r.dir - center).Unitise ()
[Record] \
@@ -78,6 +79,7 @@
scene.intersect (Ray (orig, dir), h)
if (h.lambda == inf) 0.0
else
+ h.dir = (orig + h.lambda * dir - h.dir).Unitise ()
def g = h.dir ** light
if (g >= 0) 0.0
else
More information about the svn
mailing list