rtiow: include scene config in metadata generated in output
New spheramid scene forked from tutorial.
This commit is contained in:
parent
56743b5d77
commit
5841ab61e8
@ -9,6 +9,7 @@ use image;
|
|||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use log::info;
|
use log::info;
|
||||||
|
|
||||||
|
use crate::renderer::Scene;
|
||||||
use crate::vec3::Vec3;
|
use crate::vec3::Vec3;
|
||||||
|
|
||||||
// Main RGB image output from rendering the scene.
|
// Main RGB image output from rendering the scene.
|
||||||
@ -35,8 +36,9 @@ struct ImageMetadata {
|
|||||||
}
|
}
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
struct Data {
|
struct Data<'s> {
|
||||||
timestamp: i64,
|
timestamp: i64,
|
||||||
|
scene: &'s Scene,
|
||||||
image_metadata: Vec<ImageMetadata>,
|
image_metadata: Vec<ImageMetadata>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +115,7 @@ trait ImageSaver {
|
|||||||
Q: AsRef<Path> + Sized;
|
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 output_dir: &Path = output_dir.as_ref();
|
||||||
let debugger = DEBUGGER.lock().unwrap();
|
let debugger = DEBUGGER.lock().unwrap();
|
||||||
let now = Local::now();
|
let now = Local::now();
|
||||||
@ -202,6 +204,7 @@ pub fn write_images<P: AsRef<Path>>(output_dir: P) -> std::io::Result<()> {
|
|||||||
f,
|
f,
|
||||||
&Data {
|
&Data {
|
||||||
timestamp: now.timestamp(),
|
timestamp: now.timestamp(),
|
||||||
|
scene,
|
||||||
image_metadata,
|
image_metadata,
|
||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|||||||
@ -32,31 +32,33 @@ use crate::vec3::Vec3;
|
|||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Model {
|
pub enum Model {
|
||||||
|
BVH,
|
||||||
Bench,
|
Bench,
|
||||||
Book,
|
Book,
|
||||||
Tutorial,
|
|
||||||
BVH,
|
|
||||||
Test,
|
|
||||||
CornellBox,
|
CornellBox,
|
||||||
CornellSmoke,
|
CornellSmoke,
|
||||||
PerlinDebug,
|
|
||||||
Final,
|
Final,
|
||||||
Mandelbrot,
|
Mandelbrot,
|
||||||
|
PerlinDebug,
|
||||||
|
Spheramid,
|
||||||
|
Test,
|
||||||
|
Tutorial,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Model {
|
impl Model {
|
||||||
pub fn scene(&self, opt: &Opt) -> Scene {
|
pub fn scene(&self, opt: &Opt) -> Scene {
|
||||||
match self {
|
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::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::CornellBox => scenes::cornell_box::new(&opt),
|
||||||
Model::CornellSmoke => scenes::cornell_smoke::new(&opt),
|
Model::CornellSmoke => scenes::cornell_smoke::new(&opt),
|
||||||
Model::PerlinDebug => scenes::perlin_debug::new(&opt),
|
|
||||||
Model::Final => scenes::final_scene::new(&opt),
|
Model::Final => scenes::final_scene::new(&opt),
|
||||||
Model::Mandelbrot => scenes::mandelbrot::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 {
|
match s {
|
||||||
"bench" => Ok(Model::Bench),
|
"bench" => Ok(Model::Bench),
|
||||||
"book" => Ok(Model::Book),
|
"book" => Ok(Model::Book),
|
||||||
"tutorial" => Ok(Model::Tutorial),
|
|
||||||
"bvh" => Ok(Model::BVH),
|
"bvh" => Ok(Model::BVH),
|
||||||
"test" => Ok(Model::Test),
|
|
||||||
"cornell_box" => Ok(Model::CornellBox),
|
"cornell_box" => Ok(Model::CornellBox),
|
||||||
"cornell_smoke" => Ok(Model::CornellSmoke),
|
"cornell_smoke" => Ok(Model::CornellSmoke),
|
||||||
"perlin_debug" => Ok(Model::PerlinDebug),
|
|
||||||
"final" => Ok(Model::Final),
|
"final" => Ok(Model::Final),
|
||||||
"mandelbrot" => Ok(Model::Mandelbrot),
|
"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())),
|
_ => Err(ModelParseError(s.to_owned())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,16 +95,17 @@ impl str::FromStr for Model {
|
|||||||
impl std::string::ToString for Model {
|
impl std::string::ToString for Model {
|
||||||
fn to_string(&self) -> String {
|
fn to_string(&self) -> String {
|
||||||
match self {
|
match self {
|
||||||
|
Model::BVH => "bvh".to_string(),
|
||||||
Model::Bench => "bench".to_string(),
|
Model::Bench => "bench".to_string(),
|
||||||
Model::Book => "book".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::CornellBox => "cornell_box".to_string(),
|
||||||
Model::CornellSmoke => "cornell_smoke".to_string(),
|
Model::CornellSmoke => "cornell_smoke".to_string(),
|
||||||
Model::PerlinDebug => "perlin_debug".to_string(),
|
|
||||||
Model::Final => "final".to_string(),
|
Model::Final => "final".to_string(),
|
||||||
Model::Mandelbrot => "mandelbrot".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 {
|
pub struct Scene {
|
||||||
|
#[serde(skip)]
|
||||||
pub world: Box<dyn Hit>,
|
pub world: Box<dyn Hit>,
|
||||||
|
#[serde(skip)]
|
||||||
pub camera: Camera,
|
pub camera: Camera,
|
||||||
pub subsamples: usize,
|
pub subsamples: usize,
|
||||||
/// overrides subsamples setting.
|
/// overrides subsamples setting.
|
||||||
@ -161,6 +170,7 @@ pub struct Scene {
|
|||||||
pub width: usize,
|
pub width: usize,
|
||||||
pub height: usize,
|
pub height: usize,
|
||||||
pub global_illumination: bool,
|
pub global_illumination: bool,
|
||||||
|
#[serde(skip)]
|
||||||
pub env_map: Option<EnvMap>,
|
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(), ¤t_stat, time_diff, pixel_total)
|
progress(&Default::default(), ¤t_stat, time_diff, pixel_total)
|
||||||
);
|
);
|
||||||
|
|
||||||
output::write_images(output_dir)
|
output::write_images(&scene, output_dir)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,5 +6,6 @@ pub mod cornell_smoke;
|
|||||||
pub mod final_scene;
|
pub mod final_scene;
|
||||||
pub mod mandelbrot;
|
pub mod mandelbrot;
|
||||||
pub mod perlin_debug;
|
pub mod perlin_debug;
|
||||||
|
pub mod spheramid;
|
||||||
pub mod test;
|
pub mod test;
|
||||||
pub mod tutorial;
|
pub mod tutorial;
|
||||||
|
|||||||
88
rtiow/src/scenes/spheramid.rs
Normal file
88
rtiow/src/scenes/spheramid.rs
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -15,7 +15,7 @@ use crate::texture::Texture;
|
|||||||
use crate::vec3::Vec3;
|
use crate::vec3::Vec3;
|
||||||
|
|
||||||
pub fn new(opt: &Opt) -> Scene {
|
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 lookat = Vec3::new(0., 0., -1.);
|
||||||
let dist_to_focus = (lookfrom - lookat).length();
|
let dist_to_focus = (lookfrom - lookat).length();
|
||||||
let aperture = 0.1;
|
let aperture = 0.1;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user