
# Objective Prevents duplicate implementation between IntoSystemConfigs and IntoSystemSetConfigs using a generic, adds a NodeType trait for more config flexibility (opening the door to implement https://github.com/bevyengine/bevy/issues/14195?). ## Solution Followed writeup by @ItsDoot: https://hackmd.io/@doot/rJeefFHc1x Removes IntoSystemConfigs and IntoSystemSetConfigs, instead using IntoNodeConfigs with generics. ## Testing Pending --- ## Showcase N/A ## Migration Guide SystemSetConfigs -> NodeConfigs<InternedSystemSet> SystemConfigs -> NodeConfigs<ScheduleSystem> IntoSystemSetConfigs -> IntoNodeConfigs<InternedSystemSet, M> IntoSystemConfigs -> IntoNodeConfigs<ScheduleSystem, M> --------- Co-authored-by: Christian Hughes <9044780+ItsDoot@users.noreply.github.com> Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
60 lines
1.9 KiB
Rust
60 lines
1.9 KiB
Rust
use crate::{
|
|
render_resource::{GpuArrayBuffer, GpuArrayBufferable},
|
|
renderer::{RenderDevice, RenderQueue},
|
|
Render, RenderApp, RenderSet,
|
|
};
|
|
use bevy_app::{App, Plugin};
|
|
use bevy_ecs::{
|
|
prelude::{Component, Entity},
|
|
schedule::IntoScheduleConfigs,
|
|
system::{Commands, Query, Res, ResMut},
|
|
};
|
|
use core::marker::PhantomData;
|
|
|
|
/// This plugin prepares the components of the corresponding type for the GPU
|
|
/// by storing them in a [`GpuArrayBuffer`].
|
|
pub struct GpuComponentArrayBufferPlugin<C: Component + GpuArrayBufferable>(PhantomData<C>);
|
|
|
|
impl<C: Component + GpuArrayBufferable> Plugin for GpuComponentArrayBufferPlugin<C> {
|
|
fn build(&self, app: &mut App) {
|
|
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
|
|
render_app.add_systems(
|
|
Render,
|
|
prepare_gpu_component_array_buffers::<C>.in_set(RenderSet::PrepareResources),
|
|
);
|
|
}
|
|
}
|
|
|
|
fn finish(&self, app: &mut App) {
|
|
if let Some(render_app) = app.get_sub_app_mut(RenderApp) {
|
|
render_app.insert_resource(GpuArrayBuffer::<C>::new(
|
|
render_app.world().resource::<RenderDevice>(),
|
|
));
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<C: Component + GpuArrayBufferable> Default for GpuComponentArrayBufferPlugin<C> {
|
|
fn default() -> Self {
|
|
Self(PhantomData::<C>)
|
|
}
|
|
}
|
|
|
|
fn prepare_gpu_component_array_buffers<C: Component + GpuArrayBufferable>(
|
|
mut commands: Commands,
|
|
render_device: Res<RenderDevice>,
|
|
render_queue: Res<RenderQueue>,
|
|
mut gpu_array_buffer: ResMut<GpuArrayBuffer<C>>,
|
|
components: Query<(Entity, &C)>,
|
|
) {
|
|
gpu_array_buffer.clear();
|
|
|
|
let entities = components
|
|
.iter()
|
|
.map(|(entity, component)| (entity, gpu_array_buffer.push(component.clone())))
|
|
.collect::<Vec<_>>();
|
|
commands.try_insert_batch(entities);
|
|
|
|
gpu_array_buffer.write_buffer(&render_device, &render_queue);
|
|
}
|