use bevy_utils::Parallel;
use crate::{
entity::{Entities, EntityAllocator},
prelude::World,
system::{Deferred, SystemBuffer, SystemMeta, SystemParam},
};
use super::{CommandQueue, Commands};
#[derive(Default)]
struct ParallelCommandQueue {
thread_queues: Parallel<CommandQueue>,
}
#[derive(SystemParam)]
pub struct ParallelCommands<'w, 's> {
state: Deferred<'s, ParallelCommandQueue>,
allocator: &'w EntityAllocator,
entities: &'w Entities,
}
impl SystemBuffer for ParallelCommandQueue {
#[inline]
fn apply(&mut self, _system_meta: &SystemMeta, world: &mut World) {
#[cfg(feature = "trace")]
let _system_span = _system_meta.commands_span.enter();
for cq in self.thread_queues.iter_mut() {
cq.apply(world);
}
}
}
impl<'w, 's> ParallelCommands<'w, 's> {
pub fn command_scope<R>(&self, f: impl FnOnce(Commands) -> R) -> R {
self.state.thread_queues.scope(|queue| {
let commands = Commands::new_from_entities(queue, self.allocator, self.entities);
f(commands)
})
}
}