pbrt_r3/core/camera/
projective.rs

1use super::base_camera::BaseCamera;
2use crate::core::base::*;
3use crate::core::film::Film;
4use crate::core::geometry::*;
5use crate::core::medium::*;
6use crate::core::transform::*;
7
8use std::sync::Arc;
9use std::sync::RwLock;
10
11#[derive(Clone)]
12pub struct ProjectiveCamera {
13    pub base: BaseCamera,
14    pub camera_to_screen: Transform,
15    pub raster_to_camera: Transform,
16    pub screen_to_raster: Transform,
17    pub raster_to_screen: Transform,
18    pub lens_radius: Float,
19    pub focal_distance: Float,
20}
21
22impl ProjectiveCamera {
23    pub fn new(
24        camera_to_world: &AnimatedTransform,
25        camera_to_screen: &Transform,
26        screen_window: &Bounds2f,
27        shutter_open: Float,
28        shutter_close: Float,
29        lensr: Float,
30        focald: Float,
31        film: &Arc<RwLock<Film>>,
32        medium: &Option<Arc<dyn Medium>>,
33    ) -> Self {
34        let resolution = film.read().unwrap().full_resolution;
35        let screen_to_raster = Transform::scale(resolution.x as Float, resolution.y as Float, 1.0)
36            * Transform::scale(
37                1.0 / (screen_window.max.x - screen_window.min.x),
38                1.0 / (screen_window.min.y - screen_window.max.y),
39                1.0,
40            )
41            * Transform::translate(-screen_window.min.x, -screen_window.max.y, 0.0);
42        let raster_to_screen = screen_to_raster.inverse();
43        let raster_to_camera = camera_to_screen.inverse() * raster_to_screen;
44        ProjectiveCamera {
45            base: BaseCamera::new(camera_to_world, shutter_open, shutter_close, film, medium),
46            camera_to_screen: camera_to_screen.clone(),
47            raster_to_camera,
48            screen_to_raster,
49            raster_to_screen,
50            lens_radius: lensr,
51            focal_distance: focald,
52        }
53    }
54
55    pub fn get_film(&self) -> Arc<RwLock<Film>> {
56        return self.base.get_film();
57    }
58
59    pub fn get_medium(&self) -> Option<Arc<dyn Medium>> {
60        return self.base.get_medium();
61    }
62
63    pub fn get_shutter(&self) -> (Float, Float) {
64        return self.base.get_shutter();
65    }
66}