Skip to content

Commit e42ef6c

Browse files
authored
Merge branch 'main' into primitive-helpers
2 parents e03488b + 12a11e2 commit e42ef6c

File tree

155 files changed

+1319
-897
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

155 files changed

+1319
-897
lines changed

crates/bevy_app/src/app.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ impl App {
418418
self
419419
}
420420

421-
/// Configures a collection of system sets in the default schedule, adding any sets that do not exist.
421+
/// Configures a collection of system sets in the provided schedule, adding any sets that do not exist.
422422
#[track_caller]
423423
pub fn configure_sets(
424424
&mut self,

crates/bevy_asset/src/server/info.rs

Lines changed: 52 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,35 @@ impl AssetInfos {
554554
}
555555
}
556556

557+
fn remove_dependants_and_labels(
558+
info: &AssetInfo,
559+
loader_dependants: &mut HashMap<AssetPath<'static>, HashSet<AssetPath<'static>>>,
560+
path: &AssetPath<'static>,
561+
living_labeled_assets: &mut HashMap<AssetPath<'static>, HashSet<String>>,
562+
) {
563+
for loader_dependency in info.loader_dependencies.keys() {
564+
if let Some(dependants) = loader_dependants.get_mut(loader_dependency) {
565+
dependants.remove(path);
566+
}
567+
}
568+
569+
let Some(label) = path.label() else {
570+
return;
571+
};
572+
573+
let mut without_label = path.to_owned();
574+
without_label.remove_label();
575+
576+
let Entry::Occupied(mut entry) = living_labeled_assets.entry(without_label) else {
577+
return;
578+
};
579+
580+
entry.get_mut().remove(label);
581+
if entry.get().is_empty() {
582+
entry.remove();
583+
}
584+
}
585+
557586
fn process_handle_drop_internal(
558587
infos: &mut HashMap<UntypedAssetId, AssetInfo>,
559588
path_to_id: &mut HashMap<AssetPath<'static>, UntypedAssetId>,
@@ -562,44 +591,32 @@ impl AssetInfos {
562591
watching_for_changes: bool,
563592
id: UntypedAssetId,
564593
) -> bool {
565-
match infos.entry(id) {
566-
Entry::Occupied(mut entry) => {
567-
if entry.get_mut().handle_drops_to_skip > 0 {
568-
entry.get_mut().handle_drops_to_skip -= 1;
569-
false
570-
} else {
571-
let info = entry.remove();
572-
if let Some(path) = info.path {
573-
if watching_for_changes {
574-
for loader_dependency in info.loader_dependencies.keys() {
575-
if let Some(dependants) =
576-
loader_dependants.get_mut(loader_dependency)
577-
{
578-
dependants.remove(&path);
579-
}
580-
}
581-
if let Some(label) = path.label() {
582-
let mut without_label = path.to_owned();
583-
without_label.remove_label();
584-
if let Entry::Occupied(mut entry) =
585-
living_labeled_assets.entry(without_label)
586-
{
587-
entry.get_mut().remove(label);
588-
if entry.get().is_empty() {
589-
entry.remove();
590-
}
591-
};
592-
}
593-
}
594-
path_to_id.remove(&path);
595-
}
596-
true
597-
}
598-
}
594+
let Entry::Occupied(mut entry) = infos.entry(id) else {
599595
// Either the asset was already dropped, it doesn't exist, or it isn't managed by the asset server
600596
// None of these cases should result in a removal from the Assets collection
601-
Entry::Vacant(_) => false,
597+
return false;
598+
};
599+
600+
if entry.get_mut().handle_drops_to_skip > 0 {
601+
entry.get_mut().handle_drops_to_skip -= 1;
602+
return false;
602603
}
604+
605+
let info = entry.remove();
606+
let Some(path) = &info.path else {
607+
return true;
608+
};
609+
610+
if watching_for_changes {
611+
Self::remove_dependants_and_labels(
612+
&info,
613+
loader_dependants,
614+
path,
615+
living_labeled_assets,
616+
);
617+
}
618+
path_to_id.remove(path);
619+
true
603620
}
604621

605622
/// Consumes all current handle drop events. This will update information in [`AssetInfos`], but it
@@ -625,7 +642,6 @@ impl AssetInfos {
625642
}
626643
}
627644
}
628-
629645
/// Determines how a handle should be initialized
630646
#[derive(Copy, Clone, PartialEq, Eq)]
631647
pub(crate) enum HandleLoadingMode {

crates/bevy_audio/src/audio_output.rs

Lines changed: 106 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -122,116 +122,119 @@ pub(crate) fn play_queued_audio_system<Source: Asset + Decodable>(
122122
};
123123

124124
for (entity, source_handle, settings, maybe_emitter_transform) in &query_nonplaying {
125-
if let Some(audio_source) = audio_sources.get(source_handle) {
126-
// audio data is available (has loaded), begin playback and insert sink component
127-
if settings.spatial {
128-
let (left_ear, right_ear) = ear_positions.get();
125+
let Some(audio_source) = audio_sources.get(source_handle) else {
126+
continue;
127+
};
128+
// audio data is available (has loaded), begin playback and insert sink component
129+
if settings.spatial {
130+
let (left_ear, right_ear) = ear_positions.get();
129131

130-
// We can only use one `SpatialListener`. If there are more than that, then
131-
// the user may have made a mistake.
132-
if ear_positions.multiple_listeners() {
133-
warn!(
134-
"Multiple SpatialListeners found. Using {:?}.",
135-
ear_positions.query.iter().next().unwrap().0
136-
);
132+
// We can only use one `SpatialListener`. If there are more than that, then
133+
// the user may have made a mistake.
134+
if ear_positions.multiple_listeners() {
135+
warn!(
136+
"Multiple SpatialListeners found. Using {:?}.",
137+
ear_positions.query.iter().next().unwrap().0
138+
);
139+
}
140+
141+
let emitter_translation = if let Some(emitter_transform) = maybe_emitter_transform {
142+
(emitter_transform.translation() * ear_positions.scale.0).into()
143+
} else {
144+
warn!("Spatial AudioBundle with no GlobalTransform component. Using zero.");
145+
Vec3::ZERO.into()
146+
};
147+
148+
let sink = match SpatialSink::try_new(
149+
stream_handle,
150+
emitter_translation,
151+
left_ear.into(),
152+
right_ear.into(),
153+
) {
154+
Ok(sink) => sink,
155+
Err(err) => {
156+
warn!("Error creating spatial sink: {err:?}");
157+
continue;
137158
}
159+
};
160+
161+
sink.set_speed(settings.speed);
162+
match settings.volume {
163+
Volume::Relative(vol) => sink.set_volume(vol.0 * global_volume.volume.0),
164+
Volume::Absolute(vol) => sink.set_volume(vol.0),
165+
}
138166

139-
let emitter_translation = maybe_emitter_transform
140-
.map(|t| (t.translation() * ear_positions.scale.0).into())
141-
.unwrap_or_else(|| {
142-
warn!("Spatial AudioBundle with no GlobalTransform component. Using zero.");
143-
Vec3::ZERO.into()
144-
});
167+
if settings.paused {
168+
sink.pause();
169+
}
145170

146-
match SpatialSink::try_new(
147-
stream_handle,
148-
emitter_translation,
149-
left_ear.into(),
150-
right_ear.into(),
151-
) {
152-
Ok(sink) => {
153-
sink.set_speed(settings.speed);
154-
match settings.volume {
155-
Volume::Relative(vol) => {
156-
sink.set_volume(vol.0 * global_volume.volume.0);
157-
}
158-
Volume::Absolute(vol) => sink.set_volume(vol.0),
159-
}
160-
if settings.paused {
161-
sink.pause();
162-
}
163-
match settings.mode {
164-
PlaybackMode::Loop => {
165-
sink.append(audio_source.decoder().repeat_infinite());
166-
commands.entity(entity).insert(SpatialAudioSink { sink });
167-
}
168-
PlaybackMode::Once => {
169-
sink.append(audio_source.decoder());
170-
commands.entity(entity).insert(SpatialAudioSink { sink });
171-
}
172-
PlaybackMode::Despawn => {
173-
sink.append(audio_source.decoder());
174-
commands
175-
.entity(entity)
176-
// PERF: insert as bundle to reduce archetype moves
177-
.insert((SpatialAudioSink { sink }, PlaybackDespawnMarker));
178-
}
179-
PlaybackMode::Remove => {
180-
sink.append(audio_source.decoder());
181-
commands
182-
.entity(entity)
183-
// PERF: insert as bundle to reduce archetype moves
184-
.insert((SpatialAudioSink { sink }, PlaybackRemoveMarker));
185-
}
186-
};
187-
}
188-
Err(err) => {
189-
warn!("Error playing spatial sound: {err:?}");
190-
}
171+
match settings.mode {
172+
PlaybackMode::Loop => {
173+
sink.append(audio_source.decoder().repeat_infinite());
174+
commands.entity(entity).insert(SpatialAudioSink { sink });
191175
}
192-
} else {
193-
match Sink::try_new(stream_handle) {
194-
Ok(sink) => {
195-
sink.set_speed(settings.speed);
196-
match settings.volume {
197-
Volume::Relative(vol) => {
198-
sink.set_volume(vol.0 * global_volume.volume.0);
199-
}
200-
Volume::Absolute(vol) => sink.set_volume(vol.0),
201-
}
202-
if settings.paused {
203-
sink.pause();
204-
}
205-
match settings.mode {
206-
PlaybackMode::Loop => {
207-
sink.append(audio_source.decoder().repeat_infinite());
208-
commands.entity(entity).insert(AudioSink { sink });
209-
}
210-
PlaybackMode::Once => {
211-
sink.append(audio_source.decoder());
212-
commands.entity(entity).insert(AudioSink { sink });
213-
}
214-
PlaybackMode::Despawn => {
215-
sink.append(audio_source.decoder());
216-
commands
217-
.entity(entity)
218-
// PERF: insert as bundle to reduce archetype moves
219-
.insert((AudioSink { sink }, PlaybackDespawnMarker));
220-
}
221-
PlaybackMode::Remove => {
222-
sink.append(audio_source.decoder());
223-
commands
224-
.entity(entity)
225-
// PERF: insert as bundle to reduce archetype moves
226-
.insert((AudioSink { sink }, PlaybackRemoveMarker));
227-
}
228-
};
229-
}
230-
Err(err) => {
231-
warn!("Error playing sound: {err:?}");
232-
}
176+
PlaybackMode::Once => {
177+
sink.append(audio_source.decoder());
178+
commands.entity(entity).insert(SpatialAudioSink { sink });
179+
}
180+
PlaybackMode::Despawn => {
181+
sink.append(audio_source.decoder());
182+
commands
183+
.entity(entity)
184+
// PERF: insert as bundle to reduce archetype moves
185+
.insert((SpatialAudioSink { sink }, PlaybackDespawnMarker));
186+
}
187+
PlaybackMode::Remove => {
188+
sink.append(audio_source.decoder());
189+
commands
190+
.entity(entity)
191+
// PERF: insert as bundle to reduce archetype moves
192+
.insert((SpatialAudioSink { sink }, PlaybackRemoveMarker));
233193
}
194+
};
195+
} else {
196+
let sink = match Sink::try_new(stream_handle) {
197+
Ok(sink) => sink,
198+
Err(err) => {
199+
warn!("Error creating sink: {err:?}");
200+
continue;
201+
}
202+
};
203+
204+
sink.set_speed(settings.speed);
205+
match settings.volume {
206+
Volume::Relative(vol) => sink.set_volume(vol.0 * global_volume.volume.0),
207+
Volume::Absolute(vol) => sink.set_volume(vol.0),
208+
}
209+
210+
if settings.paused {
211+
sink.pause();
234212
}
213+
214+
match settings.mode {
215+
PlaybackMode::Loop => {
216+
sink.append(audio_source.decoder().repeat_infinite());
217+
commands.entity(entity).insert(AudioSink { sink });
218+
}
219+
PlaybackMode::Once => {
220+
sink.append(audio_source.decoder());
221+
commands.entity(entity).insert(AudioSink { sink });
222+
}
223+
PlaybackMode::Despawn => {
224+
sink.append(audio_source.decoder());
225+
commands
226+
.entity(entity)
227+
// PERF: insert as bundle to reduce archetype moves
228+
.insert((AudioSink { sink }, PlaybackDespawnMarker));
229+
}
230+
PlaybackMode::Remove => {
231+
sink.append(audio_source.decoder());
232+
commands
233+
.entity(entity)
234+
// PERF: insert as bundle to reduce archetype moves
235+
.insert((AudioSink { sink }, PlaybackRemoveMarker));
236+
}
237+
};
235238
}
236239
}
237240
}

crates/bevy_audio/src/lib.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ impl Plugin for AudioPlugin {
8787
.run_if(audio_output_available)
8888
.after(TransformSystem::TransformPropagate), // For spatial audio transforms
8989
)
90+
.add_systems(
91+
PostUpdate,
92+
(update_emitter_positions, update_listener_positions).in_set(AudioPlaySet),
93+
)
9094
.init_resource::<AudioOutput>();
9195

9296
#[cfg(any(feature = "mp3", feature = "flac", feature = "wav", feature = "vorbis"))]
@@ -107,11 +111,8 @@ impl AddAudioSource for App {
107111
{
108112
self.init_asset::<T>().add_systems(
109113
PostUpdate,
110-
play_queued_audio_system::<T>.in_set(AudioPlaySet),
114+
(play_queued_audio_system::<T>, cleanup_finished_audio::<T>).in_set(AudioPlaySet),
111115
);
112-
self.add_systems(PostUpdate, cleanup_finished_audio::<T>.in_set(AudioPlaySet));
113-
self.add_systems(PostUpdate, update_emitter_positions.in_set(AudioPlaySet));
114-
self.add_systems(PostUpdate, update_listener_positions.in_set(AudioPlaySet));
115116
self
116117
}
117118
}

crates/bevy_core/src/name.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use bevy_ecs::query::WorldQueryData;
1+
use bevy_ecs::query::QueryData;
22
use bevy_ecs::{component::Component, entity::Entity, reflect::ReflectComponent};
33

44
use bevy_reflect::std_traits::ReflectDefault;
@@ -102,7 +102,7 @@ impl std::fmt::Debug for Name {
102102
/// }
103103
/// # bevy_ecs::system::assert_is_system(increment_score);
104104
/// ```
105-
#[derive(WorldQueryData)]
105+
#[derive(QueryData)]
106106
pub struct DebugName {
107107
/// A [`Name`] that the entity might have that is displayed if available.
108108
pub name: Option<&'static Name>,

0 commit comments

Comments
 (0)