Skip to content

Commit 4c17cf8

Browse files
authored
Try #2425:
2 parents b52edc1 + bfac74b commit 4c17cf8

File tree

3 files changed

+44
-23
lines changed

3 files changed

+44
-23
lines changed

crates/bevy_scene/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ impl Plugin for ScenePlugin {
2929
fn build(&self, app: &mut AppBuilder) {
3030
app.add_asset::<DynamicScene>()
3131
.add_asset::<Scene>()
32+
.add_event::<SceneSpawnedEvent>()
3233
.init_asset_loader::<SceneLoader>()
3334
.init_resource::<SceneSpawner>()
3435
.add_system_to_stage(

crates/bevy_scene/src/scene_spawner.rs

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ impl InstanceId {
2626
}
2727
}
2828

29+
#[derive(Debug)]
30+
pub struct SceneSpawnedEvent {
31+
pub instance_id: InstanceId,
32+
}
33+
2934
#[derive(Default)]
3035
pub struct SceneSpawner {
3136
spawned_scenes: HashMap<Handle<Scene>, Vec<InstanceId>>,
@@ -96,7 +101,7 @@ impl SceneSpawner {
96101
&mut self,
97102
world: &mut World,
98103
scene_handle: &Handle<DynamicScene>,
99-
) -> Result<(), SceneSpawnError> {
104+
) -> Result<InstanceId, SceneSpawnError> {
100105
let mut entity_map = EntityMap::default();
101106
Self::spawn_dynamic_internal(world, scene_handle, &mut entity_map)?;
102107
let instance_id = InstanceId::new();
@@ -107,7 +112,7 @@ impl SceneSpawner {
107112
.entry(scene_handle.clone())
108113
.or_insert_with(Vec::new);
109114
spawned.push(instance_id);
110-
Ok(())
115+
Ok(instance_id)
111116
}
112117

113118
fn spawn_dynamic_internal(
@@ -235,31 +240,39 @@ impl SceneSpawner {
235240
}
236241

237242
pub fn spawn_queued_scenes(&mut self, world: &mut World) -> Result<(), SceneSpawnError> {
238-
let scenes_to_spawn = std::mem::take(&mut self.dynamic_scenes_to_spawn);
239-
240-
for scene_handle in scenes_to_spawn {
241-
match self.spawn_dynamic_sync(world, &scene_handle) {
242-
Ok(_) => {}
243-
Err(SceneSpawnError::NonExistentScene { .. }) => {
244-
self.dynamic_scenes_to_spawn.push(scene_handle)
243+
world.resource_scope(
244+
|world, mut scene_spawned_event_writer: Mut<Events<SceneSpawnedEvent>>| {
245+
let scenes_to_spawn = std::mem::take(&mut self.dynamic_scenes_to_spawn);
246+
247+
for scene_handle in scenes_to_spawn {
248+
match self.spawn_dynamic_sync(world, &scene_handle) {
249+
Ok(instance_id) => {
250+
scene_spawned_event_writer.send(SceneSpawnedEvent { instance_id });
251+
}
252+
Err(SceneSpawnError::NonExistentScene { .. }) => {
253+
self.dynamic_scenes_to_spawn.push(scene_handle);
254+
}
255+
Err(err) => return Err(err),
256+
}
245257
}
246-
Err(err) => return Err(err),
247-
}
248-
}
249258

250-
let scenes_to_spawn = std::mem::take(&mut self.scenes_to_spawn);
259+
let scenes_to_spawn = std::mem::take(&mut self.scenes_to_spawn);
251260

252-
for (scene_handle, instance_id) in scenes_to_spawn {
253-
match self.spawn_sync_internal(world, scene_handle, instance_id) {
254-
Ok(_) => {}
255-
Err(SceneSpawnError::NonExistentRealScene { handle }) => {
256-
self.scenes_to_spawn.push((handle, instance_id))
261+
for (scene_handle, instance_id) in scenes_to_spawn {
262+
match self.spawn_sync_internal(world, scene_handle, instance_id) {
263+
Ok(instance_id) => {
264+
scene_spawned_event_writer.send(SceneSpawnedEvent { instance_id });
265+
}
266+
Err(SceneSpawnError::NonExistentRealScene { handle }) => {
267+
self.scenes_to_spawn.push((handle, instance_id))
268+
}
269+
Err(err) => return Err(err),
270+
}
257271
}
258-
Err(err) => return Err(err),
259-
}
260-
}
261272

262-
Ok(())
273+
Ok(())
274+
},
275+
)
263276
}
264277

265278
pub(crate) fn set_scene_instance_parent_sync(&mut self, world: &mut World) {

examples/scene/scene.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use bevy::{prelude::*, reflect::TypeRegistry, utils::Duration};
1+
use bevy::{prelude::*, reflect::TypeRegistry, scene::SceneSpawnedEvent, utils::Duration};
22

33
/// This example illustrates loading and saving scenes from files
44
fn main() {
@@ -10,6 +10,7 @@ fn main() {
1010
.add_startup_system(load_scene_system.system())
1111
.add_startup_system(infotext_system.system())
1212
.add_system(log_system.system())
13+
.add_system(scene_spawned_listener.system())
1314
.run();
1415
}
1516

@@ -121,3 +122,9 @@ fn infotext_system(mut commands: Commands, asset_server: Res<AssetServer>) {
121122
..Default::default()
122123
});
123124
}
125+
126+
fn scene_spawned_listener(mut events: EventReader<SceneSpawnedEvent>) {
127+
for event in events.iter() {
128+
info!("{:?}", event);
129+
}
130+
}

0 commit comments

Comments
 (0)