diff --git a/scenes/demo-4.lisp b/scenes/demo-4.lisp new file mode 100644 index 0000000..fc5950b --- /dev/null +++ b/scenes/demo-4.lisp @@ -0,0 +1,48 @@ +(include "./materials.lisp") + +(set 'frames 300) +(set 'fps 30) +(set 'ray-depth 5) +(set 'sub-pixel 2) + +(set 'mz (mandel-zoom frames 1800 50000)) +(println (mz 1)) + +(defun mandel-plane (t) + (texture-plane + (mz t) + (point 0 0 0) + (vector 0 1 0) + 1.0 + (vector 1 0 0) + )) + +(set 'l1 (light (point 3 10 5) (color 1 1 1))) +(set 'l2 (light (point 2 10 5) (color 1 1 1))) + +(defun scn (t) + (scene + (color 0.1 0.1 0.1) + '((mandel-plane t)) + '(l1 l2) + )) + +(defun cam (t c) c) + +(set 'base-cam + (camera + (point 0 3 6) + (point 0 0 0) + (vector 0 1 0) + 40 1920 1080)) + + +(render-animation + base-cam + "demo-4-animation.mp4" + scn + cam + frames + fps + ray-depth + sub-pixel) diff --git a/scenes/materials.lisp b/scenes/materials.lisp index de83466..a7e3545 100644 --- a/scenes/materials.lisp +++ b/scenes/materials.lisp @@ -35,3 +35,32 @@ (color 0.01 0.05 0.15) (color 0.01 0.05 0.15) 20 0.7)) + +(set 'mandelbrot-red + (mandelbrot-texture + 1800.0 + (point2 -0.7489967346191402 -0.06952285766601607) + 1000 + (color 0.3 0 0) + (color 0.3 0 0) + (color 0.3 0 0) + )) + + +(defun mandel-zoom (n z1 z2) + (let '((n . n) + (z1 . z1) + (z2 . z2)) + (lambda (t) + (let '((pct . (/ t (* n 1.0))) + (range . (- z2 z1))) + (mandelbrot-texture + (+ z1 (* pct range)) + (point2 -0.7489967346191402 -0.06952285766601607) + 1000 + (color 0.3 0 0) + (color 0.3 0 0) + (color 0.3 0 0) + ) + ))) + ) diff --git a/src/bin/rt_lisp_demo.rs b/src/bin/rt_lisp_demo.rs index 71b86ca..e3d0d5f 100644 --- a/src/bin/rt_lisp_demo.rs +++ b/src/bin/rt_lisp_demo.rs @@ -25,11 +25,6 @@ fn main() { } } - let mut layer = EnvironmentLayer::new(); - mk_prelude(&mut layer); - mk_raytrace(&mut layer); - let environment = Environment::from_layer(layer); - let args: Vec<_> = std::env::args().collect(); if args.len() != 2 { @@ -41,6 +36,21 @@ fn main() { return; } + let mut layer = EnvironmentLayer::new(); + mk_prelude(&mut layer); + mk_raytrace(&mut layer); + let mut environment = Environment::from_layer(layer); + environment.set( + "FILE".to_string(), + scenes + .get(&args[1]) + .expect("Scene file not found") + .path() + .display() + .to_string() + .into(), + ); + for r in ExpressionStream::from_char_stream( std::fs::read_to_string(scenes.get(&args[1]).expect("Scene file not found").path()) .expect("Failed to read scene file") @@ -49,13 +59,16 @@ fn main() { match r { Err(err) => { println!("ParserError: {:?}", err); - break; + return; } Ok(expr) => { println!("Evaluating: {}", expr.clone()); match eval(&environment, expr) { Ok(e) => println!("=> {}", e), - Err(e) => println!("Error: {}", e), + Err(e) => { + println!("Error: {}", e); + return; + } } } }