Fix bugs
This commit is contained in:
parent
72acde6ea8
commit
68f158f3c9
|
@ -36,16 +36,15 @@ fn render(camera: &Camera, scene: &Scene, filename: &str) -> std::io::Result<()>
|
||||||
|
|
||||||
fn main() -> std::io::Result<()> {
|
fn main() -> std::io::Result<()> {
|
||||||
|
|
||||||
let camera = Camera::new(Point3::new(0.0,0.0,3.0), Vector3::new(0.0,0.0,-1.0), 1.0, 16.0 / 9.0, 2.0, 720);
|
let camera = Camera::new(Point3::new(0.0,5.0,0.0), Vector3::new(0.0,-1.0,0.0), 1.0, 16.0 / 9.0, 2.0, 720);
|
||||||
|
|
||||||
let scene = Scene {
|
let scene = Scene {
|
||||||
objects: vec![
|
objects: vec![
|
||||||
Object::new(Sphere::new_solid(1.0, 0.2, 1.7, 0.2, Texture::new(1.0, 1.0, 1.0, 1.0))),
|
Object::new(Plane::xz(|_, _| Texture { color: Color::white(), albedo: 0.8 })),
|
||||||
Object::new(Sphere::new_solid(0.0, -1.0, 0.0, 1.0, Texture::new(1.0, 1.0, 1.0, 1.0)))
|
|
||||||
],
|
],
|
||||||
lights: vec![
|
lights: vec![
|
||||||
Box::new(PointLight::new(Point3::new(1.5, 1.0, 2.5), Color::white(), 3.0)),
|
|
||||||
Box::new(PointLight::new(Point3::new(1.0, -0.4, 1.5), Color::white(), 2.0))
|
|
||||||
],
|
],
|
||||||
background: Color::gray(0.5)
|
background: Color::gray(0.5)
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,7 +22,7 @@ impl Light for PointLight {
|
||||||
fn check_shadow(&self, point: Point3f, objects: &Vec<Object>) -> bool {
|
fn check_shadow(&self, point: Point3f, objects: &Vec<Object>) -> bool {
|
||||||
let max_d = distance(&self.pos, &point);
|
let max_d = distance(&self.pos, &point);
|
||||||
objects.iter()
|
objects.iter()
|
||||||
.filter_map(|&obj| obj.intersect(Ray::from_points(self.pos, point)))
|
.filter_map(|obj| obj.intersect(Ray::from_points(self.pos, point)))
|
||||||
.all(|d| d - max_d > -1e-3 )
|
.all(|d| d - max_d > -1e-3 )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,27 +1,26 @@
|
||||||
extern crate nalgebra as na;
|
extern crate nalgebra as na;
|
||||||
|
|
||||||
use std::f32::consts::PI;
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
use na::*;
|
use na::*;
|
||||||
use na::geometry::Point3;
|
use na::geometry::Point3;
|
||||||
|
|
||||||
use crate::types::*;
|
|
||||||
use crate::object::*;
|
use crate::object::*;
|
||||||
|
use crate::types::*;
|
||||||
|
|
||||||
fn trace(ray: Ray, objects: &Vec<Object>) -> Option<(&Object, f32)> {
|
fn trace(ray: Ray, objects: &Vec<Object>) -> Option<(&Object, f32)> {
|
||||||
objects.iter()
|
objects.iter()
|
||||||
.filter_map(|&obj| obj.intersect(ray)
|
.filter_map(|obj| obj.intersect(ray)
|
||||||
.map(|x| (obj, x)))
|
.map(|x| (obj, x)))
|
||||||
.min_by(|&a, &b| a.1.partial_cmp(&b.1).unwrap_or(Ordering::Equal))
|
.min_by(|a, b| a.1.partial_cmp(&b.1).unwrap_or(Ordering::Equal))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn light_point(objects: &Vec<Object>, obj: &Object, point: Point3f, light: &dyn Light) -> Color {
|
fn light_point(objects: &Vec<Object>, obj: &Object, point: Point3f, light: &dyn Light) -> Color {
|
||||||
if light.check_shadow(point, objects) {
|
if light.check_shadow(point, objects) {
|
||||||
|
let texture = obj.get_texture(point);
|
||||||
|
|
||||||
let texture = obj.gettexture(point);
|
light.get_color(point) * (texture.albedo / PI) * light.intensity(point) * obj.normal(point).dot(&*light.direction(point))
|
||||||
|
|
||||||
light.getcolor(point) * (texture.albedo / PI) * light.intensity(point) * obj.normal(point).dot(&*light.direction(point))
|
|
||||||
} else {
|
} else {
|
||||||
// Point is in shadow
|
// Point is in shadow
|
||||||
Color::black()
|
Color::black()
|
||||||
|
@ -31,11 +30,10 @@ fn light_point(objects: &Vec<Object>, obj: &Object, point: Point3f, light: &dyn
|
||||||
pub fn cast_ray(ray: Ray, scene: &Scene) -> Color {
|
pub fn cast_ray(ray: Ray, scene: &Scene) -> Color {
|
||||||
if let Some((obj, dist)) = trace(ray, &scene.objects) {
|
if let Some((obj, dist)) = trace(ray, &scene.objects) {
|
||||||
let point = ray.project(dist);
|
let point = ray.project(dist);
|
||||||
let surface_color = obj.gettexture(point).color;
|
let surface_color = obj.get_texture(point).color;
|
||||||
|
|
||||||
scene.lights.iter()
|
scene.lights.iter()
|
||||||
.map(|&light| light_point(&scene.objects, obj, point, &*light))
|
.map(|light| light_point(&scene.objects, obj, point, &**light))
|
||||||
.fold(Color::black(), |acc, c| acc + c) * surface_color
|
.fold(Color::black(), |acc, c| acc + c) * surface_color
|
||||||
}
|
} else { scene.background }
|
||||||
else { scene.background }
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue