Stub cube impl.
This commit is contained in:
parent
896ae20196
commit
ca4a385438
@ -12,6 +12,7 @@ use rand::Rng;
|
|||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
|
||||||
use rtiow::camera::Camera;
|
use rtiow::camera::Camera;
|
||||||
|
use rtiow::cube::Cube;
|
||||||
use rtiow::hitable::Hit;
|
use rtiow::hitable::Hit;
|
||||||
use rtiow::hitable_list::HitableList;
|
use rtiow::hitable_list::HitableList;
|
||||||
use rtiow::material::Dielectric;
|
use rtiow::material::Dielectric;
|
||||||
@ -172,10 +173,51 @@ fn build_scene_tutorial(opt: &Opt) -> Scene {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn build_scene_cube(opt: &Opt) -> Scene {
|
||||||
|
let lookfrom = Vec3::new(3., 3., 2.);
|
||||||
|
let lookat = Vec3::new(0., 0., 0.);
|
||||||
|
let dist_to_focus = (lookfrom - lookat).length();
|
||||||
|
let aperture = 0.1;
|
||||||
|
let camera = Camera::new(
|
||||||
|
lookfrom,
|
||||||
|
lookat,
|
||||||
|
Vec3::new(0., 1., 0.),
|
||||||
|
45.,
|
||||||
|
opt.width as f32 / opt.height as f32,
|
||||||
|
aperture,
|
||||||
|
dist_to_focus,
|
||||||
|
);
|
||||||
|
let world = HitableList::new(vec![
|
||||||
|
Box::new(Sphere::new(
|
||||||
|
Vec3::new(0., 0., -1.),
|
||||||
|
0.5,
|
||||||
|
Box::new(Lambertian::new(Vec3::new(0.1, 0.2, 0.5))),
|
||||||
|
)),
|
||||||
|
Box::new(Cube::new(
|
||||||
|
Vec3::new(0., 0., 0.),
|
||||||
|
0.5,
|
||||||
|
Box::new(Lambertian::new(Vec3::new(0.5, 0.2, 0.1))),
|
||||||
|
)),
|
||||||
|
Box::new(Sphere::new(
|
||||||
|
Vec3::new(0., -100.5, -1.),
|
||||||
|
100.,
|
||||||
|
Box::new(Lambertian::new(Vec3::new(0.8, 0.8, 0.8))),
|
||||||
|
)),
|
||||||
|
]);
|
||||||
|
Scene {
|
||||||
|
camera,
|
||||||
|
world,
|
||||||
|
subsamples: opt.subsamples,
|
||||||
|
width: opt.width,
|
||||||
|
height: opt.height,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Model {
|
pub enum Model {
|
||||||
Book,
|
Book,
|
||||||
Tutorial,
|
Tutorial,
|
||||||
|
Cube,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -193,6 +235,7 @@ impl str::FromStr for Model {
|
|||||||
match s {
|
match s {
|
||||||
"book" => Ok(Model::Book),
|
"book" => Ok(Model::Book),
|
||||||
"tutorial" => Ok(Model::Tutorial),
|
"tutorial" => Ok(Model::Tutorial),
|
||||||
|
"cube" => Ok(Model::Cube),
|
||||||
_ => Err(ModelParseError(s.to_owned())),
|
_ => Err(ModelParseError(s.to_owned())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -223,6 +266,7 @@ fn main() -> Result<(), std::io::Error> {
|
|||||||
let opt = Opt::from_args();
|
let opt = Opt::from_args();
|
||||||
let scene = match opt.model {
|
let scene = match opt.model {
|
||||||
Model::Book => build_scene_book(&opt),
|
Model::Book => build_scene_book(&opt),
|
||||||
|
Model::Cube => build_scene_cube(&opt),
|
||||||
Model::Tutorial => build_scene_tutorial(&opt),
|
Model::Tutorial => build_scene_tutorial(&opt),
|
||||||
};
|
};
|
||||||
let res = render(scene, &opt.output);
|
let res = render(scene, &opt.output);
|
||||||
|
|||||||
55
rtiow/src/cube.rs
Normal file
55
rtiow/src/cube.rs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
use hitable::Hit;
|
||||||
|
use hitable::HitRecord;
|
||||||
|
use material::Material;
|
||||||
|
use ray::Ray;
|
||||||
|
use vec3::dot;
|
||||||
|
use vec3::Vec3;
|
||||||
|
|
||||||
|
pub struct Cube {
|
||||||
|
center: Vec3,
|
||||||
|
length: f32,
|
||||||
|
material: Box<Material>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Cube {
|
||||||
|
pub fn new(center: Vec3, length: f32, material: Box<Material>) -> Cube {
|
||||||
|
Cube {
|
||||||
|
center,
|
||||||
|
length,
|
||||||
|
material,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Hit for Cube {
|
||||||
|
fn hit(&self, r: Ray, t_min: f32, t_max: f32) -> Option<HitRecord> {
|
||||||
|
let oc = r.origin() - self.center;
|
||||||
|
let a = dot(r.direction(), r.direction());
|
||||||
|
let b = dot(oc, r.direction());
|
||||||
|
let c = dot(oc, oc) - self.length * self.length;
|
||||||
|
let discriminant = b * b - a * c;
|
||||||
|
if discriminant > 0. {
|
||||||
|
let temp = (-b - (b * b - a * c).sqrt()) / a;
|
||||||
|
if temp < t_max && temp > t_min {
|
||||||
|
let point = r.point_at_parameter(temp);
|
||||||
|
return Some(HitRecord {
|
||||||
|
t: temp,
|
||||||
|
p: point,
|
||||||
|
normal: (point - self.center) / self.length,
|
||||||
|
material: &*self.material,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let temp = (-b + (b * b - a * c).sqrt()) / a;
|
||||||
|
if temp < t_max && temp > t_min {
|
||||||
|
let point = r.point_at_parameter(temp);
|
||||||
|
return Some(HitRecord {
|
||||||
|
t: temp,
|
||||||
|
p: point,
|
||||||
|
normal: (point - self.center) / self.length,
|
||||||
|
material: &*self.material,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
pub mod camera;
|
pub mod camera;
|
||||||
|
pub mod cube;
|
||||||
pub mod hitable;
|
pub mod hitable;
|
||||||
pub mod hitable_list;
|
pub mod hitable_list;
|
||||||
pub mod material;
|
pub mod material;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user