Refactor Renderer trait

This commit is contained in:
hal8174 2024-10-04 18:12:00 +02:00
parent 7d122d44b3
commit 7d38e87f6a
9 changed files with 228 additions and 172 deletions

View file

@ -1,17 +1,28 @@
use rand::{rngs::SmallRng, SeedableRng};
use ray_tracing_core::{camera::BasicCamera, prelude::*, renderer::ClassicalRenderer};
use ray_tracing_core::{
camera::{BasicCamera, Camera},
prelude::*,
renderer::ClassicalRenderer,
scene::Scene,
};
use ray_tracing_renderer::{
depth_renderer::DepthRenderer, path_tracer::PathTracer,
path_tracer_importance::PathTracerImportance,
};
use ray_tracing_scene::triangle_bvh::{examples::cornel, TriangleBVH};
use ray_tracing_scene::{examples::basic_cornel, triangle_bvh::TriangleBVH};
use rayon::prelude::*;
use std::{net::TcpStream, path::Path};
use std::net::TcpStream;
use tev_client::{PacketCreateImage, PacketUpdateImage, TevClient, TevError};
fn render_image<C: ClassicalRenderer<SmallRng> + Sync>(
renderer: C,
fn render_image<
R: ClassicalRenderer<SmallRng, S, C> + Sync,
S: Scene<SmallRng> + Sync,
C: Camera<SmallRng> + Sync,
>(
name: impl AsRef<str>,
renderer: &R,
scene: &S,
camera: &C,
samples_per_pixel: usize,
tev: &mut TevClient,
) -> Result<(), TevError> {
@ -23,7 +34,8 @@ fn render_image<C: ClassicalRenderer<SmallRng> + Sync>(
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);
let r =
renderer.render_pixel(scene, camera, x, y, &mut rng) / (samples_per_pixel as Float);
c[0] += r.r();
c[1] += r.g();
c[2] += r.b();
@ -57,44 +69,62 @@ fn render_image<C: ClassicalRenderer<SmallRng> + Sync>(
}
fn get_scene() -> (TriangleBVH<SmallRng>, BasicCamera) {
let s = cornel();
let s = basic_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.camera_pos,
s.camera_dir,
s.camera_up,
s.horizontal_fov,
);
(s, c)
(s.scene, 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 width = 400;
let height = 400;
let r = DepthRenderer::new(width, height);
render_image("depth renderer", &r, &s, &c, 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);
let r = PathTracer::new(width, height);
render_image(
r,
"example path tracer importance 1024",
"example path tracer",
&r,
&s,
&c,
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();
let r = PathTracerImportance::new(width, height);
render_image(
"example path tracer importance 1024",
&r,
&s,
&c,
samples_per_pixel,
&mut client,
)
.unwrap();
let r = PathTracerImportance::new(width, height);
render_image(
"example path tracer importance 2048",
&r,
&s,
&c,
2048,
&mut client,
)
.unwrap();
}