aboutsummaryrefslogtreecommitdiff
path: root/src/render.rs
blob: dcda6722ae62329d93547c7bfc8004546b5c0f50 (plain)
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
45
46
47
48
49
50
51
//! Implements the main render loop
//!
//! This is not a final design
use crate::camera::film::FilmTile;
use crate::camera::Camera;
use crate::scene::Scene;

use crate::core::{Vector2f, Spectrum};
use crate::Float;

const HALF_PIXEL: Vector2f = Vector2f {x: 0.5, y: 0.5 };

pub struct RenderTask {
    pub tile: Box<FilmTile>,
    samples: u32,
}

pub struct RenderContext<'a> {
    pub scn: &'a Scene,
    pub cam: &'a Camera,
}

impl RenderTask {
    pub fn new(tile: Box<FilmTile>, samples: u32) -> Self {
        Self { tile, samples }
    }

    fn render_at(&self, ctx: &RenderContext, x: i32, y: i32) -> Spectrum {
        // Create a ray
        let (r, _) = ctx.cam.generate_ray(&Vector2f::new_xy(x as Float, y as Float));

        // Trace ray
        if let Some(_) = ctx.scn.intersect(r) {
            return Spectrum::new_rgb(0.5, 0.5, 0.0);
        }

        Spectrum::new_rgb(0.0, 0.0, 0.0)

    }

    pub fn render(&mut self, ctx: &RenderContext) {
        let b = self.tile.bounds.clone();
        for x in b.min.x .. b.max.x {
            for y in b.min.y .. b.max.y {
                let p = Vector2f::new_xy(x as Float, y as Float);

                self.tile.add_sample(&p, self.render_at(ctx, x, y))
            }
        }
    }
}