use bevy::prelude::*;
use crossbeam_channel::bounded;
use crate::buffer::ScreenshotBufferManager;
use crate::capture::{
detect_shutdown, handle_screenshot_captured, process_screenshot_requests,
update_render_readiness, RenderReadiness, ScreenshotRequest, ScreenshotRequestReceiver,
ScreenshotRequestSender, ShutdownState,
};
use crate::config::ScreenshotConfig;
use crate::save::{spawn_save_thread, SaveTaskSender};
pub struct ScreenshotBufferPlugin {
config: ScreenshotConfig,
}
impl ScreenshotBufferPlugin {
pub fn new() -> Self {
Self {
config: ScreenshotConfig::load(),
}
}
pub fn with_config(config: ScreenshotConfig) -> Self {
Self { config }
}
}
impl Default for ScreenshotBufferPlugin {
fn default() -> Self {
Self::new()
}
}
impl Plugin for ScreenshotBufferPlugin {
fn build(&self, app: &mut App) {
const REQUEST_CHANNEL_CAPACITY: usize = 32;
const SAVE_CHANNEL_CAPACITY: usize = 64;
let (request_tx, request_rx) = bounded::<ScreenshotRequest>(REQUEST_CHANNEL_CAPACITY);
let (save_tx, save_rx) = bounded(SAVE_CHANNEL_CAPACITY);
let config_clone = self.config.clone();
let save_thread_handle = spawn_save_thread(save_rx, config_clone);
app.insert_resource(save_thread_handle)
.insert_resource(ScreenshotRequestSender(request_tx))
.insert_resource(ScreenshotRequestReceiver(request_rx))
.insert_resource(SaveTaskSender(save_tx))
.insert_resource(ScreenshotBufferManager::new(self.config.clone()))
.insert_resource(RenderReadiness::default())
.insert_resource(ShutdownState::default())
.add_message::<ScreenshotRequest>()
.add_systems(First, update_render_readiness)
.add_systems(Last, detect_shutdown)
.add_systems(Update, process_screenshot_requests)
.add_observer(handle_screenshot_captured);
}
}