@@ -33,7 +33,7 @@ pub struct SceneSpawner {
33
33
spawned_dynamic_scenes : HashMap < Handle < DynamicScene > , Vec < InstanceId > > ,
34
34
spawned_instances : HashMap < InstanceId , InstanceInfo > ,
35
35
scene_asset_event_reader : ManualEventReader < AssetEvent < DynamicScene > > ,
36
- dynamic_scenes_to_spawn : Vec < Handle < DynamicScene > > ,
36
+ dynamic_scenes_to_spawn : Vec < ( Handle < DynamicScene > , InstanceId ) > ,
37
37
scenes_to_spawn : Vec < ( Handle < Scene > , InstanceId ) > ,
38
38
scenes_to_despawn : Vec < Handle < DynamicScene > > ,
39
39
instances_to_despawn : Vec < InstanceId > ,
@@ -54,7 +54,21 @@ pub enum SceneSpawnError {
54
54
55
55
impl SceneSpawner {
56
56
pub fn spawn_dynamic ( & mut self , scene_handle : Handle < DynamicScene > ) {
57
- self . dynamic_scenes_to_spawn . push ( scene_handle) ;
57
+ let instance_id = InstanceId :: new ( ) ;
58
+ self . dynamic_scenes_to_spawn
59
+ . push ( ( scene_handle, instance_id) ) ;
60
+ }
61
+
62
+ pub fn spawn_dynamic_as_child (
63
+ & mut self ,
64
+ scene_handle : Handle < DynamicScene > ,
65
+ parent : Entity ,
66
+ ) -> InstanceId {
67
+ let instance_id = InstanceId :: new ( ) ;
68
+ self . dynamic_scenes_to_spawn
69
+ . push ( ( scene_handle, instance_id) ) ;
70
+ self . scenes_with_parent . push ( ( instance_id, parent) ) ;
71
+ instance_id
58
72
}
59
73
60
74
pub fn spawn ( & mut self , scene_handle : Handle < Scene > ) -> InstanceId {
@@ -258,12 +272,22 @@ impl SceneSpawner {
258
272
pub fn spawn_queued_scenes ( & mut self , world : & mut World ) -> Result < ( ) , SceneSpawnError > {
259
273
let scenes_to_spawn = std:: mem:: take ( & mut self . dynamic_scenes_to_spawn ) ;
260
274
261
- for scene_handle in scenes_to_spawn {
262
- match self . spawn_dynamic_sync ( world, & scene_handle) {
263
- Ok ( _) => { }
264
- Err ( SceneSpawnError :: NonExistentScene { .. } ) => {
265
- self . dynamic_scenes_to_spawn . push ( scene_handle)
275
+ for ( scene_handle, instance_id) in scenes_to_spawn {
276
+ let mut entity_map = EntityMap :: default ( ) ;
277
+
278
+ match Self :: spawn_dynamic_internal ( world, & scene_handle, & mut entity_map) {
279
+ Ok ( _) => {
280
+ self . spawned_instances
281
+ . insert ( instance_id, InstanceInfo { entity_map } ) ;
282
+ let spawned = self
283
+ . spawned_dynamic_scenes
284
+ . entry ( scene_handle. clone ( ) )
285
+ . or_insert_with ( Vec :: new) ;
286
+ spawned. push ( instance_id) ;
266
287
}
288
+ Err ( SceneSpawnError :: NonExistentScene { .. } ) => self
289
+ . dynamic_scenes_to_spawn
290
+ . push ( ( scene_handle, instance_id) ) ,
267
291
Err ( err) => return Err ( err) ,
268
292
}
269
293
}
0 commit comments