pebble/rendering/
render_plugin.rs1use crate::{
2 prelude::{Backend, CurrentFrame, Plugin, ResMut, SystemStage},
3 rendering::errors::AcquireError,
4};
5
6pub struct RenderPlugin<B: Backend> {
16 _marker: std::marker::PhantomData<B>,
17}
18
19impl<B: Backend> RenderPlugin<B> {
20 pub fn new() -> Self {
21 Self {
22 _marker: std::marker::PhantomData,
23 }
24 }
25}
26
27impl<B: Backend> Plugin for RenderPlugin<B> {
28 fn build(&self, app: &mut crate::prelude::App) {
29 app.add_resource(CurrentFrame::<B> { frame: None })
30 .add_system(SystemStage::PreRender, begin_frame::<B>)
31 .add_system(SystemStage::PostRender, end_frame::<B>);
32 }
33}
34
35fn begin_frame<B: Backend>(backend: Option<ResMut<B>>, mut frame: ResMut<CurrentFrame<B>>) {
38 let Some(mut backend) = backend else { return };
39
40 match backend.acquire() {
41 Ok(f) => frame.frame = Some(f),
42 Err(AcquireError::Transient) => frame.frame = None,
43 Err(AcquireError::Fatal(msg)) => {
44 tracing::error!("Fatal frame acquisition error: {msg}");
45 frame.frame = None;
46 }
47 }
48}
49
50fn end_frame<B: Backend>(backend: Option<ResMut<B>>, mut current: ResMut<CurrentFrame<B>>) {
52 let Some(mut backend) = backend else { return };
53 if let Some(frame) = current.frame.take() {
54 backend.present(frame);
55 }
56}