pbrt/src/samplers/stratified.rs

42 lines
1.2 KiB
Rust

use crate::Arena;
use crate::core::sampler::CreateSampler;
use crate::utils::{FileLoc, ParameterDictionary};
use shared::core::geometry::Point2i;
use shared::core::options::get_options;
use shared::core::sampler::StratifiedSampler;
use std::fmt::Error;
impl CreateSampler for StratifiedSampler {
fn create(
params: &ParameterDictionary,
_full_res: Point2i,
_loc: &FileLoc,
arena: &mut Arena,
) -> Result<Self, Error> {
let options = get_options();
let jitter = params.get_one_bool("jitter", true);
let (x_samples, y_samples) = if options.quick_render {
(1, 1)
} else if let Some(n) = options.pixel_samples {
let div = (n as f64).sqrt() as i32;
let y = (1..=div).rev().find(|d| n % d == 0).unwrap();
(n / y, y)
} else {
(
params.get_one_int("xsamples", 4),
params.get_one_int("ysamples", 4),
)
};
let seed = params.get_one_int("seed", options.seed);
let sampler = Self::new(
x_samples as u32,
y_samples as u32,
Some(seed as u64),
jitter,
);
arena.aloc(sampler);
Ok(sampler)
}
}