Add renderer selection and progress bar for tev backend

This commit is contained in:
hal8174 2025-07-15 20:34:03 +02:00
parent ee39d9d631
commit 9fa518572e
Signed by: hal8174
SSH key fingerprint: SHA256:JwuqS+eVfISfKr+DkDQ6NWAbGd1jFAHkPpCM1yCnlTs
3 changed files with 216 additions and 54 deletions

View file

@ -11,3 +11,4 @@ ray-tracing-renderer = { path = "../ray-tracing-renderer" }
rayon = "1.10.0"
rand = { version = "0.8.5", features = ["small_rng"] }
clap = { version = "4.5.19", features = ["derive"] }
indicatif = "0.18.0"

View file

@ -1,4 +1,5 @@
use clap::Parser;
use indicatif::{ProgressBar, ProgressStyle};
use rand::{rngs::SmallRng, SeedableRng};
use ray_tracing_core::{
camera::{BasicCamera, Camera},
@ -19,6 +20,9 @@ use tev_client::{PacketCreateImage, PacketUpdateImage, TevClient, TevError};
struct Args {
#[arg(long, default_value = "127.0.0.1:14158")]
tev: String,
#[arg(long)]
renderers: Vec<String>,
#[arg(long)]
scenes: Vec<String>,
#[arg(long, default_value_t = 400)]
width: u32,
@ -42,6 +46,15 @@ fn render_image<
) -> Result<(), TevError> {
let mut data = vec![0.0; (renderer.width() * renderer.height() * 3) as usize];
let bar = ProgressBar::new(renderer.width() as u64 * renderer.height() as u64);
bar.set_style(
ProgressStyle::with_template(
"[{elapsed_precise}] [{wide_bar:.cyan/blue}] {percent_precise}% ({eta_precise})",
)
.unwrap()
.progress_chars("#>-"),
);
let start = std::time::Instant::now();
data.par_chunks_mut(3).enumerate().for_each(|(i, c)| {
let x = (i % renderer.width() as usize) as u32;
@ -59,7 +72,11 @@ fn render_image<
c[2] += r.b();
}
}
bar.inc(1);
});
bar.finish_and_clear();
println!("Rendered \"{}\" in {:?}", name.as_ref(), start.elapsed());
let channel_names = &["r", "g", "b"];
@ -115,59 +132,69 @@ fn main() {
f.get_horizontal_fov(),
);
let r = DepthRenderer::new(args.width, args.height);
render_image(
format!("{scene} - depth renderer"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
if args.renderers.is_empty() || args.renderers.contains(&String::from("depth")) {
let r = DepthRenderer::new(args.width, args.height);
render_image(
format!("{scene} - depth renderer"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
let r = PathTracer::new(args.width, args.height);
render_image(
format!("{scene} - path tracer"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
if args.renderers.is_empty() || args.renderers.contains(&String::from("path")) {
let r = PathTracer::new(args.width, args.height);
render_image(
format!("{scene} - path tracer"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
let r = PathTracerImportance::new(args.width, args.height);
render_image(
format!("{scene} - path tracer importance"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
if args.renderers.is_empty() || args.renderers.contains(&String::from("importance")) {
let r = PathTracerImportance::new(args.width, args.height);
render_image(
format!("{scene} - path tracer importance"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
let r = NextEventEstimation::new(args.width, args.height);
render_image(
format!("{scene} - next event estimation"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
if args.renderers.is_empty() || args.renderers.contains(&String::from("nee")) {
let r = NextEventEstimation::new(args.width, args.height);
render_image(
format!("{scene} - next event estimation"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
let r = MIS::new(args.width, args.height);
render_image(
format!("{scene} - mis"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
if args.renderers.is_empty() || args.renderers.contains(&String::from("mis")) {
let r = MIS::new(args.width, args.height);
render_image(
format!("{scene} - mis"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
}
}