[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