ft (wip): deserialization

This commit is contained in:
2026-04-25 14:46:03 +02:00
parent ef8da70436
commit 430bdf63bc
15 changed files with 421 additions and 158 deletions

View File

@@ -3,17 +3,19 @@
mod camera;
mod objects;
mod ray;
mod scenes;
mod vec3;
use std::fs;
use std::sync::Arc;
use crate::camera::Camera;
use crate::objects::materials::dielectric::Dielectric;
use crate::objects::materials::lambertian::{Lambertian, Metal};
use crate::objects::materials::traits::Material;
use crate::objects::sphere::Sphere;
use crate::objects::traits::Hittable;
use crate::ray::Ray;
use crate::scenes::scene::Scene;
use crate::vec3::Vec3;
use dotenv::dotenv;
use log::info;
@@ -41,7 +43,7 @@ fn random_sphere_on_floor<T: Hittable>(
let r = rng.random_range(0.1..max_size);
let mut sphere = Sphere::xyz(
rng.random_range((-50.)..50.),
r,
rng.random_range(0.1..max_size),
rng.random_range((-50.)..50.),
r,
materials.choose(&mut rng).unwrap().clone(),
@@ -70,49 +72,40 @@ fn random_sphere_on_floor<T: Hittable>(
sphere
}
// FIXME: bunch of unwraps/expects in deserialization code
// TODO: implement scene serialization
fn main() {
dotenv().ok();
pretty_env_logger::init();
// setup objects
// let blue = Arc::new(Metal::rgb(0.2, 0.4, 0.8, 1., 0.1));
// let metal = Arc::new(Metal::rgb(0.7, 0.4, 0.2, 1., 0.1));
// let ground = Arc::new(Lambertian::rgb(0.8, 0.8, 0., 1.0));
// let center = Arc::new(Lambertian::rgb(0.1, 0.2, 0.5, 1.));
// let left = Arc::new(Dielectric::new(1.5));
// let bubble = Arc::new(Dielectric::new(1. / 1.5));
// let right = Arc::new(Metal::rgb(0.8, 0.6, 0.2, 1., 1.0));
// TODO: use cli arg for scenefile
let json_str = fs::read_to_string("./scenes/scene.json").expect("waddehell!");
let mut scene: Scene = serde_json::from_str(&json_str).unwrap();
scene.render();
// random spheres code; thought: make this available as cli flag?
// let mut materials: Vec<Arc<dyn Material>> = vec![Arc::new(Lambertian::rgb(0.1, 0.1, 0.2, 0.8))];
// for i in 0..15 {
// info!("Generating {}th material.", i + 1);
// materials.push(random_material());
// }
//
// let mut world = vec![Sphere::xyz(0., 0.5, -0.8, 0.1, metal.clone())];
// world.push(Sphere::xyz(0., -100.5, -1., 100., ground.clone()));
// world.push(Sphere::xyz(0., 0., -1.2, 0.5, center.clone()));
// world.push(Sphere::xyz(-1., 0., -1.0, 0.5, left.clone()));
// world.push(Sphere::xyz(-1., 0., -1.0, 0.4, bubble.clone()));
// world.push(Sphere::xyz(1., 0., -1.0, 0.5, right.clone()));
// world.push(Sphere::xyz(0., 0.7, -0.4, 0.2, blue.clone()));
let mut materials: Vec<Arc<dyn Material>> = vec![Arc::new(Lambertian::rgb(0.1, 0.2, 0.6, 1.))];
for i in 0..15 {
info!("Generating {}th material.", i + 1);
materials.push(random_material());
}
let mut world = vec![Sphere::xyz(0., -1000.5, -1., 1000., materials[0].clone())];
for i in 0..40 {
info!("Generating {}th sphere.", i + 1);
world.push(random_sphere_on_floor(
&materials,
&world,
(i + 1) as f32 / 3.,
));
}
// let mut c = Camera::new(400, 300);
let mut c = Camera::new(1920, 1080);
c.set_fov(90.);
c.set_anti_alias_rate(6);
c.set_max_depth(100);
c.set_look_from(Vec3::new(-60., 10., 1.));
c.set_look_at(Vec3::new(0., 0., 0.));
c.render(&world);
// let mut world = vec![Sphere::xyz(0., -1000.5, -1., 1000., materials[0].clone())];
// for i in 0..40 {
// info!("Generating {}th sphere.", i + 1);
// world.push(random_sphere_on_floor(
// &materials,
// &world,
// ((i + 1) as f32).ln() + (15. as f32).log(10.),
// ));
// }
//
// // let mut c = Camera::new(400, 300);
// let mut c = Camera::new(1920, 1080);
// c.set_fov(60.);
// c.set_anti_alias_rate(1);
// c.set_max_depth(10);
// c.set_look_from(Vec3::new(-60., 10., 1.));
// c.set_look_at(Vec3::new(0., 0., 0.));
// c.render(&world);
}