diff --git a/Cargo.lock b/Cargo.lock index d422d27..c2d37e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,9 +128,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "cc" -version = "1.1.22" +version = "1.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0" +checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" dependencies = [ "jobserver", "libc", @@ -544,9 +544,12 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" +dependencies = [ + "portable-atomic", +] [[package]] name = "paste" @@ -573,6 +576,12 @@ dependencies = [ "miniz_oxide 0.8.0", ] +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -754,6 +763,18 @@ dependencies = [ "ray-tracing-material", ] +[[package]] +name = "ray-tracing-tev" +version = "0.1.0" +dependencies = [ + "rand", + "ray-tracing-core", + "ray-tracing-renderer", + "ray-tracing-scene", + "rayon", + "tev_client", +] + [[package]] name = "rayon" version = "1.10.0" @@ -884,6 +905,12 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "tev_client" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c845c2d56d4f732d09a32c9ea2cd3f01923be7a5f98d9f7f0a347205c3141036" + [[package]] name = "thiserror" version = "1.0.64" diff --git a/Cargo.toml b/Cargo.toml index 9d3fbfc..0f2b1d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,4 @@ [workspace] -members = [ "ray-tracing-core", "ray-tracing-image", "ray-tracing-material", "ray-tracing-renderer", "ray-tracing-scene"] +members = [ "ray-tracing-core", "ray-tracing-image", "ray-tracing-material", "ray-tracing-renderer", "ray-tracing-scene", "ray-tracing-tev"] resolver = "2" diff --git a/ray-tracing-renderer/src/depth_renderer.rs b/ray-tracing-renderer/src/depth_renderer.rs index 4562918..49db54f 100644 --- a/ray-tracing-renderer/src/depth_renderer.rs +++ b/ray-tracing-renderer/src/depth_renderer.rs @@ -37,10 +37,10 @@ where let r = self.camera.forward(x, y, rng); if let Some(i) = self.scene.intersect(r, 0.0, Float::INFINITY) { - // Color::gray(1.0 / i.t()) - let c = 0.5 * (i.normal() + Dir3::new(1.0, 1.0, 1.0)); + Color::gray(1.0 / i.t()) + // let c = 0.5 * (i.normal() + Dir3::new(1.0, 1.0, 1.0)); // let c = i.normal(); - Color::new(c.x(), c.y(), c.z()) + // Color::new(c.x(), c.y(), c.z()) } else { Color::black() } diff --git a/ray-tracing-renderer/src/path_tracer_importance.rs b/ray-tracing-renderer/src/path_tracer_importance.rs index 6bc157e..15fd75d 100644 --- a/ray-tracing-renderer/src/path_tracer_importance.rs +++ b/ray-tracing-renderer/src/path_tracer_importance.rs @@ -46,7 +46,7 @@ where let w_in = frame.to_frame(-r.dir()); if let Some(light) = i.light() { - sum += alpha * light.emit(w_in, rng) * w_in.y(); + sum += alpha * light.emit(w_in, rng); } let w_out = if let Some(material) = i.material() { diff --git a/ray-tracing-tev/Cargo.toml b/ray-tracing-tev/Cargo.toml new file mode 100644 index 0000000..5093c57 --- /dev/null +++ b/ray-tracing-tev/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "ray-tracing-tev" +version = "0.1.0" +edition = "2021" + +[dependencies] +tev_client = "0.5.2" +ray-tracing-core = { path = "../ray-tracing-core" } +ray-tracing-scene = { path = "../ray-tracing-scene" } +ray-tracing-renderer = { path = "../ray-tracing-renderer" } +rayon = "1.10.0" +rand = { version = "0.8.5", features = ["small_rng"] } diff --git a/ray-tracing-tev/src/main.rs b/ray-tracing-tev/src/main.rs new file mode 100644 index 0000000..151191b --- /dev/null +++ b/ray-tracing-tev/src/main.rs @@ -0,0 +1,100 @@ +use rand::{rngs::SmallRng, SeedableRng}; +use ray_tracing_core::{camera::BasicCamera, prelude::*, renderer::ClassicalRenderer}; +use ray_tracing_renderer::{ + depth_renderer::DepthRenderer, path_tracer::PathTracer, + path_tracer_importance::PathTracerImportance, +}; +use ray_tracing_scene::triangle_bvh::{examples::cornel, TriangleBVH}; +use rayon::prelude::*; +use std::{net::TcpStream, path::Path}; +use tev_client::{PacketCreateImage, PacketUpdateImage, TevClient, TevError}; + +fn render_image + Sync>( + renderer: C, + name: impl AsRef, + samples_per_pixel: usize, + tev: &mut TevClient, +) -> Result<(), TevError> { + let mut data = vec![0.0; (renderer.width() * renderer.height() * 3) as usize]; + + data.par_chunks_mut(3).enumerate().for_each(|(i, c)| { + let x = (i % renderer.width() as usize) as u32; + let y = (i / renderer.width() as usize) as u32; + + let mut rng = SmallRng::seed_from_u64((x + y * renderer.width()) as u64); + for _ in 0..samples_per_pixel { + let r = renderer.render_pixel(x, y, &mut rng) / (samples_per_pixel as Float); + c[0] += r.r(); + c[1] += r.g(); + c[2] += r.b(); + } + }); + + let channel_names = &["r", "g", "b"]; + + tev.send(PacketCreateImage { + image_name: name.as_ref(), + grab_focus: false, + width: renderer.width(), + height: renderer.height(), + channel_names, + })?; + + tev.send(PacketUpdateImage { + image_name: name.as_ref(), + grab_focus: false, + channel_names, + channel_offsets: &[0, 1, 2], + channel_strides: &[3, 3, 3], + x: 0, + y: 0, + width: renderer.width(), + height: renderer.height(), + data: &data, + })?; + + Ok(()) +} + +fn get_scene() -> (TriangleBVH, BasicCamera) { + let s = cornel(); + + let c = BasicCamera::new( + 400, + 400, + Pos3::new(-6.0, 0.0, 0.0), + Dir3::new(1.0, 0.0, 0.0), + Dir3::up(), + Float::to_radians(90.0), + ); + + (s, c) +} + +fn main() { + let mut client = TevClient::wrap(TcpStream::connect("127.0.0.1:14158").unwrap()); + + let (s, c) = get_scene(); + let r = DepthRenderer::new(s, c); + render_image(r, "depth renderer", 128, &mut client).unwrap(); + + let samples_per_pixel = 1024; + + let (s, c) = get_scene(); + let r = PathTracer::new(s, c); + render_image(r, "example path tracer", samples_per_pixel, &mut client).unwrap(); + + let (s, c) = get_scene(); + let r = PathTracerImportance::new(s, c); + render_image( + r, + "example path tracer importance 1024", + samples_per_pixel, + &mut client, + ) + .unwrap(); + + let (s, c) = get_scene(); + let r = PathTracerImportance::new(s, c); + render_image(r, "example path tracer importance 2048", 2048, &mut client).unwrap(); +}