Skip to content

Commit 05b79c2

Browse files
Fix scene_spawn in template (#42)
1 parent 8ee8f16 commit 05b79c2

File tree

2 files changed

+37
-23
lines changed

2 files changed

+37
-23
lines changed

crates/bevy_scene2/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ pub struct ScenePlugin;
3232
impl Plugin for ScenePlugin {
3333
fn build(&self, app: &mut App) {
3434
app.init_resource::<QueuedScenes>()
35+
.init_resource::<NewScenes>()
3536
.init_asset::<ScenePatch>()
36-
.add_systems(Update, (resolve_scene_patches, spawn_queued).chain());
37+
.add_systems(Update, (resolve_scene_patches, spawn_queued).chain())
38+
.add_observer(on_add_scene_patch_instance);
3739
}
3840
}
3941

crates/bevy_scene2/src/spawn.rs

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
6577
pub 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

Comments
 (0)