use geometry::prelude::*;
use self::film::Film;
use spectrum::RGBSpectrumf;
use lighting;
pub type ImportanceSample = lighting::LightSample;
#[derive(Copy, Clone, PartialEq)]
pub struct SampleInfo {
pub pfilm: Point2f,
pub plens: Point2f,
}
pub trait Camera: Send + Sync {
fn parent_to_view(&self) -> Matrix4f;
fn view_to_parent(&self) -> Matrix4f {
self.parent_to_view().inverse_transform().expect("matrix inversion failure")
}
fn evaluate_importance(
&self, posw: Point3f, dirw: Vector3f
) -> Option<(RGBSpectrumf, Point2f)>;
fn evaluate_importance_sampled(&self, posw: Point3f, sample: Point2f) -> (ImportanceSample, Point2f);
fn pdf(&self, posw: Point3f, dirw: Vector3f) -> (Float, Float);
fn generate_path(&self, sample_info: SampleInfo) -> RawRay;
fn generate_path_differential(&self, sample_info: SampleInfo) -> RayDifferential {
let ray = self.generate_path(sample_info);
let ray_dx = {
let mut sample_info = sample_info;
sample_info.pfilm.x += 1.0 as Float;
self.generate_path(sample_info)
};
let ray_dy = {
let mut sample_info = sample_info;
sample_info.pfilm.y += 1.0 as Float;
self.generate_path(sample_info)
};
RayDifferential{
ray: ray,
diffs: Some((ray_dx, ray_dy)),
}
}
fn get_film(&self) -> &Film;
fn get_film_mut(&mut self) -> &mut Film;
}
mod projective;
pub mod ortho;
pub mod perspective;
pub mod film;
pub mod prelude;
#[cfg(test)]
mod tests;