use crate::raster::{RasterImage, Resolution};
use crate::render_context::RenderContext;
use crate::time::TimelineTime;
pub trait Timeline {
fn duration(&self) -> f32;
fn build(
&self,
t: TimelineTime,
target: Resolution,
ctx: &mut dyn RenderContext,
) -> RasterImage;
}
pub fn timeline<F>(duration: f32, build: F) -> impl Timeline
where
F: Fn(TimelineTime, Resolution, &mut dyn RenderContext) -> RasterImage,
{
FnTimeline { duration, build }
}
struct FnTimeline<F> {
duration: f32,
build: F,
}
impl<F> Timeline for FnTimeline<F>
where
F: Fn(TimelineTime, Resolution, &mut dyn RenderContext) -> RasterImage,
{
fn duration(&self) -> f32 {
self.duration
}
fn build(
&self,
t: TimelineTime,
target: Resolution,
ctx: &mut dyn RenderContext,
) -> RasterImage {
(self.build)(t, target, ctx)
}
}
const _: Option<&dyn Timeline> = None;