Skip to main content

pebble/rendering/
render_plugin.rs

1use crate::prelude::{Backend, CurrentFrame, Plugin, ResMut, SystemStage};
2
3pub struct RenderPlugin<B: Backend> {
4    _marker: std::marker::PhantomData<B>,
5}
6
7impl<B: Backend> RenderPlugin<B> {
8    pub fn new() -> Self {
9        Self {
10            _marker: std::marker::PhantomData,
11        }
12    }
13}
14
15impl<B: Backend> Plugin for RenderPlugin<B> {
16    fn build(&self, app: &mut crate::prelude::App) {
17        app.add_resource(CurrentFrame::<B> { frame: None })
18            .add_system(SystemStage::PreRender, begin_frame::<B>)
19            .add_system(SystemStage::PostRender, end_frame::<B>);
20    }
21}
22
23fn begin_frame<B: Backend>(backend: Option<ResMut<B>>, mut frame: ResMut<CurrentFrame<B>>) {
24    let Some(mut backend) = backend else { return };
25    frame.frame = backend.acquire();
26}
27
28fn end_frame<B: Backend>(backend: Option<ResMut<B>>, mut current: ResMut<CurrentFrame<B>>) {
29    let Some(mut backend) = backend else { return };
30    if let Some(frame) = current.frame.take() {
31        backend.present(frame);
32    }
33}