rtiow: include scene config in metadata generated in output

New spheramid scene forked from tutorial.
This commit is contained in:
Bill Thiede 2019-10-26 16:10:29 -07:00
parent 56743b5d77
commit 5841ab61e8
5 changed files with 122 additions and 20 deletions

View File

@ -9,6 +9,7 @@ use image;
use lazy_static::lazy_static;
use log::info;
use crate::renderer::Scene;
use crate::vec3::Vec3;
// Main RGB image output from rendering the scene.
@ -35,8 +36,9 @@ struct ImageMetadata {
}
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct Data {
struct Data<'s> {
timestamp: i64,
scene: &'s Scene,
image_metadata: Vec<ImageMetadata>,
}
@ -113,7 +115,7 @@ trait ImageSaver {
Q: AsRef<Path> + Sized;
}
pub fn write_images<P: AsRef<Path>>(output_dir: P) -> std::io::Result<()> {
pub fn write_images<P: AsRef<Path>>(scene: &Scene, output_dir: P) -> std::io::Result<()> {
let output_dir: &Path = output_dir.as_ref();
let debugger = DEBUGGER.lock().unwrap();
let now = Local::now();
@ -202,6 +204,7 @@ pub fn write_images<P: AsRef<Path>>(output_dir: P) -> std::io::Result<()> {
f,
&Data {
timestamp: now.timestamp(),
scene,
image_metadata,
},
)?;

View File

@ -32,31 +32,33 @@ use crate::vec3::Vec3;
#[derive(Debug)]
pub enum Model {
BVH,
Bench,
Book,
Tutorial,
BVH,
Test,
CornellBox,
CornellSmoke,
PerlinDebug,
Final,
Mandelbrot,
PerlinDebug,
Spheramid,
Test,
Tutorial,
}
impl Model {
pub fn scene(&self, opt: &Opt) -> Scene {
match self {
Model::Book => scenes::book::new(&opt),
Model::Bench => scenes::bench::new(&opt),
Model::Tutorial => scenes::tutorial::new(&opt),
Model::BVH => scenes::bvh::new(&opt),
Model::Test => scenes::test::new(&opt),
Model::Bench => scenes::bench::new(&opt),
Model::Book => scenes::book::new(&opt),
Model::CornellBox => scenes::cornell_box::new(&opt),
Model::CornellSmoke => scenes::cornell_smoke::new(&opt),
Model::PerlinDebug => scenes::perlin_debug::new(&opt),
Model::Final => scenes::final_scene::new(&opt),
Model::Mandelbrot => scenes::mandelbrot::new(&opt),
Model::PerlinDebug => scenes::perlin_debug::new(&opt),
Model::Spheramid => scenes::spheramid::new(&opt),
Model::Test => scenes::test::new(&opt),
Model::Tutorial => scenes::tutorial::new(&opt),
}
}
}
@ -76,14 +78,15 @@ impl str::FromStr for Model {
match s {
"bench" => Ok(Model::Bench),
"book" => Ok(Model::Book),
"tutorial" => Ok(Model::Tutorial),
"bvh" => Ok(Model::BVH),
"test" => Ok(Model::Test),
"cornell_box" => Ok(Model::CornellBox),
"cornell_smoke" => Ok(Model::CornellSmoke),
"perlin_debug" => Ok(Model::PerlinDebug),
"final" => Ok(Model::Final),
"mandelbrot" => Ok(Model::Mandelbrot),
"perlin_debug" => Ok(Model::PerlinDebug),
"spheramid" => Ok(Model::Spheramid),
"test" => Ok(Model::Test),
"tutorial" => Ok(Model::Tutorial),
_ => Err(ModelParseError(s.to_owned())),
}
}
@ -92,16 +95,17 @@ impl str::FromStr for Model {
impl std::string::ToString for Model {
fn to_string(&self) -> String {
match self {
Model::BVH => "bvh".to_string(),
Model::Bench => "bench".to_string(),
Model::Book => "book".to_string(),
Model::Tutorial => "tutorial".to_string(),
Model::BVH => "bvh".to_string(),
Model::Test => "test".to_string(),
Model::CornellBox => "cornell_box".to_string(),
Model::CornellSmoke => "cornell_smoke".to_string(),
Model::PerlinDebug => "perlin_debug".to_string(),
Model::Final => "final".to_string(),
Model::Mandelbrot => "mandelbrot".to_string(),
Model::PerlinDebug => "perlin_debug".to_string(),
Model::Spheramid => "spheramid".to_string(),
Model::Test => "test".to_string(),
Model::Tutorial => "tutorial".to_string(),
}
}
}
@ -151,8 +155,13 @@ pub fn opt_hash(opt: &Opt) -> String {
)
}
// TODO(wathiede): implement the skips and then the renderer could use json as an input file type.
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Scene {
#[serde(skip)]
pub world: Box<dyn Hit>,
#[serde(skip)]
pub camera: Camera,
pub subsamples: usize,
/// overrides subsamples setting.
@ -161,6 +170,7 @@ pub struct Scene {
pub width: usize,
pub height: usize,
pub global_illumination: bool,
#[serde(skip)]
pub env_map: Option<EnvMap>,
}
@ -631,5 +641,5 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
progress(&Default::default(), &current_stat, time_diff, pixel_total)
);
output::write_images(output_dir)
output::write_images(&scene, output_dir)
}

View File

@ -6,5 +6,6 @@ pub mod cornell_smoke;
pub mod final_scene;
pub mod mandelbrot;
pub mod perlin_debug;
pub mod spheramid;
pub mod test;
pub mod tutorial;

View File

@ -0,0 +1,88 @@
use crate::camera::Camera;
use crate::hitable::Hit;
use crate::hitable_list::HitableList;
use crate::kdtree::KDTree;
use crate::material::Dielectric;
use crate::material::Lambertian;
use crate::material::Metal;
use crate::moving_sphere::MovingSphere;
use crate::renderer::Opt;
use crate::renderer::Scene;
use crate::sphere::Sphere;
use crate::texture::CheckerTexture;
use crate::texture::ConstantTexture;
use crate::texture::Texture;
use crate::vec3::Vec3;
pub fn new(opt: &Opt) -> Scene {
let lookfrom = Vec3::new(3., 4., 2.);
let lookat = Vec3::new(0., 0., -1.);
let dist_to_focus = (lookfrom - lookat).length();
let aperture = 0.1;
let time_min = 0.;
let time_max = 0.;
let camera = Camera::new(
lookfrom,
lookat,
Vec3::new(0., 1., 0.),
45.,
opt.width as f32 / opt.height as f32,
aperture,
dist_to_focus,
time_min,
time_max,
);
let ground_color: Box<dyn Texture> = if opt.use_accel {
Box::new(CheckerTexture::new(
ConstantTexture::new([0., 0., 0.]),
ConstantTexture::new([1.0, 0.4, 0.4]),
))
} else {
Box::new(ConstantTexture::new(Vec3::new(0.4, 1.0, 0.4)))
};
let objects: Vec<Box<dyn Hit>> = vec![
//let world: Box<Hit> = Box::new(HitableList::new(vec![
Box::new(Sphere::new([1., 0.5, 1.], 0.5, Dielectric::new(1.5))),
Box::new(Sphere::new(
Vec3::new(0., 0., -1.),
0.5,
Lambertian::new(ConstantTexture::new(Vec3::new(0.1, 0.2, 0.5))),
)),
Box::new(Sphere::new(
Vec3::new(0., -1000.5, -1.),
1000.,
Lambertian::new(ground_color),
)),
Box::new(Sphere::new(
Vec3::new(1., 0., -1.),
0.5,
Metal::new(Vec3::new(0.8, 0.6, 0.2), 0.2),
)),
Box::new(MovingSphere::new(
Vec3::new(-1., 0., -1.25),
Vec3::new(-1., 0., -0.75),
0.5,
0.,
1.,
Lambertian::new(ConstantTexture::new(Vec3::new(0.2, 0.8, 0.2))),
)),
];
let world: Box<dyn Hit> = if opt.use_accel {
Box::new(KDTree::new(objects, time_min, time_max))
} else {
Box::new(HitableList::new(objects))
};
Scene {
camera,
world,
subsamples: opt.subsamples,
adaptive_subsampling: None,
// adaptive_subsampling: Some(0.5),
num_threads: opt.num_threads,
width: opt.width,
height: opt.height,
global_illumination: true,
..Default::default()
}
}

View File

@ -15,7 +15,7 @@ use crate::texture::Texture;
use crate::vec3::Vec3;
pub fn new(opt: &Opt) -> Scene {
let lookfrom = Vec3::new(3., 2., 2.);
let lookfrom = Vec3::new(3., 4., 2.);
let lookat = Vec3::new(0., 0., -1.);
let dist_to_focus = (lookfrom - lookat).length();
let aperture = 0.1;