51 lines
1.8 KiB
Rust
51 lines
1.8 KiB
Rust
use rand::Rng;
|
|
use ray_tracing_core::{light::AreaLight, prelude::*, scene::Scene};
|
|
use ray_tracing_material::{diffuse::DiffuseMaterial, mirror::Mirror};
|
|
use std::fmt::Debug;
|
|
|
|
use crate::{
|
|
parse_obj::ObjData,
|
|
triangle_bvh::{BVHMaterial, Triangle, TriangleBVH},
|
|
};
|
|
|
|
use super::ExampleScene;
|
|
|
|
pub fn scene<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 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);
|
|
Box::new(scene) as Box<dyn Scene<R> + Sync>
|
|
};
|
|
|
|
ExampleScene {
|
|
scene: f,
|
|
camera_pos: Pos3::new(275.0, 275.0, -800.0),
|
|
camera_look_at: Pos3::new(275.0, 275.0, 275.0),
|
|
camera_up: Dir3::up(),
|
|
horizontal_fov: 90.0_f32.to_radians(),
|
|
}
|
|
}
|