From 4042b266aea6024b1abf3f0bc6d5a02550eeadea Mon Sep 17 00:00:00 2001 From: Matthew Gordon Date: Mon, 16 Mar 2020 19:54:08 -0400 Subject: [PATCH] Update benchmark --- Cargo.toml | 8 +++++- src/lib.rs | 77 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 51 insertions(+), 34 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e4bd088..4c3822d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,8 @@ version = "0.1.0" authors = ["Matthew Gordon "] edition = "2018" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +slow_tests = [] [dependencies] alga = "0.9" @@ -23,6 +24,11 @@ features = ["arbitrary"] [profile.dev] opt-level = 3 +[profile.bench] +opt-level = 3 +lto = true +codegen-units = 1 + [profile.release] opt-level = 3 lto = true diff --git a/src/lib.rs b/src/lib.rs index 5b9e733..e2ee0c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(test)] + pub mod camera; pub mod colour; pub mod image; @@ -12,54 +14,42 @@ pub mod util; use realtype::Real; -#[cfg(bench)] +#[cfg(test)] mod tests { extern crate test; use test::Bencher; - use super::camera::render_scene; - use super::colour::{ColourRgbF, NamedColour}; - use super::image::ImageRgbF; - use super::materials::{LambertianMaterial, PhongMaterial, ReflectiveMaterial}; - use super::mesh::load_obj; - use super::raycasting::{Intersect, Plane, Sphere}; - use super::scene::Scene; + use crate::camera::partial_render_scene; + use crate::colour::{ColourRgbF, NamedColour}; + use crate::materials::{LambertianMaterial, PhongMaterial, ReflectiveMaterial}; + use crate::mesh::load_obj; + use crate::raycasting::{BoundingVolumeHierarchy, Plane, Primitive, Sphere}; + use crate::scene::Scene; + use crate::util::Tile; use nalgebra::{Point3, Vector3}; use std::path::Path; - use std::sync::{Arc, Mutex}; + use std::sync::Arc; + #[cfg(feature = "slow_tests")] #[bench] fn simple_scene(b: &mut Bencher) { - let image_width = 3; - let image_height = 3; - - let output_image = Arc::new(Mutex::new(ImageRgbF::::new(image_width, image_height))); + let image_width = 4; + let image_height = 4; let scene = Arc::new(Scene { camera_location: Point3::new(-2.0, 1.0, -5.0), - objects: load_obj( - Path::new("/home/matthew/Downloads/bunny.obj"), - Arc::new(ReflectiveMaterial { - colour: ColourRgbF::from_named(NamedColour::Yellow), - diffuse_strength: 0.05, - reflection_strength: 0.9, - }), - ) - .unwrap() - .into_iter() - .map(|triangle| Box::new(triangle) as Box>) - .chain(vec![ - Box::new(Plane::new( + objects: vec![ + Arc::new(Plane::new( Vector3::new(0.0, 1.0, 0.0), -2.0, Arc::new(LambertianMaterial { colour: ColourRgbF::new(0.55, 0.27, 0.04), diffuse_strength: 0.1, }), - )) as Box>, - Box::new(Sphere::new( + )) as Arc>, + Arc::new(Sphere::new( Point3::new(-6.25, -0.5, 1.0), 1.0, Arc::new(LambertianMaterial { @@ -67,7 +57,7 @@ mod tests { diffuse_strength: 0.1, }), )), - Box::new(Sphere::new( + Arc::new(Sphere::new( Point3::new(-4.25, -0.5, 2.0), 1.0, Arc::new(ReflectiveMaterial { @@ -76,7 +66,7 @@ mod tests { reflection_strength: 0.99, }), )), - Box::new(Sphere::new( + Arc::new(Sphere::new( Point3::new(-5.0, 1.5, 1.0), 1.0, Arc::new(PhongMaterial { @@ -86,9 +76,30 @@ mod tests { specular_strength: 1.0, }), )), - ]) - .collect(), + Arc::new(BoundingVolumeHierarchy::build( + &load_obj( + Path::new("/home/matthew/Downloads/bunny.obj"), + Arc::new(PhongMaterial { + colour: ColourRgbF::from_named(NamedColour::Yellow), + diffuse_strength: 0.05, + smoothness: 100.0, + specular_strength: 1.0, + }), + ) + .unwrap(), + )), + ], + }); + + b.iter(move || { + let scene_ptr = Arc::clone(&scene); + let tile = Tile { + start_column: 0, + end_column: image_width, + start_row: 0, + end_row: image_height, + }; + partial_render_scene(scene_ptr, tile, image_height, image_width); }); - b.iter(|| render_scene(output_image.clone(), scene.clone())); } }