1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#[macro_use]
extern crate log;

mod arguments;
mod properties;

use crate::arguments::Arguments;
use crate::properties::Properties;
use centaurus_core::render::RayTracerRenderer;
use centaurus_core::Renderer;
use image::{ImageBuffer, Rgba, RgbaImage};
use std::fs::File;
use structopt::StructOpt;

fn convert(image: ImageBuffer<Rgba<f64>, Vec<f64>>) -> RgbaImage {
    RgbaImage::from_fn(image.width(), image.height(), |x, y| {
        let color = image.get_pixel(x, y);
        let r = (color[0] * 255.0) as u8;
        let g = (color[1] * 255.0) as u8;
        let b = (color[2] * 255.0) as u8;
        let a = (color[3] * 255.0) as u8;
        Rgba([r, g, b, a])
    })
}

fn main() {
    log4rs::init_file("log4rs.yml", Default::default()).unwrap();

    let arguments = Arguments::from_args();

    let scene_file = File::open(arguments.input_filename).expect("Couldn't read the input file.");
    let properties_from_file: Properties =
        serde_yaml::from_reader(scene_file).expect("Couldn't parse the YAML file.");

    let scene = properties_from_file.scene;
    let image_buffer = RayTracerRenderer::render(&scene);
    let image_buffer: RgbaImage = convert(image_buffer);
    if image::ImageRgba8(image_buffer)
        .save(&arguments.output_filename)
        .is_ok()
    {
        info!("File {:?} created.", &arguments.output_filename);
    }
}