Add stanford dragon example scene
This commit is contained in:
parent
ab68f307f1
commit
109a72c19a
7 changed files with 3529285 additions and 64 deletions
|
|
@ -45,7 +45,7 @@ fn render_image<
|
||||||
|
|
||||||
fn main() -> ImageResult<()> {
|
fn main() -> ImageResult<()> {
|
||||||
// let s = BasicScene::new();
|
// let s = BasicScene::new();
|
||||||
let s = basic_cornell();
|
let s = basic_cornell::scene();
|
||||||
|
|
||||||
let c = BasicCamera::from_look_at(
|
let c = BasicCamera::from_look_at(
|
||||||
400,
|
400,
|
||||||
|
|
|
||||||
3529145
ray-tracing-scene/obj/stanford_dragon.obj
Normal file
3529145
ray-tracing-scene/obj/stanford_dragon.obj
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1,69 +1,11 @@
|
||||||
use crate::{
|
use crate::triangle_bvh::{BVHMaterial, Triangle, TriangleBVH};
|
||||||
parse_obj::ObjData,
|
|
||||||
triangle_bvh::{BVHMaterial, Triangle, TriangleBVH},
|
use super::ExampleScene;
|
||||||
};
|
|
||||||
use ray_tracing_core::{light::AreaLight, prelude::*, scene::Scene};
|
use ray_tracing_core::{light::AreaLight, prelude::*, scene::Scene};
|
||||||
use ray_tracing_material::{diffuse::DiffuseMaterial, mirror::Mirror};
|
use ray_tracing_material::{diffuse::DiffuseMaterial, mirror::Mirror};
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::fmt::Debug;
|
|
||||||
|
|
||||||
pub struct ExampleScene<R: Rng> {
|
pub fn scene<R: Rng + 'static>() -> ExampleScene<R> {
|
||||||
pub scene: fn() -> Box<dyn Scene<R> + Sync>,
|
|
||||||
pub camera_pos: Pos3,
|
|
||||||
pub camera_look_at: Pos3,
|
|
||||||
pub camera_up: Dir3,
|
|
||||||
pub horizontal_fov: Float,
|
|
||||||
}
|
|
||||||
|
|
||||||
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 + '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(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn basic_cornell<R: Rng + 'static>() -> ExampleScene<R> {
|
|
||||||
let f = || {
|
let f = || {
|
||||||
let side_length = 1.5;
|
let side_length = 1.5;
|
||||||
let light_size = 0.5;
|
let light_size = 0.5;
|
||||||
51
ray-tracing-scene/src/examples/cornell2.rs
Normal file
51
ray-tracing-scene/src/examples/cornell2.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
24
ray-tracing-scene/src/examples/mod.rs
Normal file
24
ray-tracing-scene/src/examples/mod.rs
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
use ray_tracing_core::{prelude::*, scene::Scene};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
pub struct ExampleScene<R: Rng> {
|
||||||
|
pub scene: fn() -> Box<dyn Scene<R> + Sync>,
|
||||||
|
pub camera_pos: Pos3,
|
||||||
|
pub camera_look_at: Pos3,
|
||||||
|
pub camera_up: Dir3,
|
||||||
|
pub horizontal_fov: Float,
|
||||||
|
}
|
||||||
|
|
||||||
|
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::scene::<R>);
|
||||||
|
map.insert("cornel2", cornell2::scene::<R>);
|
||||||
|
map.insert("stanford_dragon", stanford_dragon::scene::<R>);
|
||||||
|
map
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod basic_cornell;
|
||||||
|
pub mod cornell2;
|
||||||
|
pub mod stanford_dragon;
|
||||||
58
ray-tracing-scene/src/examples/stanford_dragon.rs
Normal file
58
ray-tracing-scene/src/examples/stanford_dragon.rs
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
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/stanford_dragon.obj").unwrap();
|
||||||
|
|
||||||
|
let mut triangles = obj
|
||||||
|
.triangle_faces()
|
||||||
|
.map(|t| Triangle::new(t.v, 0))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let materials = vec![
|
||||||
|
BVHMaterial::new_material(DiffuseMaterial::new(Color::new(0.2, 0.2, 0.9))),
|
||||||
|
BVHMaterial::new_light(AreaLight::new(Color::white() * 100.0)),
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut vertices = obj.vertices;
|
||||||
|
for v in &mut vertices {
|
||||||
|
*v = Pos3::new(v.x(), v.z(), -v.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
let y_pos = 400.0;
|
||||||
|
let light_size = 150.0;
|
||||||
|
let offset = vertices.len() as u32;
|
||||||
|
vertices.extend_from_slice(&[
|
||||||
|
Pos3::new(light_size, y_pos, light_size),
|
||||||
|
Pos3::new(light_size, y_pos, -light_size),
|
||||||
|
Pos3::new(-light_size, y_pos, light_size),
|
||||||
|
Pos3::new(-light_size, y_pos, -light_size),
|
||||||
|
]);
|
||||||
|
|
||||||
|
triangles.extend_from_slice(&[
|
||||||
|
Triangle::new([offset, offset + 2, offset + 1], 1),
|
||||||
|
Triangle::new([offset + 3, offset + 1, offset + 2], 1),
|
||||||
|
]);
|
||||||
|
|
||||||
|
let scene = TriangleBVH::new(vertices, triangles, materials);
|
||||||
|
Box::new(scene) as Box<dyn Scene<R> + Sync>
|
||||||
|
};
|
||||||
|
|
||||||
|
ExampleScene {
|
||||||
|
scene: f,
|
||||||
|
camera_pos: Pos3::new(0.0, 0.0, -400.0),
|
||||||
|
camera_look_at: Pos3::new(0.0, 0.0, 0.0),
|
||||||
|
camera_up: Dir3::up(),
|
||||||
|
horizontal_fov: 90.0_f32.to_radians(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -216,6 +216,7 @@ fn parse_line(i: &str) -> IResult<&str, Line> {
|
||||||
"#" | "" => Ok((i, Line::Empty)),
|
"#" | "" => Ok((i, Line::Empty)),
|
||||||
"f" => parse_face(i),
|
"f" => parse_face(i),
|
||||||
"o" => Ok((i, Line::Empty)),
|
"o" => Ok((i, Line::Empty)),
|
||||||
|
"g" => Ok((i, Line::Empty)),
|
||||||
"vn" => parse_normal(i),
|
"vn" => parse_normal(i),
|
||||||
"vt" => parse_texcoord(i),
|
"vt" => parse_texcoord(i),
|
||||||
"usemtl" => parse_mtl(i),
|
"usemtl" => parse_mtl(i),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue