diff --git a/.gitignore b/.gitignore index 80c4fce..734e022 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .direnv/ target/ result/ +*.png diff --git a/Cargo.toml b/Cargo.toml index 4d9832a..09b20c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,10 @@ path = "src/bin/repl.rs" name = "rt_lisp_demo" path = "src/bin/rt_lisp_demo.rs" +[[bin]] +name = "rt_interp" +path = "src/bin/rt_interp.rs" + [workspace] members = [ "lispers-core", "lispers-macro"] diff --git a/scenes/demo-1.lisp b/scenes/demo-1.lisp new file mode 100644 index 0000000..021914a --- /dev/null +++ b/scenes/demo-1.lisp @@ -0,0 +1,79 @@ +(set 'red + (material + (color 1 0 0) + (color 1 0 0) + (color 0.5 0 0) + 50 0.25)) +(set 'blue + (material + (color 0 0 1) + (color 0 0 1) + (color 0 0 0.6) + 50 0.25)) +(set 'green + (material + (color 0 1 0) + (color 0 1 0) + (color 0 0.6 0) + 50 0.25)) +(set 'white + (material + (color 1 1 1) + (color 1 1 1) + (color 0.6 0.6 0.6) + 100 0.5)) +(set 'black + (material + (color 0 0 0) + (color 0 0 0) + (color 0.6 0.6 0.6) + 100 0.5)) + +(set 's1 + (sphere + (point 0 1 0) 1 blue)) +(set 's2 + (sphere + (point 2 0.5 2) 0.5 green)) + +(defun spiral-sphere (i n) + (sphere + (progn + (print "Spiral Sphere at: ") + (println (point + (* 2 (cos (/ (* i 6.2) n))) + 0.5 + (* 2 (sin (/ (* i 6.2) n))))) + ) + 0.5 red)) + +(defun spiral (scn i n) + (if (< i n) + (scene-add + (spiral scn (+ i 1) n) + (spiral-sphere i n)) + scn)) + +(set 'p1 + (checkerboard + (point 0 0 0) + (vector 0 1 0) + black white 0.5 + (vector 0.5 0 1))) + +(set 'l1 (light (point 3 10 5) (color 1 1 1))) +(set 'l2 (light (point 2 10 5) (color 1 1 1))) + + +(set 'scn (scene + (color 0.1 0.1 0.1) + '(s1 s2 p1) + '(l1 l2))) + +(set 'scn (spiral scn 0.0 10.0)) + +(println (cons "Final Scene:" scn)) + +(set 'cam (camera (point 0 3 6) (point 0 0 0) (vector 0 1 0) 40 1920 1080)) + +(render cam scn 5 4 "demo-1.png") diff --git a/src/bin/rt_interp.rs b/src/bin/rt_interp.rs new file mode 100644 index 0000000..6471bb1 --- /dev/null +++ b/src/bin/rt_interp.rs @@ -0,0 +1,38 @@ +use std::env; + +use lispers::raytracer::lisp::mk_raytrace; +use lispers_core::lisp::environment::EnvironmentLayer; +use lispers_core::lisp::prelude::mk_prelude; +use lispers_core::lisp::{eval, Environment}; +use lispers_core::parser::ExpressionStream; + +fn main() { + let program_paths: Vec<_> = env::args().skip(1).collect(); + let programs: Vec<_> = program_paths + .iter() + .map(|path| std::fs::read_to_string(path).unwrap()) + .collect(); + + let mut layer = EnvironmentLayer::new(); + mk_prelude(&mut layer); + mk_raytrace(&mut layer); + + let environment = Environment::from_layer(layer); + + for (i, r) in + ExpressionStream::from_char_stream(programs.iter().map(|p| p.chars()).flatten()).enumerate() + { + match r { + Err(err) => { + println!("ParserError in Expression {}: {:?}", i + 1, err); + break; + } + Ok(expr) => match eval(&environment, expr) { + Ok(_) => {} + Err(e) => println!("Error evaluating Expression {}: {}", i + 1, e), + }, + } + } + + println!("Interpreter Done!"); +} diff --git a/src/bin/rt_lisp_demo.rs b/src/bin/rt_lisp_demo.rs index 2513a39..1d5bf1c 100644 --- a/src/bin/rt_lisp_demo.rs +++ b/src/bin/rt_lisp_demo.rs @@ -6,20 +6,21 @@ use lispers_core::parser::ExpressionStream; fn main() { let programs = [ - "(vadd (vector 1 2 3) (vector 4 5 6))", - "(vadd (vector 1 2 3) (point 4 5 6))", - "(vadd (point 1 2 3) (vector 4 5 6))", - "(vadd (point 1 2 3) (point 4 5 6))", + "(set 'red (material (color 1 0 0) (color 1 0 0) (color 0.5 0 0) 50 0.25))", "(set 'blue (material (color 0 0 1) (color 0 0 1) (color 0 0 0.6) 50 0.25))", "(set 'green (material (color 0 1 0) (color 0 1 0) (color 0 0.6 0) 50 0.25))", "(set 'white (material (color 1 1 1) (color 1 1 1) (color 0.6 0.6 0.6) 100 0.5))", "(set 'black (material (color 0 0 0) (color 0 0 0) (color 0.6 0.6 0.6) 100 0.5))", "(set 's1 (sphere (point 0 1 0) 1 blue))", "(set 's2 (sphere (point 2 0.5 2) 0.5 green))", + "(defun spiral-sphere (i n) (sphere (print (point (* 2 (cos (/ (* i 6.2) n))) 0.5 (* 2 (sin (/ (* i 6.2) n))))) 0.5 red))", + "(defun spiral (scn i n) (if (< i n) (scene-add (spiral scn (+ i 1) n) (spiral-sphere i n)) scn))", "(set 'p1 (checkerboard (point 0 0 0) (vector 0 1 0) black white 0.5 (vector 0.5 0 1)))", "(set 'l1 (light (point 3 10 5) (color 1 1 1)))", "(set 'l2 (light (point 2 10 5) (color 1 1 1)))", "(set 'scn (scene (color 0.1 0.1 0.1) '(s1 s2 p1) '(l1 l2)))", + "(set 'scn (spiral scn 0.0 10.0))", + "(print scn)", "(set 'cam (camera (point 0 3 6) (point 0 0 0) (vector 0 1 0) 40 1920 1080))", "(render cam scn 5 4 \"rt-lisp-demo.png\")", ];