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