use geometry::prelude::*;
#[derive(Clone, Serialize, Deserialize, Debug)]
pub struct ProjCameraInfo {
pub view_screen: Matrix4f,
pub screen_raster: Matrix4f,
pub raster_screen: Matrix4f,
pub raster_view: Matrix4f,
pub screen: BBox2f,
}
impl ProjCameraInfo {
pub fn new(
view_screen: Matrix4f,
screen: BBox2f,
resolution: Vector2f
) -> ProjCameraInfo {
let raster_screen = Matrix4f::from_translation(
Vector3f::new(screen.pmin.x, screen.pmax.y, 0. as Float)
) * Matrix4f::from_nonuniform_scale(
(screen.pmax.x-screen.pmin.x)/resolution.x,
(screen.pmin.y-screen.pmax.y)/resolution.y,
1. as Float
);
let screen_raster = raster_screen.invert().unwrap();
let raster_view = view_screen.invert().expect("matrix inversion failure") * raster_screen;
ProjCameraInfo {
view_screen: view_screen,
screen_raster: screen_raster,
raster_screen: raster_screen,
raster_view: raster_view,
screen: screen,
}
}
}