diff --git a/crates/bevy_render/src/render_asset.rs b/crates/bevy_render/src/render_asset.rs index d2fe8ed064951..3ee311ffda79e 100644 --- a/crates/bevy_render/src/render_asset.rs +++ b/crates/bevy_render/src/render_asset.rs @@ -39,28 +39,68 @@ pub trait RenderAsset: Asset { ) -> Result>; } +#[derive(Clone, Hash, Debug, PartialEq, Eq, SystemLabel)] +pub enum PrepareAssetLabel { + PreAssetPrepare, + AssetPrepare, + PostAssetPrepare, +} + +impl Default for PrepareAssetLabel { + fn default() -> Self { + Self::AssetPrepare + } +} + /// This plugin extracts the changed assets from the "app world" into the "render world" /// and prepares them for the GPU. They can then be accessed from the [`RenderAssets`] resource. /// /// Therefore it sets up the [`RenderStage::Extract`](crate::RenderStage::Extract) and /// [`RenderStage::Prepare`](crate::RenderStage::Prepare) steps for the specified [`RenderAsset`]. -pub struct RenderAssetPlugin(PhantomData A>); +pub struct RenderAssetPlugin { + prepare_asset_label: PrepareAssetLabel, + phantom: PhantomData A>, +} + +impl RenderAssetPlugin { + pub fn with_prepare_asset_label(prepare_asset_label: PrepareAssetLabel) -> Self { + Self { + prepare_asset_label, + phantom: PhantomData, + } + } +} impl Default for RenderAssetPlugin { fn default() -> Self { - Self(PhantomData) + Self { + prepare_asset_label: Default::default(), + phantom: PhantomData, + } } } impl Plugin for RenderAssetPlugin { fn build(&self, app: &mut App) { if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { + let prepare_asset_system = prepare_assets::.label(self.prepare_asset_label.clone()); + + let prepare_asset_system = match self.prepare_asset_label { + PrepareAssetLabel::PreAssetPrepare => prepare_asset_system, + PrepareAssetLabel::AssetPrepare => { + prepare_asset_system.after(PrepareAssetLabel::PreAssetPrepare) + } + PrepareAssetLabel::PostAssetPrepare => { + prepare_asset_system.after(PrepareAssetLabel::AssetPrepare) + } + }; + render_app .init_resource::>() .init_resource::>() .init_resource::>() .add_system_to_stage(RenderStage::Extract, extract_render_asset::) - .add_system_to_stage(RenderStage::Prepare, prepare_assets::); + .add_system_to_stage(RenderStage::Prepare, prepare_asset_system); } } } diff --git a/crates/bevy_render/src/texture/mod.rs b/crates/bevy_render/src/texture/mod.rs index 84bd662747b83..851eac1371b9e 100644 --- a/crates/bevy_render/src/texture/mod.rs +++ b/crates/bevy_render/src/texture/mod.rs @@ -24,7 +24,10 @@ pub use hdr_texture_loader::*; pub use image_texture_loader::*; pub use texture_cache::*; -use crate::{render_asset::RenderAssetPlugin, RenderApp, RenderStage}; +use crate::{ + render_asset::{PrepareAssetLabel, RenderAssetPlugin}, + RenderApp, RenderStage, +}; use bevy_app::{App, Plugin}; use bevy_asset::{AddAsset, Assets}; @@ -52,8 +55,10 @@ impl Plugin for ImagePlugin { app.init_asset_loader::(); } - app.add_plugin(RenderAssetPlugin::::default()) - .add_asset::(); + app.add_plugin(RenderAssetPlugin::::with_prepare_asset_label( + PrepareAssetLabel::PreAssetPrepare, + )) + .add_asset::(); app.world .resource_mut::>() .set_untracked(DEFAULT_IMAGE_HANDLE, Image::default());