From b86bb0cf0d22a4edcae90c894a678cd8f6a7e0b9 Mon Sep 17 00:00:00 2001 From: Rob Parrett Date: Thu, 21 Dec 2023 14:00:45 -0700 Subject: [PATCH] Replace pipeline status code with bevy_pipelines_ready --- Cargo.lock | 12 +++++++- Cargo.toml | 2 +- src/loading.rs | 79 ++++++++++++++------------------------------------ 3 files changed, 34 insertions(+), 59 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 49a2fc7..af06306 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1036,6 +1036,16 @@ dependencies = [ "bevy_window", ] +[[package]] +name = "bevy_pipelines_ready" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fe26d15e33fbf25ce55ff52bec28f0cc6a5feeb83031e0022c7df9e3462359" +dependencies = [ + "bevy", + "crossbeam-channel", +] + [[package]] name = "bevy_ptr" version = "0.12.1" @@ -4011,8 +4021,8 @@ dependencies = [ "bevy_asset_loader", "bevy_dolly", "bevy_mod_debugdump", + "bevy_pipelines_ready", "bevy_rapier3d", - "crossbeam-channel", "leafwing-input-manager", "rand", "ron", diff --git a/Cargo.toml b/Cargo.toml index 3e96042..af1714f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ bevy-inspector-egui = { version = "0.21", optional = true } leafwing-input-manager = "0.11" bevy-ui-navigation = "0.33.0" bevy_mod_debugdump = { version = "0.9.0", optional = true } +bevy_pipelines_ready = "0.2.0" bevy-tnua = "0.13.0" bevy-tnua-physics-integration-layer = "0.1.0" @@ -26,7 +27,6 @@ bevy-tnua-rapier3d = "0.1.0" rand = "0.8.5" serde = "*" ron = "0.8.0" -crossbeam-channel = "0.5.8" [target.'cfg(target_arch = "wasm32")'.dependencies] web-sys = { version = "*", features = ["console", "Window", "Storage"] } diff --git a/src/loading.rs b/src/loading.rs index e29595b..195e10d 100644 --- a/src/loading.rs +++ b/src/loading.rs @@ -1,13 +1,6 @@ -use bevy::{ - pbr::CascadeShadowConfigBuilder, - prelude::*, - render::{ - render_resource::{CachedPipelineState, PipelineCache}, - Render, RenderApp, RenderSet, - }, -}; +use bevy::{pbr::CascadeShadowConfigBuilder, prelude::*}; use bevy_asset_loader::prelude::*; -use crossbeam_channel::Receiver; +use bevy_pipelines_ready::{PipelinesReady, PipelinesReadyPlugin}; use crate::GameState; @@ -70,57 +63,27 @@ pub struct Images { pub heart: Handle, } -#[derive(Resource)] -struct PipelineStatus(Receiver); - #[cfg(not(target_arch = "wasm32"))] -const EXPECTED_PIPELINES: usize = 14; +const EXPECTED_PIPELINES: usize = 15; #[cfg(target_arch = "wasm32")] -const EXPECTED_PIPELINES: usize = 12; +const EXPECTED_PIPELINES: usize = 13; impl Plugin for LoadingPlugin { fn build(&self, app: &mut App) { - let (tx, rx) = crossbeam_channel::bounded(1); - - app.insert_resource(PipelineStatus(rx)); - - app.add_loading_state( - LoadingState::new(GameState::Loading).continue_to_state(GameState::Pipelines), - ) - .add_collection_to_loading_state::<_, Models>(GameState::Loading) - .add_collection_to_loading_state::<_, Fonts>(GameState::Loading) - .add_collection_to_loading_state::<_, Images>(GameState::Loading) - .add_collection_to_loading_state::<_, Sounds>(GameState::Loading) - .add_systems( - Update, - pipelines_done.run_if(in_state(GameState::Pipelines)), - ) - .add_systems(OnExit(GameState::Pipelines), cleanup) - .add_systems(OnEnter(GameState::Pipelines), setup_pipelines); - - let renderer_app = app.sub_app_mut(RenderApp); - let mut done = false; - renderer_app.add_systems( - Render, - (move |cache: Res| { - if done { - return; - } - - let ready = cache - .pipelines() - .filter(|pipeline| matches!(pipeline.state, CachedPipelineState::Ok(_))) - .count(); - - debug!("pipelines ready: {}/{}", ready, EXPECTED_PIPELINES); - - if ready >= EXPECTED_PIPELINES { - let _ = tx.send(true); - done = true - } - }) - .in_set(RenderSet::Cleanup), - ); + app.add_plugins(PipelinesReadyPlugin) + .add_loading_state( + LoadingState::new(GameState::Loading).continue_to_state(GameState::Pipelines), + ) + .add_collection_to_loading_state::<_, Models>(GameState::Loading) + .add_collection_to_loading_state::<_, Fonts>(GameState::Loading) + .add_collection_to_loading_state::<_, Images>(GameState::Loading) + .add_collection_to_loading_state::<_, Sounds>(GameState::Loading) + .add_systems( + Update, + pipelines_done.run_if(in_state(GameState::Pipelines)), + ) + .add_systems(OnExit(GameState::Pipelines), cleanup) + .add_systems(OnEnter(GameState::Pipelines), setup_pipelines); } } @@ -181,8 +144,10 @@ fn setup_pipelines( )); } -fn pipelines_done(status: Res, mut next_state: ResMut>) { - if status.0.try_recv().unwrap_or_default() { +fn pipelines_done(ready: Res, mut next_state: ResMut>) { + info!("Pipelines Ready: {}/{}", ready.get(), EXPECTED_PIPELINES); + + if ready.get() >= EXPECTED_PIPELINES { next_state.set(GameState::MainMenu); } }