mod base;
mod constants;
mod path;
mod pipeline;
mod state;

pub use path::PathIntegrator;

use crate::Arena;
use shared::core::film::VisibleSurface;
use shared::core::geometry::{Point2i, Ray};
use shared::core::sampler::Sampler;
use shared::spectra::{SampledSpectrum, SampledWavelengths};

pub trait IntegratorTrait {
    fn render(&self);
}

pub trait RayIntegratorTrait {
    fn evaluate_pixel_sample(
        &self,
        p_pixel: Point2i,
        sample_ind: usize,
        sampler: &mut Sampler,
        arena: &mut Arena,
    );

    fn li(
        &self,
        ray: Ray,
        lambda: &SampledWavelengths,
        sampler: &mut Sampler,
        visible_surface: bool,
        arena: &mut Arena,
    ) -> (SampledSpectrum, Option<VisibleSurface>);
}
