pbrt_r3/core/camera/
projective.rs1use 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}