[svn] r5977: nemerle/trunk/snippets/raytracer/ray.n
malekith
svnadmin at nemerle.org
Mon Nov 28 13:16:30 CET 2005
Log:
This gives assert in the compiler.
Author: malekith
Date: Mon Nov 28 13:16:30 2005
New Revision: 5977
Modified:
nemerle/trunk/snippets/raytracer/ray.n
Modified: nemerle/trunk/snippets/raytracer/ray.n
==============================================================================
--- nemerle/trunk/snippets/raytracer/ray.n (original)
+++ nemerle/trunk/snippets/raytracer/ray.n Mon Nov 28 13:16:30 2005
@@ -4,17 +4,6 @@
#define BETTER_MATCHING
-/*
-let delta = Sqrt epsilon_float
-type vec = { x: float; y: float; z: float }
-let ( *| ) s r = {x = s *. r.x; y = s *. r.y; z = s *. r.z}
-let ( +| ) a b = {x = a.x +. b.x; y = a.y +. b.y; z = a.z +. b.z}
-let ( -| ) a b = {x = a.x -. b.x; y = a.y -. b.y; z = a.z -. b.z}
-let dot a b = a.x *. b.x +. a.y *. b.y +. a.z *. b.z
-let unitise r = (1. /. Sqrt (dot r r)) *| r
-type scene = Sphere of vec * float | Group of vec * float * scene list
-*/
-
[Record] \
struct Vec
x : double
@@ -41,18 +30,8 @@
def delta = 1.49011611938476562e-08
def inf = double.PositiveInfinity
-/*
-let ray_sphere orig dir center radius =
- let v = center -| orig in
- let b = dot v dir in
- let disc = b *. b -. dot v v +. radius *. radius in
- if disc < 0. then infinity else
- let disc = Sqrt disc in
- (fun t2 -> if t2 < 0. then infinity else
- ((fun t1 -> if t1 > 0. then t1 else t2) (b -. disc))) (b +. disc)
- */
-
-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
@@ -65,18 +44,6 @@
else if (t1 > 0) t1
else t2
-/*
-let intersect orig dir =
- let rec aux ((l, _) as first) = function
- Sphere (center, radius) ->
- let l' = ray_sphere orig dir center radius in
- if l' >= l then first else l', unitise (orig +| l' *| dir -| center)
- | Group (center, radius, scenes) ->
- let l' = ray_sphere orig dir center radius in
- if l' >= l then first else List.fold_left aux first scenes in
- aux (infinity, {x=0.; y=0.; z=0.})
- */
-def intersect (orig, dir : Vec, scene)
def aux (elt, first)
def l = first [0]
match (elt)
@@ -85,14 +52,14 @@
| Scene.Sphere as s =>
def center = s.m
def radius = s.r
- def l' = ray_sphere (orig, dir, center, radius)
+ def l' = ray_sphere (center, radius)
if (l' >= l) first
else (l', (orig + l' * dir - center).Unitise ())
| Scene.Group as g =>
def center = g.m
def radius = g.r
def scenes = g.l
- def l' = ray_sphere (orig, dir, center, radius)
+ def l' = ray_sphere (center, radius)
if (l' >= l) first
else scenes.FoldLeft (first, aux)
#else
@@ -107,15 +74,7 @@
#endif
aux (scene, (inf, Vec ()))
-/*
-let rec ray_trace light orig dir scene =
- let lambda, normal = intersect orig dir scene in
- if lambda = infinity then 0. else
- let g = dot normal light in
- if g >= 0. then 0. else
- let p = orig +| lambda *| dir +| delta *| normal in
- if fst (intersect p (-1. *| light) scene) < infinity then 0. else -. g
-*/
+
def ray_trace (light, orig, dir, scene)
def (lambda, normal) = intersect (orig, dir, scene)
if (lambda == inf) 0.0
@@ -127,14 +86,6 @@
if ((intersect (p, -1 * light, scene)) [0] < inf) 0.0
else -g
-/*
-let rec create level c r =
- let obj = Sphere (c, r) in
- if level = 1 then obj else
- let a = 3. *. r /. Sqrt 12. in
- let aux x' z' = create (level - 1) (c +| {x=x'; y=a; z=z'}) (0.5 *. r) in
- Group (c, 3.*.r, [obj; aux (-.a) (-.a); aux a (-.a); aux (-.a) a; aux a a])
- */
def create (level, c, r)
def obj = Scene.Sphere (c, r)
if (level == 1) obj
@@ -143,26 +94,7 @@
def aux (x', z')
create (level - 1, c + Vec (x', a, z'), 0.5 * r)
Scene.Group (c, 3 * r , [obj, aux (-a, -a), aux (a, -a), aux (-a, a), aux (a, a)])
- /*
-let main level n =
- let scene = create level { x = 0.; y = -1.; z = 0. } 1. in
- let light = unitise {x= -1.; y= -3.; z=2.} and ss = 4 in
- Printf.printf "P5\n%d %d\n255\n" n n;
- for y = n - 1 downto 0 do
- for x = 0 to n - 1 do
- let g = ref 0. in
- for dx = 0 to ss - 1 do
- for dy = 0 to ss - 1 do
- let aux x d = float x -. float n /. 2. +. float d /. float ss in
- let dir = unitise {x = aux x dx; y = aux y dy; z = float n } in
- g := !g +. ray_trace light {x=0.; y=0.; z= -4.} dir scene
- done
- done;
- let g = 0.5 +. 255. *. !g /. float (ss*ss) in
- Printf.printf "%c" (char_of_int (int_of_float g))
- done
- done
- */
+
def main (level, n)
def scene = create (level, Vec (0, -1, 0), 1)
def light = Vec (-1, -3, 2).Unitise ()
@@ -180,11 +112,7 @@
g += ray_trace (light, Vec (0,0,-4), dir, scene)
def res = (0.5 + 255 * g / (ss*ss)) :> int
s.WriteByte (res :> byte)
-/*
-let () = match Sys.argv with
- [| _; level; n|] -> main (int_of_string level) (int_of_string n)
- | _ -> main 9 512
- */
+
match (Nemerle.Collections.List.FromArray (System.Environment.GetCommandLineArgs()))
| [_, level, n] => main (int.Parse (level), int.Parse (n))
| _ => main (9, 512)
More information about the svn
mailing list