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,42 +1,38 @@
use ray_tracing_core::{camera::Camera, prelude::*, renderer::ClassicalRenderer, scene::Scene};
use std::marker::PhantomData;
pub struct DepthRenderer<S, C, R>
pub struct DepthRenderer<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
scene: S,
camera: C,
width: u32,
height: u32,
rng: PhantomData<R>,
}
impl<S, C, R> DepthRenderer<S, C, R>
impl<R> DepthRenderer<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
pub fn new(scene: S, camera: C) -> Self {
pub fn new(width: u32, height: u32) -> Self {
Self {
scene,
camera,
rng: PhantomData {},
width,
height,
}
}
}
impl<S, C, R> ClassicalRenderer<R> for DepthRenderer<S, C, R>
impl<S, C, R> ClassicalRenderer<R, S, C> for DepthRenderer<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
fn render_pixel(&self, x: u32, y: u32, rng: &mut R) -> Color {
let r = self.camera.forward(x, y, rng);
fn render_pixel(&self, scene: &S, camera: &C, x: u32, y: u32, rng: &mut R) -> Color {
let r = camera.forward(x, y, rng);
if let Some(i) = self.scene.intersect(r, 0.0, Float::INFINITY) {
if let Some(i) = 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));
// let c = i.normal();
@ -47,10 +43,10 @@ where
}
fn width(&self) -> u32 {
self.camera.width()
self.width
}
fn height(&self) -> u32 {
self.camera.height()
self.height
}
}

View file

@ -1,47 +1,43 @@
use ray_tracing_core::{camera::Camera, prelude::*, renderer::ClassicalRenderer, scene::Scene};
use std::marker::PhantomData;
pub struct PathTracer<S, C, R>
pub struct PathTracer<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
scene: S,
camera: C,
width: u32,
height: u32,
rng: PhantomData<R>,
}
impl<S, C, R> PathTracer<S, C, R>
impl<R> PathTracer<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
pub fn new(scene: S, camera: C) -> Self {
pub fn new(width: u32, height: u32) -> Self {
Self {
scene,
camera,
width,
height,
rng: PhantomData {},
}
}
}
impl<S, C, R> ClassicalRenderer<R> for PathTracer<S, C, R>
impl<S, C, R> ClassicalRenderer<R, S, C> for PathTracer<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
fn render_pixel(&self, x: u32, y: u32, rng: &mut R) -> Color {
fn render_pixel(&self, scene: &S, camera: &C, x: u32, y: u32, rng: &mut R) -> Color {
let mut sum = Color::black();
let mut alpha = Color::white();
let mut r = self.camera.forward(x, y, rng);
let mut r = camera.forward(x, y, rng);
let mut count = 0;
while let Some(i) = self.scene.intersect(r, 0.001, Float::INFINITY) {
while let Some(i) = scene.intersect(r, 0.001, Float::INFINITY) {
let frame = i.tangent_frame();
let w_in = frame.to_frame(-r.dir());
let w_out = Dir3::sample_uniform_hemisphere(rng);
@ -67,10 +63,10 @@ where
}
fn width(&self) -> u32 {
self.camera.width()
self.width
}
fn height(&self) -> u32 {
self.camera.height()
self.height
}
}

View file

@ -1,47 +1,43 @@
use ray_tracing_core::{camera::Camera, prelude::*, renderer::ClassicalRenderer, scene::Scene};
use std::marker::PhantomData;
pub struct PathTracerImportance<S, C, R>
pub struct PathTracerImportance<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
scene: S,
camera: C,
width: u32,
height: u32,
rng: PhantomData<R>,
}
impl<S, C, R> PathTracerImportance<S, C, R>
impl<R> PathTracerImportance<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
pub fn new(scene: S, camera: C) -> Self {
pub fn new(width: u32, height: u32) -> Self {
Self {
scene,
camera,
width,
height,
rng: PhantomData {},
}
}
}
impl<S, C, R> ClassicalRenderer<R> for PathTracerImportance<S, C, R>
impl<S, C, R> ClassicalRenderer<R, S, C> for PathTracerImportance<R>
where
S: Scene<R>,
C: Camera<R>,
R: Rng,
{
fn render_pixel(&self, x: u32, y: u32, rng: &mut R) -> Color {
fn render_pixel(&self, scene: &S, camera: &C, x: u32, y: u32, rng: &mut R) -> Color {
let mut sum = Color::black();
let mut alpha = Color::white();
let mut r = self.camera.forward(x, y, rng);
let mut r = camera.forward(x, y, rng);
let mut count = 0;
while let Some(i) = self.scene.intersect(r, 0.001, Float::INFINITY) {
while let Some(i) = scene.intersect(r, 0.001, Float::INFINITY) {
let frame = i.tangent_frame();
let w_in = frame.to_frame(-r.dir());
@ -68,10 +64,10 @@ where
}
fn width(&self) -> u32 {
self.camera.width()
self.width
}
fn height(&self) -> u32 {
self.camera.height()
self.height
}
}