pebble/rendering/
render_plugin.rs1use 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}