use std::marker::PhantomData;
use bevy::{
prelude::*,
render::renderer::{RenderAdapter, RenderDevice},
};
use crate::{
extract_shaders, pipeline_cache::AppPipelineCache, process_pipeline_queue_system,
traits::ComputeWorker, worker::AppComputeWorker,
};
pub struct AppComputePlugin;
impl Plugin for AppComputePlugin {
fn build(&self, _app: &mut App) {}
fn finish(&self, app: &mut App) {
let render_device = app.world().resource::<RenderDevice>().clone();
let render_adapter = app.world().resource::<RenderAdapter>().clone();
app.configure_sets(Update, BevyEasyComputeSet::ExtractPipelines)
.configure_sets(PostUpdate, BevyEasyComputePostUpdateSet::ExecuteCompute);
app.insert_resource(AppPipelineCache::new(render_device, render_adapter))
.add_systems(PreUpdate, extract_shaders)
.add_systems(
Update,
process_pipeline_queue_system.in_set(BevyEasyComputeSet::ExtractPipelines),
);
}
}
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
pub enum BevyEasyComputeSet {
ExtractPipelines,
}
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
pub enum BevyEasyComputePostUpdateSet {
ExecuteCompute,
}
pub struct AppComputeWorkerPlugin<W: ComputeWorker> {
_phantom: PhantomData<W>,
}
impl<W: ComputeWorker> Default for AppComputeWorkerPlugin<W> {
fn default() -> Self {
Self {
_phantom: Default::default(),
}
}
}
impl<W: ComputeWorker> Plugin for AppComputeWorkerPlugin<W> {
fn build(&self, _app: &mut App) {}
fn finish(&self, app: &mut App) {
let worker = W::build(app.world_mut());
app.insert_resource(worker)
.add_systems(
Update,
AppComputeWorker::<W>::extract_pipelines
.in_set(BevyEasyComputeSet::ExtractPipelines)
.after(process_pipeline_queue_system),
)
.add_systems(
PostUpdate,
(AppComputeWorker::<W>::unmap_all, AppComputeWorker::<W>::run)
.in_set(BevyEasyComputePostUpdateSet::ExecuteCompute)
.chain(),
);
}
}