Add more scenes

This commit is contained in:
hal8174 2024-10-04 22:06:00 +02:00
parent 7d38e87f6a
commit b11e7a7a78
8 changed files with 116 additions and 20 deletions

View file

@ -1,8 +1,11 @@
use crate::{
parse_obj::ObjData,
triangle_bvh::{BVHMaterial, Triangle, TriangleBVH},
};
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};
use std::fmt::Debug;
pub struct ExampleScene<R: Rng> {
pub scene: TriangleBVH<R>,
@ -12,18 +15,47 @@ pub struct ExampleScene<R: Rng> {
pub horizontal_fov: Float,
}
pub fn example_scenes<R: Rng>() -> HashMap<&'static str, fn() -> ExampleScene<R>> {
pub fn example_scenes<R: Rng + Debug>() -> 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.insert("basic_cornel", basic_cornell::<R>);
map.insert("cornel2", cornell2::<R>);
map
}
pub fn cornel2<R: Rng>() -> ExampleScene<R> {
todo!()
pub fn cornell2<R: Rng + Debug>() -> ExampleScene<R> {
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 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 = dbg!(TriangleBVH::new(obj.vertices, triangles, materials));
ExampleScene {
scene,
camera_pos: Pos3::new(275.0, 275.0, -800.0),
camera_dir: Dir3::new(0.0, 0.0, 1.0),
camera_up: Dir3::up(),
horizontal_fov: 90.0_f32.to_radians(),
}
}
pub fn basic_cornel<R: Rng>() -> 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;