From 9fa518572e0a6b741dcdc9ae43b40b2f55934765 Mon Sep 17 00:00:00 2001 From: hal8174 Date: Tue, 15 Jul 2025 20:34:03 +0200 Subject: [PATCH] Add renderer selection and progress bar for tev backend --- Cargo.lock | 142 +++++++++++++++++++++++++++++++++++- ray-tracing-tev/Cargo.toml | 1 + ray-tracing-tev/src/main.rs | 127 +++++++++++++++++++------------- 3 files changed, 216 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a9d4035..5cab906 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -510,6 +510,19 @@ dependencies = [ "memchr", ] +[[package]] +name = "console" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e09ced7ebbccb63b4c65413d821f2e00ce54c5ca4514ddc6b3c892fdbcbc69d" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.1", + "windows-sys 0.60.2", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -721,7 +734,7 @@ dependencies = [ "log", "raw-window-handle", "smithay-clipboard", - "web-time", + "web-time 0.2.4", "webbrowser", "winit", ] @@ -756,6 +769,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "epaint" version = "0.24.1" @@ -1235,6 +1254,19 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "indicatif" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd" +dependencies = [ + "console", + "portable-atomic", + "unicode-width 0.2.1", + "unit-prefix", + "web-time 1.1.0", +] + [[package]] name = "instant" version = "0.1.13" @@ -1496,7 +1528,7 @@ dependencies = [ "terminal_size", "textwrap", "thiserror", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] @@ -2011,6 +2043,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -2256,6 +2294,7 @@ name = "ray-tracing-tev" version = "0.1.0" dependencies = [ "clap", + "indicatif", "rand", "ray-tracing-core", "ray-tracing-renderer", @@ -2679,7 +2718,7 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] @@ -2833,6 +2872,18 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" + +[[package]] +name = "unit-prefix" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817" + [[package]] name = "url" version = "2.5.4" @@ -3121,6 +3172,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webbrowser" version = "0.8.15" @@ -3220,6 +3281,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -3259,13 +3329,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -3284,6 +3370,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -3302,6 +3394,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -3320,12 +3418,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -3344,6 +3454,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -3362,6 +3478,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -3380,6 +3502,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -3398,6 +3526,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winit" version = "0.28.7" diff --git a/ray-tracing-tev/Cargo.toml b/ray-tracing-tev/Cargo.toml index b2426f3..693e014 100644 --- a/ray-tracing-tev/Cargo.toml +++ b/ray-tracing-tev/Cargo.toml @@ -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" diff --git a/ray-tracing-tev/src/main.rs b/ray-tracing-tev/src/main.rs index cc5b4bb..1d1c515 100644 --- a/ray-tracing-tev/src/main.rs +++ b/ray-tracing-tev/src/main.rs @@ -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, + #[arg(long)] scenes: Vec, #[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(); + } } }