@@ -26,6 +26,11 @@ impl InstanceId {
26
26
}
27
27
}
28
28
29
+ #[ derive( Debug ) ]
30
+ pub struct SceneSpawnedEvent {
31
+ pub instance_id : InstanceId ,
32
+ }
33
+
29
34
#[ derive( Default ) ]
30
35
pub struct SceneSpawner {
31
36
spawned_scenes : HashMap < Handle < Scene > , Vec < InstanceId > > ,
@@ -96,7 +101,7 @@ impl SceneSpawner {
96
101
& mut self ,
97
102
world : & mut World ,
98
103
scene_handle : & Handle < DynamicScene > ,
99
- ) -> Result < ( ) , SceneSpawnError > {
104
+ ) -> Result < InstanceId , SceneSpawnError > {
100
105
let mut entity_map = EntityMap :: default ( ) ;
101
106
Self :: spawn_dynamic_internal ( world, scene_handle, & mut entity_map) ?;
102
107
let instance_id = InstanceId :: new ( ) ;
@@ -107,7 +112,7 @@ impl SceneSpawner {
107
112
. entry ( scene_handle. clone ( ) )
108
113
. or_insert_with ( Vec :: new) ;
109
114
spawned. push ( instance_id) ;
110
- Ok ( ( ) )
115
+ Ok ( instance_id )
111
116
}
112
117
113
118
fn spawn_dynamic_internal (
@@ -235,31 +240,39 @@ impl SceneSpawner {
235
240
}
236
241
237
242
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
+ }
245
257
}
246
- Err ( err) => return Err ( err) ,
247
- }
248
- }
249
258
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 ) ;
251
260
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
+ }
257
271
}
258
- Err ( err) => return Err ( err) ,
259
- }
260
- }
261
272
262
- Ok ( ( ) )
273
+ Ok ( ( ) )
274
+ } ,
275
+ )
263
276
}
264
277
265
278
pub ( crate ) fn set_scene_instance_parent_sync ( & mut self , world : & mut World ) {
0 commit comments