use super::{IPlatformRenderSurface, IPlatformRenderSurfaceRenderTarget};
use crate::platform::{ILockedFramebuffer, RenderTargetSceneInfo};
use std::rc::Rc;
pub trait IFramebufferPlatformSurface: IPlatformRenderSurface {
fn create_framebuffer_render_target(&self) -> Rc<dyn IFramebufferRenderTarget>;
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct FramebufferLockProperties {
pub previous_frame_is_retained: bool,
}
pub trait IFramebufferRenderTarget: IPlatformRenderSurfaceRenderTarget {
fn lock(&self, scene_info: &RenderTargetSceneInfo) -> (Rc<dyn ILockedFramebuffer>, FramebufferLockProperties);
fn retains_frame_contents(&self) -> bool {
false
}
fn dispose(&self);
}
type LockFramebuffer = dyn Fn(&RenderTargetSceneInfo) -> (Rc<dyn ILockedFramebuffer>, FramebufferLockProperties);
pub struct FuncFramebufferRenderTarget {
lock_framebuffer: Box<LockFramebuffer>,
retains_frame_contents: bool,
}
impl FuncFramebufferRenderTarget {
pub fn new(lock_framebuffer: impl Fn() -> Rc<dyn ILockedFramebuffer> + 'static) -> Self {
Self {
lock_framebuffer: Box::new(move |_| (lock_framebuffer(), FramebufferLockProperties::default())),
retains_frame_contents: false,
}
}
pub fn with_scene_info(
lock_framebuffer: impl Fn(&RenderTargetSceneInfo) -> (Rc<dyn ILockedFramebuffer>, FramebufferLockProperties)
+ 'static,
retains_frame_contents: bool,
) -> Self {
Self { lock_framebuffer: Box::new(lock_framebuffer), retains_frame_contents }
}
}
impl IPlatformRenderSurfaceRenderTarget for FuncFramebufferRenderTarget {}
impl IFramebufferRenderTarget for FuncFramebufferRenderTarget {
fn lock(&self, scene_info: &RenderTargetSceneInfo) -> (Rc<dyn ILockedFramebuffer>, FramebufferLockProperties) {
(self.lock_framebuffer)(scene_info)
}
fn retains_frame_contents(&self) -> bool {
self.retains_frame_contents
}
fn dispose(&self) {}
}