Add loading state handler, very rough
parent
bb7794e52a
commit
c14f2484e6
@ -0,0 +1,62 @@
|
||||
|
||||
use super::*;
|
||||
|
||||
/// Systems run during loading state
|
||||
pub struct LoadingPlugin;
|
||||
|
||||
impl Plugin for LoadingPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
// PERF: We check all asset classes every frame, should be event based
|
||||
app
|
||||
.init_resource::<TrackLoadingProgress>()
|
||||
.add_systems(PreUpdate, reset_progress)
|
||||
.add_systems(Update,
|
||||
(
|
||||
track_loading::<AnimationClip>,
|
||||
track_loading::<AudioSource>,
|
||||
track_loading::<Font>,
|
||||
track_loading::<Gltf>,
|
||||
track_loading::<Image>,
|
||||
track_loading::<Shader>,
|
||||
).run_if(in_state(GameState::Loading)),
|
||||
)
|
||||
.add_systems(PostUpdate, check_progress);
|
||||
}
|
||||
}
|
||||
|
||||
/// Resource for tracking asset loading progress
|
||||
#[derive(Resource, Default)]
|
||||
struct TrackLoadingProgress(Vec<bool>);
|
||||
|
||||
/// At the start of the update clear progress
|
||||
fn reset_progress(
|
||||
mut progress: ResMut<TrackLoadingProgress>,
|
||||
) {
|
||||
progress.0.clear()
|
||||
}
|
||||
|
||||
/// Track the progress of all assets in this asset class
|
||||
fn track_loading<A: Asset>(
|
||||
assets: Res<Assets<A>>,
|
||||
server: Res<AssetServer>,
|
||||
mut progress: ResMut<TrackLoadingProgress>,
|
||||
) {
|
||||
let all_loaded = assets
|
||||
.ids()
|
||||
.map(|id| server.load_state(id))
|
||||
.all(|load_state| {
|
||||
!load_state.is_loading() && !load_state.is_failed()
|
||||
});
|
||||
|
||||
progress.0.push(all_loaded);
|
||||
}
|
||||
|
||||
/// At the end of the frame check if all asset classes are loaded
|
||||
fn check_progress(
|
||||
progress: Res<TrackLoadingProgress>,
|
||||
mut next_state: ResMut<NextState<GameState>>,
|
||||
) {
|
||||
if progress.0.iter().all(|x| *x) {
|
||||
next_state.set(GameState::Main);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue