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

@ -0,0 +1,100 @@
use ray_tracing_core::{light::AreaLight, prelude::*};
use ray_tracing_material::{diffuse::DiffuseMaterial, mirror::Mirror};
use std::collections::HashMap;
use crate::triangle_bvh::{BVHMaterial, Triangle, TriangleBVH};
pub struct ExampleScene<R: Rng> {
pub scene: TriangleBVH<R>,
pub camera_pos: Pos3,
pub camera_dir: Dir3,
pub camera_up: Dir3,
pub horizontal_fov: Float,
}
pub fn example_scenes<R: Rng>() -> HashMap<&'static str, fn() -> ExampleScene<R>> {
let mut map: HashMap<&str, fn() -> ExampleScene<R>> = HashMap::new();
map.insert("basic_cornel", basic_cornel::<R>);
// map.insert("cornel2", cornel2::<R>);
map
}
pub fn cornel2<R: Rng>() -> ExampleScene<R> {
todo!()
}
pub fn basic_cornel<R: Rng>() -> ExampleScene<R> {
let side_length = 1.5;
let light_size = 0.5;
let light_offset = 0.01;
let box_size = 0.3;
let scene = TriangleBVH::new(
vec![
Pos3::new(side_length, side_length, side_length),
Pos3::new(side_length, side_length, -side_length),
Pos3::new(side_length, -side_length, side_length),
Pos3::new(side_length, -side_length, -side_length),
Pos3::new(-side_length, side_length, side_length),
Pos3::new(-side_length, side_length, -side_length),
Pos3::new(-side_length, -side_length, side_length),
Pos3::new(-side_length, -side_length, -side_length),
Pos3::new(light_size, side_length - light_offset, light_size),
Pos3::new(light_size, side_length - light_offset, -light_size),
Pos3::new(-light_size, side_length - light_offset, light_size),
Pos3::new(-light_size, side_length - light_offset, -light_size),
Pos3::new(box_size, -side_length, 0.0),
Pos3::new(0.0, -side_length, -box_size),
Pos3::new(-box_size, -side_length, 0.0),
Pos3::new(0.0, -side_length, box_size),
Pos3::new(0.0, box_size - side_length, 0.0),
],
vec![
Triangle::new([0, 1, 2], 0),
Triangle::new([1, 3, 2], 0),
Triangle::new([0, 4, 1], 0),
Triangle::new([1, 4, 5], 0),
Triangle::new([2, 3, 6], 0),
Triangle::new([3, 7, 6], 0),
Triangle::new([0, 2, 4], 1),
Triangle::new([6, 4, 2], 1),
Triangle::new([1, 5, 3], 2),
Triangle::new([7, 3, 5], 2),
Triangle::new([8, 10, 9], 3),
Triangle::new([11, 9, 10], 3),
Triangle::new([12, 13, 16], 4),
Triangle::new([13, 14, 16], 4),
Triangle::new([14, 15, 16], 4),
Triangle::new([15, 12, 16], 4),
],
vec![
BVHMaterial {
material: Some(Box::new(DiffuseMaterial::new(Color::new(0.8, 0.8, 0.8)))),
light: None,
},
BVHMaterial {
material: Some(Box::new(DiffuseMaterial::new(Color::new(0.9, 0.0, 0.0)))),
light: None,
},
BVHMaterial {
material: Some(Box::new(DiffuseMaterial::new(Color::new(0.0, 0.9, 0.0)))),
light: None,
},
BVHMaterial {
material: None,
light: Some(Box::new(AreaLight::new(Color::white() * 30.0))),
},
BVHMaterial {
material: Some(Box::new(Mirror::new(Color::new(1.0, 1.0, 1.0)))),
light: None,
},
],
);
ExampleScene {
scene,
camera_pos: Pos3::new(-6.0, 0.0, 0.0),
camera_dir: Dir3::new(1.0, 0.0, 0.0),
camera_up: Dir3::up(),
horizontal_fov: Float::to_radians(90.0),
}
}

View file

@ -1,3 +1,4 @@
pub mod basic_scene;
pub mod examples;
pub mod parse_obj;
pub mod triangle_bvh;

View file

@ -14,9 +14,9 @@ pub struct TriangleBVH<R: Rng> {
}
#[derive(Debug)]
struct BVHMaterial<R: Rng> {
material: Option<Box<dyn Material<R>>>,
light: Option<Box<dyn Light<R>>>,
pub struct BVHMaterial<R: Rng> {
pub material: Option<Box<dyn Material<R>>>,
pub light: Option<Box<dyn Light<R>>>,
}
#[derive(Debug, Clone, Copy)]
@ -40,7 +40,7 @@ pub struct Triangle {
}
impl Triangle {
fn new(vertices: [Index; 3], material: Index) -> Self {
pub fn new(vertices: [Index; 3], material: Index) -> Self {
Triangle { vertices, material }
}
}
@ -167,7 +167,7 @@ fn build_bvh(
}
impl<R: Rng> TriangleBVH<R> {
fn new(
pub fn new(
vertices: Vec<Pos3>,
mut triangles: Vec<Triangle>,
materials: Vec<BVHMaterial<R>>,
@ -281,78 +281,3 @@ impl<R: Rng> Scene<R> for TriangleBVH<R> {
))
}
}
pub mod examples {
use super::{BVHMaterial, Triangle, TriangleBVH};
use ray_tracing_core::{light::AreaLight, prelude::*};
use ray_tracing_material::{diffuse::DiffuseMaterial, mirror::Mirror};
use std::fmt::Debug;
pub fn cornel<R: Rng + Debug>() -> TriangleBVH<R> {
let side_length = 1.5;
let light_size = 0.5;
let light_offset = 0.01;
let box_size = 0.3;
dbg!(TriangleBVH::new(
vec![
Pos3::new(side_length, side_length, side_length),
Pos3::new(side_length, side_length, -side_length),
Pos3::new(side_length, -side_length, side_length),
Pos3::new(side_length, -side_length, -side_length),
Pos3::new(-side_length, side_length, side_length),
Pos3::new(-side_length, side_length, -side_length),
Pos3::new(-side_length, -side_length, side_length),
Pos3::new(-side_length, -side_length, -side_length),
Pos3::new(light_size, side_length - light_offset, light_size),
Pos3::new(light_size, side_length - light_offset, -light_size),
Pos3::new(-light_size, side_length - light_offset, light_size),
Pos3::new(-light_size, side_length - light_offset, -light_size),
Pos3::new(box_size, -side_length, 0.0),
Pos3::new(0.0, -side_length, -box_size),
Pos3::new(-box_size, -side_length, 0.0),
Pos3::new(0.0, -side_length, box_size),
Pos3::new(0.0, box_size - side_length, 0.0),
],
vec![
Triangle::new([0, 1, 2], 0),
Triangle::new([1, 3, 2], 0),
Triangle::new([0, 4, 1], 0),
Triangle::new([1, 4, 5], 0),
Triangle::new([2, 3, 6], 0),
Triangle::new([3, 7, 6], 0),
Triangle::new([0, 2, 4], 1),
Triangle::new([6, 4, 2], 1),
Triangle::new([1, 5, 3], 2),
Triangle::new([7, 3, 5], 2),
Triangle::new([8, 10, 9], 3),
Triangle::new([11, 9, 10], 3),
Triangle::new([12, 13, 16], 4),
Triangle::new([13, 14, 16], 4),
Triangle::new([14, 15, 16], 4),
Triangle::new([15, 12, 16], 4),
],
vec![
BVHMaterial {
material: Some(Box::new(DiffuseMaterial::new(Color::new(0.8, 0.8, 0.8)))),
light: None,
},
BVHMaterial {
material: Some(Box::new(DiffuseMaterial::new(Color::new(0.9, 0.0, 0.0)))),
light: None,
},
BVHMaterial {
material: Some(Box::new(DiffuseMaterial::new(Color::new(0.0, 0.9, 0.0)))),
light: None,
},
BVHMaterial {
material: None,
light: Some(Box::new(AreaLight::new(Color::white() * 30.0))),
},
BVHMaterial {
material: Some(Box::new(Mirror::new(Color::new(1.0, 1.0, 1.0)))),
light: None,
},
],
))
}
}