@@ -62,39 +62,51 @@ pub struct QueuedScenes {
6262 waiting_entities : HashMap < AssetId < ScenePatch > , Vec < Entity > > ,
6363}
6464
65+ #[ derive( Resource , Default ) ]
66+ pub struct NewScenes {
67+ entities : Vec < Entity > ,
68+ }
69+
70+ pub fn on_add_scene_patch_instance (
71+ trigger : On < Add , ScenePatchInstance > ,
72+ mut new_scenes : ResMut < NewScenes > ,
73+ ) {
74+ new_scenes. entities . push ( trigger. target ( ) ) ;
75+ }
76+
6577pub fn spawn_queued (
6678 world : & mut World ,
67- handles : & mut QueryState < ( Entity , & ScenePatchInstance ) , Added < ScenePatchInstance > > ,
79+ handles : & mut QueryState < & ScenePatchInstance > ,
6880 mut reader : Local < EventCursor < AssetEvent < ScenePatch > > > ,
6981) {
7082 world. resource_scope ( |world, mut patches : Mut < Assets < ScenePatch > > | {
7183 world. resource_scope ( |world, mut queued : Mut < QueuedScenes > | {
7284 world. resource_scope ( |world, events : Mut < Events < AssetEvent < ScenePatch > > > | {
73- for ( entity, id) in handles
74- . iter ( world)
75- . map ( |( e, h) | ( e, h. id ( ) ) )
76- . collect :: < Vec < _ > > ( )
77- {
78- if let Some ( scene) = patches. get_mut ( id) . and_then ( |p| p. resolved . as_mut ( ) ) {
79- let mut entity_mut = world. get_entity_mut ( entity) . unwrap ( ) ;
80- scene. spawn ( & mut entity_mut) . unwrap ( ) ;
81- } else {
82- let entities = queued. waiting_entities . entry ( id) . or_default ( ) ;
83- entities. push ( entity) ;
85+ loop {
86+ let mut new_scenes = world. resource_mut :: < NewScenes > ( ) ;
87+ if new_scenes. entities . is_empty ( ) {
88+ break ;
89+ }
90+ for entity in core:: mem:: take ( & mut new_scenes. entities ) {
91+ if let Ok ( id) = handles. get ( world, entity) . map ( |h| h. id ( ) ) {
92+ if let Some ( scene) =
93+ patches. get_mut ( id) . and_then ( |p| p. resolved . as_mut ( ) )
94+ {
95+ let mut entity_mut = world. get_entity_mut ( entity) . unwrap ( ) ;
96+ scene. spawn ( & mut entity_mut) . unwrap ( ) ;
97+ } else {
98+ let entities = queued. waiting_entities . entry ( id) . or_default ( ) ;
99+ entities. push ( entity) ;
100+ }
101+ }
84102 }
85103 }
86104
87105 for event in reader. read ( & events) {
88- if let AssetEvent :: LoadedWithDependencies { id } = event {
89- let Some ( scene) = patches. get_mut ( * id) . and_then ( |p| p. resolved . as_mut ( ) )
90- else {
91- continue ;
92- } ;
93-
94- let Some ( entities) = queued. waiting_entities . remove ( id) else {
95- continue ;
96- } ;
97-
106+ if let AssetEvent :: LoadedWithDependencies { id } = event
107+ && let Some ( scene) = patches. get_mut ( * id) . and_then ( |p| p. resolved . as_mut ( ) )
108+ && let Some ( entities) = queued. waiting_entities . remove ( id)
109+ {
98110 for entity in entities {
99111 if let Ok ( mut entity_mut) = world. get_entity_mut ( entity) {
100112 scene. spawn ( & mut entity_mut) . unwrap ( ) ;
0 commit comments