Add tracing
This commit is contained in:
parent
00000480be
commit
0000049059
5 changed files with 141 additions and 26 deletions
89
assignment-1b/Cargo.lock
generated
89
assignment-1b/Cargo.lock
generated
|
@ -31,6 +31,7 @@ dependencies = [
|
||||||
"rand",
|
"rand",
|
||||||
"rayon",
|
"rayon",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -235,6 +236,12 @@ dependencies = [
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.139"
|
version = "0.2.139"
|
||||||
|
@ -247,6 +254,15 @@ version = "0.1.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
|
checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "log"
|
||||||
|
version = "0.4.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "matrixmultiply"
|
name = "matrixmultiply"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
|
@ -292,6 +308,16 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nu-ansi-term"
|
||||||
|
version = "0.46.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
|
||||||
|
dependencies = [
|
||||||
|
"overload",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num"
|
name = "num"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
|
@ -402,6 +428,12 @@ version = "6.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
|
checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "overload"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "paste"
|
name = "paste"
|
||||||
version = "1.0.11"
|
version = "1.0.11"
|
||||||
|
@ -555,6 +587,15 @@ version = "1.0.152"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
|
checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sharded-slab"
|
||||||
|
version = "0.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simba"
|
name = "simba"
|
||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
|
@ -568,6 +609,12 @@ dependencies = [
|
||||||
"wide",
|
"wide",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "smallvec"
|
||||||
|
version = "1.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
|
@ -594,6 +641,16 @@ dependencies = [
|
||||||
"winapi-util",
|
"winapi-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thread_local"
|
||||||
|
version = "1.1.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"once_cell",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing"
|
name = "tracing"
|
||||||
version = "0.1.37"
|
version = "0.1.37"
|
||||||
|
@ -624,6 +681,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
|
checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
"valuable",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tracing-log"
|
||||||
|
version = "0.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
|
"log",
|
||||||
|
"tracing-core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tracing-subscriber"
|
||||||
|
version = "0.3.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
|
||||||
|
dependencies = [
|
||||||
|
"nu-ansi-term",
|
||||||
|
"sharded-slab",
|
||||||
|
"smallvec",
|
||||||
|
"thread_local",
|
||||||
|
"tracing-core",
|
||||||
|
"tracing-log",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -638,6 +721,12 @@ version = "1.0.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
|
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "valuable"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "version_check"
|
name = "version_check"
|
||||||
version = "0.9.4"
|
version = "0.9.4"
|
||||||
|
|
|
@ -29,3 +29,4 @@ ordered-float = "3.4.0"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
rayon = "1.6.1"
|
rayon = "1.6.1"
|
||||||
tracing = "0.1.37"
|
tracing = "0.1.37"
|
||||||
|
tracing-subscriber = "0.3.16"
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
|
#[macro_use]
|
||||||
|
extern crate tracing;
|
||||||
|
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use anyhow::{Result};
|
use anyhow::Result;
|
||||||
use assignment_1b::image::Image;
|
use assignment_1b::image::Image;
|
||||||
use assignment_1b::ray::Ray;
|
use assignment_1b::ray::Ray;
|
||||||
use assignment_1b::scene::Scene;
|
use assignment_1b::scene::Scene;
|
||||||
|
@ -10,7 +13,7 @@ use clap::Parser;
|
||||||
|
|
||||||
use rayon::prelude::{IntoParallelIterator, ParallelIterator};
|
use rayon::prelude::{IntoParallelIterator, ParallelIterator};
|
||||||
|
|
||||||
/// Simple raycaster.
|
/// Simple raytracer with Blinn-Phong illumination and shadowing.
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[clap(author, version, about, long_about = None)]
|
#[clap(author, version, about, long_about = None)]
|
||||||
struct Opt {
|
struct Opt {
|
||||||
|
@ -34,6 +37,15 @@ struct Opt {
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
let opt = Opt::parse();
|
let opt = Opt::parse();
|
||||||
|
|
||||||
|
// Set up logging
|
||||||
|
tracing_subscriber::fmt()
|
||||||
|
.with_target(false)
|
||||||
|
.with_timer(tracing_subscriber::fmt::time::uptime())
|
||||||
|
.with_level(true)
|
||||||
|
.init();
|
||||||
|
|
||||||
|
// Rename the output file if it's not provided
|
||||||
let out_file = opt
|
let out_file = opt
|
||||||
.output_path
|
.output_path
|
||||||
.unwrap_or_else(|| opt.input_path.with_extension("ppm"));
|
.unwrap_or_else(|| opt.input_path.with_extension("ppm"));
|
||||||
|
@ -41,33 +53,13 @@ fn main() -> Result<()> {
|
||||||
let mut scene = Scene::from_input_file(&opt.input_path)?;
|
let mut scene = Scene::from_input_file(&opt.input_path)?;
|
||||||
let distance = opt.distance;
|
let distance = opt.distance;
|
||||||
|
|
||||||
|
// Force-override parallel projection
|
||||||
if opt.force_parallel {
|
if opt.force_parallel {
|
||||||
scene.parallel_projection = true;
|
scene.parallel_projection = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the viewing window
|
|
||||||
let view_window = scene.compute_viewing_window(distance);
|
|
||||||
|
|
||||||
// Translate image pixels to real-world 3d coords
|
// Translate image pixels to real-world 3d coords
|
||||||
let translate_pixel = {
|
let translate_pixel = scene.pixel_translation_function(distance);
|
||||||
let dx = view_window.upper_right - view_window.upper_left;
|
|
||||||
let pixel_base_x = dx / scene.image_width as f64;
|
|
||||||
|
|
||||||
let dy = view_window.lower_left - view_window.upper_left;
|
|
||||||
let pixel_base_y = dy / scene.image_height as f64;
|
|
||||||
|
|
||||||
move |px: usize, py: usize| {
|
|
||||||
let x_component = pixel_base_x * px as f64;
|
|
||||||
let y_component = pixel_base_y * py as f64;
|
|
||||||
|
|
||||||
// Without adding this, we would be getting the top-left of the pixel's
|
|
||||||
// rectangle. We want the center, so add half of the pixel size as
|
|
||||||
// well.
|
|
||||||
let center_offset = (pixel_base_x + pixel_base_y) / 2.0;
|
|
||||||
|
|
||||||
view_window.upper_left + x_component + y_component + center_offset
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Generate a parallel iterator for pixels
|
// Generate a parallel iterator for pixels
|
||||||
// The iterator preserves order and uses row-major order
|
// The iterator preserves order and uses row-major order
|
||||||
|
@ -106,7 +98,10 @@ fn main() -> Result<()> {
|
||||||
Some(Ok((i, t, object)))
|
Some(Ok((i, t, object)))
|
||||||
}
|
}
|
||||||
Ok(None) => None,
|
Ok(None) => None,
|
||||||
Err(e) => Some(Err(e)),
|
Err(err) => {
|
||||||
|
error!("Error: {err}");
|
||||||
|
Some(Err(err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>>>()?;
|
.collect::<Result<Vec<_>>>()?;
|
||||||
|
|
|
@ -194,4 +194,32 @@ impl Scene {
|
||||||
|
|
||||||
view_window
|
view_window
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a pixel translation function based on the viewing window of the
|
||||||
|
/// current scene
|
||||||
|
pub fn pixel_translation_function(
|
||||||
|
&self,
|
||||||
|
distance: f64,
|
||||||
|
) -> impl Fn(usize, usize) -> Vector3<f64> {
|
||||||
|
let view_window = self.compute_viewing_window(distance);
|
||||||
|
|
||||||
|
let dx = view_window.upper_right - view_window.upper_left;
|
||||||
|
let pixel_base_x = dx / self.image_width as f64;
|
||||||
|
|
||||||
|
let dy = view_window.lower_left - view_window.upper_left;
|
||||||
|
let pixel_base_y = dy / self.image_height as f64;
|
||||||
|
|
||||||
|
// The final function to be returned
|
||||||
|
move |px: usize, py: usize| {
|
||||||
|
let x_component = pixel_base_x * px as f64;
|
||||||
|
let y_component = pixel_base_y * py as f64;
|
||||||
|
|
||||||
|
// Without adding this, we would be getting the top-left of the pixel's
|
||||||
|
// rectangle. We want the center, so add half of the pixel size as
|
||||||
|
// well.
|
||||||
|
let center_offset = (pixel_base_x + pixel_base_y) / 2.0;
|
||||||
|
|
||||||
|
view_window.upper_left + x_component + y_component + center_offset
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ use nalgebra::Vector3;
|
||||||
|
|
||||||
use crate::scene::{
|
use crate::scene::{
|
||||||
cylinder::Cylinder,
|
cylinder::Cylinder,
|
||||||
data::{Light, LightKind, Material, Object, Attenuation},
|
data::{Attenuation, Light, LightKind, Material, Object},
|
||||||
sphere::Sphere,
|
sphere::Sphere,
|
||||||
Scene,
|
Scene,
|
||||||
};
|
};
|
||||||
|
@ -15,6 +15,8 @@ use super::data::{DepthCueing, ObjectKind};
|
||||||
impl Scene {
|
impl Scene {
|
||||||
/// Parse the input file into a scene
|
/// Parse the input file into a scene
|
||||||
pub fn from_input_file(path: impl AsRef<Path>) -> Result<Self> {
|
pub fn from_input_file(path: impl AsRef<Path>) -> Result<Self> {
|
||||||
|
// Scope the read so the file is dropped and closed immediately after the
|
||||||
|
// contents have been read to memory
|
||||||
let contents = {
|
let contents = {
|
||||||
let mut contents = String::new();
|
let mut contents = String::new();
|
||||||
let mut file = File::open(path.as_ref())?;
|
let mut file = File::open(path.as_ref())?;
|
||||||
|
|
Loading…
Reference in a new issue