Skip to content

Commit 61b98ec

Browse files
authored
Rename trigger.entity() to trigger.target() (bevyengine#16716)
# Objective - A `Trigger` has multiple associated `Entity`s - the entity observing the event, and the entity that was targeted by the event. - The field `entity: Entity` encodes no semantic information about what the entity is used for, you can already tell that it's an `Entity` by the type signature! ## Solution - Rename `trigger.entity()` to `trigger.target()` --- ## Changelog - `Trigger`s are associated with multiple entities. `Trigger::entity()` has been renamed to `Trigger::target()` to reflect the semantics of the entity being returned. ## Migration Guide - Rename `Trigger::entity()` to `Trigger::target()`. - Rename `ObserverTrigger::entity` to `ObserverTrigger::target`
1 parent 1d3950a commit 61b98ec

File tree

19 files changed

+73
-60
lines changed

19 files changed

+73
-60
lines changed

crates/bevy_ecs/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,8 +340,8 @@ let mut world = World::new();
340340
let entity = world.spawn_empty().id();
341341

342342
world.add_observer(|trigger: Trigger<Explode>, mut commands: Commands| {
343-
println!("Entity {:?} goes BOOM!", trigger.entity());
344-
commands.entity(trigger.entity()).despawn();
343+
println!("Entity {:?} goes BOOM!", trigger.target());
344+
commands.entity(trigger.target()).despawn();
345345
});
346346

347347
world.flush();

crates/bevy_ecs/src/observer/mod.rs

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,22 @@ impl<'w, E, B: Bundle> Trigger<'w, E, B> {
6767
Ptr::from(&self.event)
6868
}
6969

70-
/// Returns the [`Entity`] that triggered the observer, could be [`Entity::PLACEHOLDER`].
71-
pub fn entity(&self) -> Entity {
72-
self.trigger.entity
70+
/// Returns the [`Entity`] that was targeted by the `event` that triggered this observer. It may
71+
/// be [`Entity::PLACEHOLDER`].
72+
///
73+
/// Observable events can target specific entities. When those events fire, they will trigger
74+
/// any observers on the targeted entities. In this case, the `target()` and `observer()` are
75+
/// the same, because the observer that was triggered is attached to the entity that was
76+
/// targeted by the event.
77+
///
78+
/// However, it is also possible for those events to bubble up the entity hierarchy and trigger
79+
/// observers on *different* entities, or trigger a global observer. In these cases, the
80+
/// observing entity is *different* from the entity being targeted by the event.
81+
///
82+
/// This is an important distinction: the entity reacting to an event is not always the same as
83+
/// the entity triggered by the event.
84+
pub fn target(&self) -> Entity {
85+
self.trigger.target
7386
}
7487

7588
/// Returns the components that triggered the observer, out of the
@@ -207,7 +220,7 @@ pub struct ObserverTrigger {
207220
/// The [`ComponentId`]s the trigger targeted.
208221
components: SmallVec<[ComponentId; 2]>,
209222
/// The entity the trigger targeted.
210-
pub entity: Entity,
223+
pub target: Entity,
211224
}
212225

213226
impl ObserverTrigger {
@@ -277,7 +290,7 @@ impl Observers {
277290
pub(crate) fn invoke<T>(
278291
mut world: DeferredWorld,
279292
event_type: ComponentId,
280-
entity: Entity,
293+
target: Entity,
281294
components: impl Iterator<Item = ComponentId> + Clone,
282295
data: &mut T,
283296
propagate: &mut bool,
@@ -304,7 +317,7 @@ impl Observers {
304317
observer,
305318
event_type,
306319
components: components.clone().collect(),
307-
entity,
320+
target,
308321
},
309322
data.into(),
310323
propagate,
@@ -314,8 +327,8 @@ impl Observers {
314327
observers.map.iter().for_each(&mut trigger_observer);
315328

316329
// Trigger entity observers listening for this kind of trigger
317-
if entity != Entity::PLACEHOLDER {
318-
if let Some(map) = observers.entity_observers.get(&entity) {
330+
if target != Entity::PLACEHOLDER {
331+
if let Some(map) = observers.entity_observers.get(&target) {
319332
map.iter().for_each(&mut trigger_observer);
320333
}
321334
}
@@ -328,8 +341,8 @@ impl Observers {
328341
.iter()
329342
.for_each(&mut trigger_observer);
330343

331-
if entity != Entity::PLACEHOLDER {
332-
if let Some(map) = component_observers.entity_map.get(&entity) {
344+
if target != Entity::PLACEHOLDER {
345+
if let Some(map) = component_observers.entity_map.get(&target) {
333346
map.iter().for_each(&mut trigger_observer);
334347
}
335348
}
@@ -733,20 +746,20 @@ mod tests {
733746
world.add_observer(
734747
|obs: Trigger<OnAdd, A>, mut res: ResMut<Order>, mut commands: Commands| {
735748
res.observed("add_a");
736-
commands.entity(obs.entity()).insert(B);
749+
commands.entity(obs.target()).insert(B);
737750
},
738751
);
739752
world.add_observer(
740753
|obs: Trigger<OnRemove, A>, mut res: ResMut<Order>, mut commands: Commands| {
741754
res.observed("remove_a");
742-
commands.entity(obs.entity()).remove::<B>();
755+
commands.entity(obs.target()).remove::<B>();
743756
},
744757
);
745758

746759
world.add_observer(
747760
|obs: Trigger<OnAdd, B>, mut res: ResMut<Order>, mut commands: Commands| {
748761
res.observed("add_b");
749-
commands.entity(obs.entity()).remove::<A>();
762+
commands.entity(obs.target()).remove::<A>();
750763
},
751764
);
752765
world.add_observer(|_: Trigger<OnRemove, B>, mut res: ResMut<Order>| {
@@ -915,7 +928,7 @@ mod tests {
915928
.spawn_empty()
916929
.observe(|_: Trigger<EventA>| panic!("Trigger routed to non-targeted entity."));
917930
world.add_observer(move |obs: Trigger<EventA>, mut res: ResMut<Order>| {
918-
assert_eq!(obs.entity(), Entity::PLACEHOLDER);
931+
assert_eq!(obs.target(), Entity::PLACEHOLDER);
919932
res.observed("event_a");
920933
});
921934

@@ -940,7 +953,7 @@ mod tests {
940953
.observe(|_: Trigger<EventA>, mut res: ResMut<Order>| res.observed("a_1"))
941954
.id();
942955
world.add_observer(move |obs: Trigger<EventA>, mut res: ResMut<Order>| {
943-
assert_eq!(obs.entity(), entity);
956+
assert_eq!(obs.target(), entity);
944957
res.observed("a_2");
945958
});
946959

@@ -1247,7 +1260,7 @@ mod tests {
12471260

12481261
world.add_observer(
12491262
|trigger: Trigger<EventPropagating>, query: Query<&A>, mut res: ResMut<Order>| {
1250-
if query.get(trigger.entity()).is_ok() {
1263+
if query.get(trigger.target()).is_ok() {
12511264
res.observed("event");
12521265
}
12531266
},

crates/bevy_ecs/src/observer/runner.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,8 @@ pub type ObserverRunner = fn(DeferredWorld, ObserverTrigger, PtrMut, propagate:
197197
/// struct Explode;
198198
///
199199
/// world.add_observer(|trigger: Trigger<Explode>, mut commands: Commands| {
200-
/// println!("Entity {:?} goes BOOM!", trigger.entity());
201-
/// commands.entity(trigger.entity()).despawn();
200+
/// println!("Entity {:?} goes BOOM!", trigger.target());
201+
/// commands.entity(trigger.target()).despawn();
202202
/// });
203203
///
204204
/// world.flush();
@@ -231,7 +231,7 @@ pub type ObserverRunner = fn(DeferredWorld, ObserverTrigger, PtrMut, propagate:
231231
/// # struct Explode;
232232
/// world.entity_mut(e1).observe(|trigger: Trigger<Explode>, mut commands: Commands| {
233233
/// println!("Boom!");
234-
/// commands.entity(trigger.entity()).despawn();
234+
/// commands.entity(trigger.target()).despawn();
235235
/// });
236236
///
237237
/// world.entity_mut(e2).observe(|trigger: Trigger<Explode>, mut commands: Commands| {

crates/bevy_ecs/src/world/deferred_world.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -508,13 +508,13 @@ impl<'w> DeferredWorld<'w> {
508508
pub(crate) unsafe fn trigger_observers(
509509
&mut self,
510510
event: ComponentId,
511-
entity: Entity,
511+
target: Entity,
512512
components: impl Iterator<Item = ComponentId> + Clone,
513513
) {
514514
Observers::invoke::<_>(
515515
self.reborrow(),
516516
event,
517-
entity,
517+
target,
518518
components,
519519
&mut (),
520520
&mut false,
@@ -529,7 +529,7 @@ impl<'w> DeferredWorld<'w> {
529529
pub(crate) unsafe fn trigger_observers_with_data<E, T>(
530530
&mut self,
531531
event: ComponentId,
532-
mut entity: Entity,
532+
mut target: Entity,
533533
components: &[ComponentId],
534534
data: &mut E,
535535
mut propagate: bool,
@@ -540,7 +540,7 @@ impl<'w> DeferredWorld<'w> {
540540
Observers::invoke::<_>(
541541
self.reborrow(),
542542
event,
543-
entity,
543+
target,
544544
components.iter().copied(),
545545
data,
546546
&mut propagate,
@@ -549,12 +549,12 @@ impl<'w> DeferredWorld<'w> {
549549
break;
550550
}
551551
if let Some(traverse_to) = self
552-
.get_entity(entity)
552+
.get_entity(target)
553553
.ok()
554554
.and_then(|entity| entity.get_components::<T>())
555555
.and_then(|item| T::traverse(item, data))
556556
{
557-
entity = traverse_to;
557+
target = traverse_to;
558558
} else {
559559
break;
560560
}

crates/bevy_ecs/src/world/entity_ref.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4703,7 +4703,7 @@ mod tests {
47034703
let entity = world
47044704
.spawn_empty()
47054705
.observe(|trigger: Trigger<TestEvent>, mut commands: Commands| {
4706-
commands.entity(trigger.entity()).insert(TestComponent(0));
4706+
commands.entity(trigger.target()).insert(TestComponent(0));
47074707
})
47084708
.id();
47094709

@@ -4725,7 +4725,7 @@ mod tests {
47254725
let mut world = World::new();
47264726
world.add_observer(
47274727
|trigger: Trigger<OnAdd, TestComponent>, mut commands: Commands| {
4728-
commands.entity(trigger.entity()).despawn();
4728+
commands.entity(trigger.target()).despawn();
47294729
},
47304730
);
47314731
let entity = world.spawn_empty().id();

crates/bevy_pbr/src/render/light.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ pub(crate) fn add_light_view_entities(
496496
trigger: Trigger<OnAdd, (ExtractedDirectionalLight, ExtractedPointLight)>,
497497
mut commands: Commands,
498498
) {
499-
if let Some(mut v) = commands.get_entity(trigger.entity()) {
499+
if let Some(mut v) = commands.get_entity(trigger.target()) {
500500
v.insert(LightViewEntities::default());
501501
}
502502
}
@@ -506,7 +506,7 @@ pub(crate) fn extracted_light_removed(
506506
trigger: Trigger<OnRemove, (ExtractedDirectionalLight, ExtractedPointLight)>,
507507
mut commands: Commands,
508508
) {
509-
if let Some(mut v) = commands.get_entity(trigger.entity()) {
509+
if let Some(mut v) = commands.get_entity(trigger.target()) {
510510
v.remove::<LightViewEntities>();
511511
}
512512
}
@@ -516,7 +516,7 @@ pub(crate) fn remove_light_view_entities(
516516
query: Query<&LightViewEntities>,
517517
mut commands: Commands,
518518
) {
519-
if let Ok(entities) = query.get(trigger.entity()) {
519+
if let Ok(entities) = query.get(trigger.target()) {
520520
for v in entities.0.values() {
521521
for e in v.iter().copied() {
522522
if let Some(mut v) = commands.get_entity(e) {

crates/bevy_picking/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@
4949
//! // Spawn your entity here, e.g. a Mesh.
5050
//! // When dragged, mutate the `Transform` component on the dragged target entity:
5151
//! .observe(|trigger: Trigger<Pointer<Drag>>, mut transforms: Query<&mut Transform>| {
52-
//! let mut transform = transforms.get_mut(trigger.entity()).unwrap();
52+
//! let mut transform = transforms.get_mut(trigger.target()).unwrap();
5353
//! let drag = trigger.event();
5454
//! transform.rotate_local_y(drag.delta.x / 50.0);
5555
//! })
5656
//! .observe(|trigger: Trigger<Pointer<Click>>, mut commands: Commands| {
57-
//! println!("Entity {:?} goes BOOM!", trigger.entity());
58-
//! commands.entity(trigger.entity()).despawn();
57+
//! println!("Entity {:?} goes BOOM!", trigger.target());
58+
//! commands.entity(trigger.target()).despawn();
5959
//! })
6060
//! .observe(|trigger: Trigger<Pointer<Over>>, mut events: EventWriter<Greeting>| {
6161
//! events.send(Greeting);

crates/bevy_render/src/sync_world.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ impl Plugin for SyncWorldPlugin {
9393
app.init_resource::<PendingSyncEntity>();
9494
app.add_observer(
9595
|trigger: Trigger<OnAdd, SyncToRenderWorld>, mut pending: ResMut<PendingSyncEntity>| {
96-
pending.push(EntityRecord::Added(trigger.entity()));
96+
pending.push(EntityRecord::Added(trigger.target()));
9797
},
9898
);
9999
app.add_observer(
100100
|trigger: Trigger<OnRemove, SyncToRenderWorld>,
101101
mut pending: ResMut<PendingSyncEntity>,
102102
query: Query<&RenderEntity>| {
103-
if let Ok(e) = query.get(trigger.entity()) {
103+
if let Ok(e) = query.get(trigger.target()) {
104104
pending.push(EntityRecord::Removed(*e));
105105
};
106106
},
@@ -487,14 +487,14 @@ mod tests {
487487

488488
main_world.add_observer(
489489
|trigger: Trigger<OnAdd, SyncToRenderWorld>, mut pending: ResMut<PendingSyncEntity>| {
490-
pending.push(EntityRecord::Added(trigger.entity()));
490+
pending.push(EntityRecord::Added(trigger.target()));
491491
},
492492
);
493493
main_world.add_observer(
494494
|trigger: Trigger<OnRemove, SyncToRenderWorld>,
495495
mut pending: ResMut<PendingSyncEntity>,
496496
query: Query<&RenderEntity>| {
497-
if let Ok(e) = query.get(trigger.entity()) {
497+
if let Ok(e) = query.get(trigger.target()) {
498498
pending.push(EntityRecord::Removed(*e));
499499
};
500500
},

crates/bevy_scene/src/scene_spawner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ mod tests {
594594
"`SceneInstanceReady` contains the wrong `InstanceId`"
595595
);
596596
assert_eq!(
597-
trigger.entity(),
597+
trigger.target(),
598598
scene_entity,
599599
"`SceneInstanceReady` triggered on the wrong parent entity"
600600
);

crates/bevy_winit/src/cursor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ fn update_cursors(
185185
fn on_remove_cursor_icon(trigger: Trigger<OnRemove, CursorIcon>, mut commands: Commands) {
186186
// Use `try_insert` to avoid panic if the window is being destroyed.
187187
commands
188-
.entity(trigger.entity())
188+
.entity(trigger.target())
189189
.try_insert(PendingCursor(Some(CursorSource::System(
190190
convert_system_cursor_icon(SystemCursorIcon::Default),
191191
))));

0 commit comments

Comments
 (0)