Add scene and renderer selection to egui
This commit is contained in:
parent
d4bf1845cb
commit
1bfef16afa
6 changed files with 200 additions and 100 deletions
|
|
@ -2,52 +2,60 @@ use crate::{
|
|||
parse_obj::ObjData,
|
||||
triangle_bvh::{BVHMaterial, Triangle, TriangleBVH},
|
||||
};
|
||||
use ray_tracing_core::{light::AreaLight, prelude::*};
|
||||
use ray_tracing_core::{light::AreaLight, prelude::*, scene::Scene};
|
||||
use ray_tracing_material::{diffuse::DiffuseMaterial, mirror::Mirror};
|
||||
use std::collections::HashMap;
|
||||
use std::fmt::Debug;
|
||||
|
||||
pub struct ExampleScene<R: Rng> {
|
||||
pub scene: TriangleBVH<R>,
|
||||
pub scene: fn() -> Box<dyn Scene<R> + Sync>,
|
||||
pub camera_pos: Pos3,
|
||||
pub camera_dir: Dir3,
|
||||
pub camera_up: Dir3,
|
||||
pub horizontal_fov: Float,
|
||||
}
|
||||
|
||||
pub fn example_scenes<R: Rng + Debug>() -> HashMap<&'static str, fn() -> ExampleScene<R>> {
|
||||
pub fn example_scenes<R: Rng + Debug + 'static>() -> HashMap<&'static str, fn() -> ExampleScene<R>>
|
||||
{
|
||||
let mut map: HashMap<&str, fn() -> ExampleScene<R>> = HashMap::new();
|
||||
map.insert("basic_cornel", basic_cornell::<R>);
|
||||
map.insert("cornel2", cornell2::<R>);
|
||||
map
|
||||
}
|
||||
|
||||
pub fn cornell2<R: Rng + Debug>() -> ExampleScene<R> {
|
||||
let obj = ObjData::new("ray-tracing-scene/obj/cornell_box.obj").unwrap();
|
||||
pub fn cornell2<R: Rng + Debug + 'static>() -> ExampleScene<R> {
|
||||
let f = || {
|
||||
let obj = ObjData::new("ray-tracing-scene/obj/cornell_box.obj").unwrap();
|
||||
|
||||
let triangles = obj
|
||||
.triangle_faces()
|
||||
.map(|t| Triangle::new(t.v, t.mat.unwrap()))
|
||||
.collect();
|
||||
let triangles = obj
|
||||
.triangle_faces()
|
||||
.map(|t| Triangle::new(t.v, t.mat.unwrap()))
|
||||
.collect();
|
||||
|
||||
let materials = obj
|
||||
.materials()
|
||||
.iter()
|
||||
.map(|m| match m.name.as_str() {
|
||||
"white" => BVHMaterial::new_material(DiffuseMaterial::new(Color::white())),
|
||||
"light" => BVHMaterial::new_light(AreaLight::new(Color::white() * 100.0)),
|
||||
"blue" => BVHMaterial::new_material(DiffuseMaterial::new(Color::new(0.0, 0.0, 1.0))),
|
||||
"red" => BVHMaterial::new_material(DiffuseMaterial::new(Color::new(1.0, 0.0, 0.0))),
|
||||
"green" => BVHMaterial::new_material(DiffuseMaterial::new(Color::new(0.0, 1.0, 0.0))),
|
||||
"mirror" => BVHMaterial::new_material(Mirror::new(Color::white())),
|
||||
_ => unreachable!(),
|
||||
})
|
||||
.collect();
|
||||
let materials = obj
|
||||
.materials()
|
||||
.iter()
|
||||
.map(|m| match m.name.as_str() {
|
||||
"white" => BVHMaterial::new_material(DiffuseMaterial::new(Color::white())),
|
||||
"light" => BVHMaterial::new_light(AreaLight::new(Color::white() * 100.0)),
|
||||
"blue" => {
|
||||
BVHMaterial::new_material(DiffuseMaterial::new(Color::new(0.0, 0.0, 1.0)))
|
||||
}
|
||||
"red" => BVHMaterial::new_material(DiffuseMaterial::new(Color::new(1.0, 0.0, 0.0))),
|
||||
"green" => {
|
||||
BVHMaterial::new_material(DiffuseMaterial::new(Color::new(0.0, 1.0, 0.0)))
|
||||
}
|
||||
"mirror" => BVHMaterial::new_material(Mirror::new(Color::white())),
|
||||
_ => unreachable!(),
|
||||
})
|
||||
.collect();
|
||||
|
||||
let scene = TriangleBVH::new(obj.vertices, triangles, materials);
|
||||
let scene = TriangleBVH::new(obj.vertices, triangles, materials);
|
||||
Box::new(scene) as Box<dyn Scene<R> + Sync>
|
||||
};
|
||||
|
||||
ExampleScene {
|
||||
scene,
|
||||
scene: f,
|
||||
camera_pos: Pos3::new(275.0, 275.0, -800.0),
|
||||
camera_dir: Dir3::new(0.0, 0.0, 1.0),
|
||||
camera_up: Dir3::up(),
|
||||
|
|
@ -55,75 +63,79 @@ pub fn cornell2<R: Rng + Debug>() -> ExampleScene<R> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn basic_cornell<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,
|
||||
},
|
||||
],
|
||||
);
|
||||
pub fn basic_cornell<R: Rng + 'static>() -> ExampleScene<R> {
|
||||
let f = || {
|
||||
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,
|
||||
},
|
||||
],
|
||||
);
|
||||
|
||||
Box::new(scene) as Box<dyn Scene<R> + Sync>
|
||||
};
|
||||
|
||||
ExampleScene {
|
||||
scene,
|
||||
scene: f,
|
||||
camera_pos: Pos3::new(-6.0, 0.0, 0.0),
|
||||
camera_dir: Dir3::new(1.0, 0.0, 0.0),
|
||||
camera_up: Dir3::up(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue