Skip to content

Commit 634872c

Browse files
committed
scene_viewer: Wait until scene has actually been spawned before proceeding
1 parent 2246396 commit 634872c

File tree

1 file changed

+36
-26
lines changed

1 file changed

+36
-26
lines changed

examples/tools/scene_viewer.rs

+36-26
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use bevy::{
66
camera::{Camera2d, Camera3d, CameraProjection},
77
primitives::{Aabb, Frustum, Sphere},
88
},
9+
scene::InstanceId,
910
};
1011

1112
fn main() {
@@ -48,6 +49,7 @@ Controls:
4849

4950
struct SceneHandle {
5051
handle: Handle<Scene>,
52+
instance_id: Option<InstanceId>,
5153
is_loaded: bool,
5254
has_camera: bool,
5355
has_light: bool,
@@ -59,45 +61,53 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
5961
.unwrap_or_else(|| "assets/models/FlightHelmet/FlightHelmet.gltf#Scene0".to_string());
6062
commands.insert_resource(SceneHandle {
6163
handle: asset_server.load(&scene_path),
64+
instance_id: None,
6265
is_loaded: false,
6366
has_camera: false,
6467
has_light: false,
6568
});
6669
}
6770

6871
fn scene_load_check(
69-
mut commands: Commands,
7072
asset_server: Res<AssetServer>,
7173
mut scenes: ResMut<Assets<Scene>>,
7274
mut scene_handle: ResMut<SceneHandle>,
75+
mut scene_spawner: ResMut<SceneSpawner>,
7376
) {
74-
if !scene_handle.is_loaded
75-
&& asset_server.get_load_state(&scene_handle.handle) == LoadState::Loaded
76-
{
77-
if let Some(scene) = scenes.get_mut(&scene_handle.handle) {
78-
let mut query = scene
79-
.world
80-
.query::<(Option<&Camera2d>, Option<&Camera3d>)>();
81-
scene_handle.has_camera =
82-
query
83-
.iter(&scene.world)
84-
.any(|(maybe_camera2d, maybe_camera3d)| {
85-
maybe_camera2d.is_some() || maybe_camera3d.is_some()
86-
});
87-
let mut query = scene
88-
.world
89-
.query::<(Option<&DirectionalLight>, Option<&PointLight>)>();
90-
scene_handle.has_light =
91-
query
92-
.iter(&scene.world)
93-
.any(|(maybe_directional_light, maybe_point_light)| {
94-
maybe_directional_light.is_some() || maybe_point_light.is_some()
95-
});
77+
match scene_handle.instance_id {
78+
None if asset_server.get_load_state(&scene_handle.handle) == LoadState::Loaded => {
79+
if let Some(scene) = scenes.get_mut(&scene_handle.handle) {
80+
let mut query = scene
81+
.world
82+
.query::<(Option<&Camera2d>, Option<&Camera3d>)>();
83+
scene_handle.has_camera =
84+
query
85+
.iter(&scene.world)
86+
.any(|(maybe_camera2d, maybe_camera3d)| {
87+
maybe_camera2d.is_some() || maybe_camera3d.is_some()
88+
});
89+
let mut query = scene
90+
.world
91+
.query::<(Option<&DirectionalLight>, Option<&PointLight>)>();
92+
scene_handle.has_light =
93+
query
94+
.iter(&scene.world)
95+
.any(|(maybe_directional_light, maybe_point_light)| {
96+
maybe_directional_light.is_some() || maybe_point_light.is_some()
97+
});
9698

97-
commands.spawn_scene(scene_handle.handle.clone_weak());
98-
scene_handle.is_loaded = true;
99-
println!("Spawning scene");
99+
scene_handle.instance_id =
100+
Some(scene_spawner.spawn(scene_handle.handle.clone_weak()));
101+
println!("Spawning scene...");
102+
}
103+
}
104+
Some(instance_id) if !scene_handle.is_loaded => {
105+
if scene_spawner.instance_is_ready(instance_id) {
106+
println!("...done!");
107+
scene_handle.is_loaded = true;
108+
}
100109
}
110+
_ => {}
101111
}
102112
}
103113

0 commit comments

Comments
 (0)