78 lines
2.1 KiB
Rust
78 lines
2.1 KiB
Rust
use rand;
|
|
use rand::Rng;
|
|
|
|
use crate::bvh::BVH;
|
|
use crate::camera::Camera;
|
|
use crate::hitable::Hit;
|
|
use crate::hitable_list::HitableList;
|
|
use crate::kdtree::KDTree;
|
|
use crate::material::Lambertian;
|
|
use crate::renderer::Opt;
|
|
use crate::renderer::Scene;
|
|
use crate::sphere::Sphere;
|
|
use crate::texture::ConstantTexture;
|
|
use crate::vec3::Vec3;
|
|
|
|
pub fn new(opt: &Opt) -> Scene {
|
|
let lookfrom = Vec3::new(20., 20., 20.);
|
|
let lookat = Vec3::new(0., 0., 0.);
|
|
let dist_to_focus = (lookfrom - lookat).length();
|
|
let aperture = 0.1;
|
|
let time_min = 0.;
|
|
let time_max = 1.;
|
|
let camera = Camera::new(
|
|
lookfrom,
|
|
lookat,
|
|
Vec3::new(0., 1., 0.),
|
|
70.,
|
|
opt.width as f32 / opt.height as f32,
|
|
aperture,
|
|
dist_to_focus,
|
|
time_min,
|
|
time_max,
|
|
);
|
|
let mut rng = rand::thread_rng();
|
|
let mut grid: Vec<Box<Hit>> = Vec::new();
|
|
let len = 1000;
|
|
for x in 0..len {
|
|
for z in 0..len {
|
|
let r = rng.gen_range::<f32>(0., 1.);
|
|
let g = rng.gen_range::<f32>(0., 1.);
|
|
let b = rng.gen_range::<f32>(0., 1.);
|
|
|
|
let x_pos = (x - len / 2) as f32 + rng.gen_range(-0.1, 0.1);
|
|
let z_pos = (z - len / 2) as f32 + rng.gen_range(-0.1, 0.1);
|
|
|
|
grid.push(Box::new(Sphere::new(
|
|
Vec3::new(x_pos, 0., z_pos),
|
|
0.5,
|
|
Lambertian::new(ConstantTexture::new(Vec3::new(r, g, b))),
|
|
)));
|
|
}
|
|
}
|
|
let world: Box<Hit>;
|
|
if opt.use_accel {
|
|
let use_kd = true;
|
|
if use_kd {
|
|
let kdtree = KDTree::new(grid, time_min, time_max);
|
|
trace!("k-d tree world {}", kdtree);
|
|
world = Box::new(kdtree);
|
|
} else {
|
|
let bvh = BVH::new(grid, time_min, time_max);
|
|
trace!("BVH world {}", bvh);
|
|
world = Box::new(bvh);
|
|
}
|
|
} else {
|
|
world = Box::new(HitableList::new(grid));
|
|
}
|
|
Scene {
|
|
camera,
|
|
world,
|
|
subsamples: opt.subsamples,
|
|
width: opt.width,
|
|
height: opt.height,
|
|
global_illumination: true,
|
|
env_map: None,
|
|
}
|
|
}
|