use super::{ChunkPlacementError, ChunkPlacementId};
use molgfx_core::ResidencyTicket;
macro_rules! validate_interpolation {
($value:expr) => {
if !$value.is_finite() || !(0.0..=1.0).contains(&$value) {
return Err(ChunkPlacementError::InvalidInterpolation);
}
};
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct TrajectoryChunkWindow {
pub structure: ResidencyTicket,
pub start: ResidencyTicket,
pub end: ResidencyTicket,
pub interpolation: f32,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct InstanceChunkWindow {
pub placement: ChunkPlacementId,
pub start: ResidencyTicket,
pub end: ResidencyTicket,
pub interpolation: f32,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct AttributeChunkWindow {
pub attribute: ResidencyTicket,
pub start: ResidencyTicket,
pub end: ResidencyTicket,
pub interpolation: f32,
}
impl AttributeChunkWindow {
pub fn new(
attribute: ResidencyTicket,
start: ResidencyTicket,
end: ResidencyTicket,
interpolation: f32,
) -> Result<Self, ChunkPlacementError> {
validate_interpolation!(interpolation);
Ok(Self {
attribute,
start,
end,
interpolation,
})
}
}
impl InstanceChunkWindow {
pub fn new(
placement: ChunkPlacementId,
start: ResidencyTicket,
end: ResidencyTicket,
interpolation: f32,
) -> Result<Self, ChunkPlacementError> {
validate_interpolation!(interpolation);
Ok(Self {
placement,
start,
end,
interpolation,
})
}
}
impl TrajectoryChunkWindow {
pub fn new(
structure: ResidencyTicket,
start: ResidencyTicket,
end: ResidencyTicket,
interpolation: f32,
) -> Result<Self, ChunkPlacementError> {
validate_interpolation!(interpolation);
Ok(Self {
structure,
start,
end,
interpolation,
})
}
}