feat(rtlisp): add rt_inerp binary and demo script

This commit is contained in:
Jonas Röger 2025-01-11 16:35:09 +01:00
parent 1871f6cae4
commit b38e6c00a5
Signed by: jonas
GPG Key ID: 4000EB35E1AE0F07
5 changed files with 127 additions and 4 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
.direnv/ .direnv/
target/ target/
result/ result/
*.png

View File

@ -22,6 +22,10 @@ path = "src/bin/repl.rs"
name = "rt_lisp_demo" name = "rt_lisp_demo"
path = "src/bin/rt_lisp_demo.rs" path = "src/bin/rt_lisp_demo.rs"
[[bin]]
name = "rt_interp"
path = "src/bin/rt_interp.rs"
[workspace] [workspace]
members = [ "lispers-core", "lispers-macro"] members = [ "lispers-core", "lispers-macro"]

79
scenes/demo-1.lisp Normal file
View File

@ -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")

38
src/bin/rt_interp.rs Normal file
View File

@ -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!");
}

View File

@ -6,20 +6,21 @@ use lispers_core::parser::ExpressionStream;
fn main() { fn main() {
let programs = [ let programs = [
"(vadd (vector 1 2 3) (vector 4 5 6))", "(set 'red (material (color 1 0 0) (color 1 0 0) (color 0.5 0 0) 50 0.25))",
"(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 'blue (material (color 0 0 1) (color 0 0 1) (color 0 0 0.6) 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 '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 '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 '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 's1 (sphere (point 0 1 0) 1 blue))",
"(set 's2 (sphere (point 2 0.5 2) 0.5 green))", "(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 '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 'l1 (light (point 3 10 5) (color 1 1 1)))",
"(set 'l2 (light (point 2 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 (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))", "(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\")", "(render cam scn 5 4 \"rt-lisp-demo.png\")",
]; ];