Add tev output

This commit is contained in:
hal8174 2024-10-01 22:46:05 +02:00
parent c517a836ee
commit 0a70fbd8d4
6 changed files with 148 additions and 9 deletions

View file

@ -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"] }

100
ray-tracing-tev/src/main.rs Normal file
View file

@ -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<C: ClassicalRenderer<SmallRng> + Sync>(
renderer: C,
name: impl AsRef<str>,
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<SmallRng>, 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();
}