bs-trace 0.3.0

Free RayTracing software
Documentation
use bs_trace::image::prelude::Colour;
use bs_trace::trace::cfg::SceneConfig;
use bs_trace::trace::material::{Lambertian, Metal};
use bs_trace::trace::prelude::*;
use bs_trace::trace::sampling::RandomSampling;
use bs_trace::trace::world::{Sphere, World};
use num_traits::ConstZero;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::sync::Arc;

const WIDTH: usize = 640;
const HEIGHT: usize = 480;

fn test_main() -> std::io::Result<()> {
    Ok(())
}

fn main() -> std::io::Result<()> {
    let args: Vec<String> = std::env::args().collect();
    if args.len() == 0 {
        return Ok(());
    } else if args.len() != 2 {
        eprintln!("Usage: {} <path to scene file>", args[0]);
        return Ok(());
    }

    let scene_file_path = &args[1];
    let scene_file_contents = std::fs::read_to_string(scene_file_path)?;
    let scene_table = scene_file_contents.parse::<toml::Table>().unwrap();
    let scene = bs_trace::trace::description::parse_scene_file(&scene_table).unwrap();

    let rng = rand::thread_rng();
    //let samp_strat = SubdivisionSampling::<WIDTH, HEIGHT, 3>::new();
    let samp_strat = RandomSampling::<WIDTH, HEIGHT, 100>::new();

    let mut camera: Camera<WIDTH, HEIGHT> = unsafe {
        Camera::new_unchecked(
            Vec3::ZERO,
            Vec3::new([1.0, 0.0, 0.0]),
            Vec3::new([0.0, 1.0, 0.0]),
            1.0,
            2.0,
        )
    };

    let cfg = SceneConfig::<WIDTH, HEIGHT>::new(camera, Arc::new(samp_strat), scene, 8);

    let img = cfg.trace();

    let mut fh = File::create("out.png")?;
    let mut buf_writer = BufWriter::new(&mut fh);
    img.write_as_png(&mut buf_writer);
    Ok(())
}