Steps per frame is configurable per-renderer

This commit is contained in:
2021-06-14 20:09:52 -07:00
parent 8aab8f41f9
commit e02a062dda
6 changed files with 77 additions and 74 deletions

View File

@@ -592,8 +592,14 @@ impl<S: GenericSim> Renderer<S> for PlotlyRenderer {
}
}
struct MultiRendererElement<S> {
step_frequency: u64,
renderer: Box<dyn Renderer<S>>,
}
pub struct MultiRenderer<S> {
renderers: RwLock<Vec<Box<dyn Renderer<S>>>>,
renderers: RwLock<Vec<MultiRendererElement<S>>>,
}
impl<S> Default for MultiRenderer<S> {
@@ -608,13 +614,19 @@ impl<S> MultiRenderer<S> {
pub fn new() -> Self {
Default::default()
}
pub fn push<R: Renderer<S> + 'static>(&self, r: R) {
self.renderers.write().unwrap().push(Box::new(r));
pub fn push<R: Renderer<S> + 'static>(&self, renderer: R, step_frequency: u64) {
self.renderers.write().unwrap().push(MultiRendererElement {
step_frequency,
renderer: Box::new(renderer),
});
}
pub fn with<R: Renderer<S> + 'static>(self, r: R) -> Self {
self.push(r);
pub fn with<R: Renderer<S> + 'static>(self, renderer: R, step_frequency: u64) -> Self {
self.push(renderer, step_frequency);
self
}
pub fn any_work_for_frame(&self, frame: u64) -> bool {
self.renderers.read().unwrap().iter().any(|m| frame % m.step_frequency == 0)
}
}
impl<S: GenericSim> Renderer<S> for MultiRenderer<S> {
@@ -629,7 +641,9 @@ impl<S: GenericSim> Renderer<S> for MultiRenderer<S> {
fn render_with_image(&self, state: &S, im: &RgbImage, measurements: &[Box<dyn AbstractMeasurement>], config: RenderConfig) {
for r in &*self.renderers.read().unwrap() {
r.render_with_image(state, im, measurements, config);
if state.step_no() % r.step_frequency == 0 {
r.renderer.render_with_image(state, im, measurements, config);
}
}
}
}