use crate::CancelToken;
use glam::Vec3;
use indicatrix_net::SceneState;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SampleRange {
pub first_sample: u32,
pub samples: u32,
}
impl SampleRange {
#[must_use]
pub const fn new(first_sample: u32, samples: u32) -> Self {
Self {
first_sample,
samples,
}
}
#[must_use]
pub const fn end(self) -> u32 {
self.first_sample + self.samples
}
#[must_use]
pub const fn is_empty(self) -> bool {
self.samples == 0
}
#[must_use]
pub const fn after_prefix(self, done: u32) -> Self {
let done = if done > self.samples {
self.samples
} else {
done
};
Self::new(self.first_sample + done, self.samples - done)
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ChunkResult {
pub sum: Vec<Vec3>,
pub done: u32,
pub rate: Option<f64>,
pub error: Option<String>,
}
impl ChunkResult {
#[must_use]
pub const fn complete(sum: Vec<Vec3>, done: u32, rate: Option<f64>) -> Self {
Self {
sum,
done,
rate,
error: None,
}
}
#[must_use]
pub const fn partial(sum: Vec<Vec3>, done: u32, error: String) -> Self {
Self {
sum,
done,
rate: None,
error: Some(error),
}
}
#[must_use]
pub const fn failed(error: String) -> Self {
Self {
sum: Vec::new(),
done: 0,
rate: None,
error: Some(error),
}
}
}
pub trait WorkerLane: Send + Sync {
fn name(&self) -> &str;
fn render_chunk(
&self,
scene: &SceneState,
range: SampleRange,
cancel: &CancelToken,
) -> ChunkResult;
}