aboutsummaryrefslogtreecommitdiff
path: root/src/camera/camera.rs
blob: 102e57bc9a100171dc5e5e3ba0b62773673a9d74 (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
//! Implements ray generation
//!
//! Rays are generated by transforming between different spaces summed below.
//!
//! - *World space*: Where objects are located in the scene, this will be 3d coordinates
//! - *Camera space*: Originated at the origin of the camera, with z mapped to the viewing
//! direction
//!
//! Camera space will be represented in different ways:
//! - *Screen space*: Everything in the screen space is projected onto the film, when z=0 this will
//! correspond 
//! - *Normalized Device Coordinates(NDC) space*: Is defined as (0, 0, 0) as the upper-left corner of
//! the film, and (1, 1, 0) to be the bottom right corner.
//! - *Raster space*: Same as NDC space but, (1, 1, 0) is mapped to (width, height, 0)
//!
//! More in depth description is in pbr-book chapter 6
use crate::Float;
use crate::core::{Transform, Ray, Vector2i, Bound2f};

/// General implementation for all projective based cameras
struct ProjectiveCamera {
    cam2wor: Transform,
    cam2scr: Transform,
}

impl ProjectiveCamera {
    fn new(cam2wor: Transform, cam2scr: Transform, resolution: &Vector2i, screenwindow: &Bound2f) -> Self {
        let screensize = screenwindow.diagonal();
        // Calculate the conversion from screen space to raster space
        let scr2ras = Transform::new_scale(resolution.x as Float, resolution.y as Float, 1.0) *
            Transform::new_scale(1.0 / (screensize.x), 1.0 / (screensize.y), 1.0) *
            Transform::new_translate(-screenwindow.min.x, -screenwindow.min.y, 0.0);
        let ras2scr = 

        Self {
            cam2wor,
            cam2scr,
        }
    }
}