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() -> ExampleScene { 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 + 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(), } }