Skip to content

Commit 5cb7832

Browse files
author
xiejiaen
committed
copy component_change_detection example from @alice-i-cecile's draft
1 parent e851496 commit 5cb7832

File tree

10 files changed

+400
-158
lines changed

10 files changed

+400
-158
lines changed

Cargo.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2914,6 +2914,17 @@ description = "Demonstrates how to create a node with a border"
29142914
category = "UI (User Interface)"
29152915
wasm = true
29162916

2917+
[[example]]
2918+
name = "responding_to_changes"
2919+
path = "examples/ecs/responding_to_changes.rs"
2920+
doc-scrape-examples = true
2921+
2922+
[package.metadata.example.reactivity]
2923+
name = "Responding to Changes"
2924+
description = "Demonstrates how and when to use change detection and `OnMutate` hooks and observers"
2925+
category = "ECS (Entity Component System)"
2926+
wasm = true
2927+
29172928
[[example]]
29182929
name = "box_shadow"
29192930
path = "examples/ui/box_shadow.rs"

crates/bevy_app/src/sub_app.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ type ExtractFn = Box<dyn Fn(&mut World, &mut World) + Send>;
3737
///
3838
/// // Create a sub-app with the same resource and a single schedule.
3939
/// let mut sub_app = SubApp::new();
40+
/// sub_app.update_schedule = Some(Main.intern());
4041
/// sub_app.insert_resource(Val(100));
4142
///
4243
/// // Setup an extract function to copy the resource's value in the main world.

crates/bevy_ecs/macros/src/world_query.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ pub(crate) fn world_query_impl(
151151
}
152152

153153
const IS_DENSE: bool = true #(&& <#field_types>::IS_DENSE)*;
154+
const IS_MUTATE: bool = false #(|| <#field_types>::IS_MUTATE)*;
154155

155156
/// SAFETY: we call `set_archetype` for each member that implements `Fetch`
156157
#[inline]

crates/bevy_picking/src/events.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ impl<E: Debug + Clone + Reflect> core::ops::Deref for Pointer<E> {
9999

100100
impl<E: Debug + Clone + Reflect> Pointer<E> {
101101
/// Construct a new `Pointer<E>` event.
102-
pub fn new(target: Entity, id: PointerId, location: Location, event: E) -> Self {
102+
pub fn new(id: PointerId, location: Location, target: Entity, event: E) -> Self {
103103
Self {
104104
target,
105105
pointer_id: id,
@@ -361,9 +361,9 @@ pub fn pointer_events(
361361
{
362362
state.dragging_over.insert(hovered_entity, hit.clone());
363363
let drag_enter_event = Pointer::new(
364-
hovered_entity,
365364
pointer_id,
366365
location.clone(),
366+
hovered_entity,
367367
DragEnter {
368368
button,
369369
dragged: *drag_target,
@@ -377,9 +377,9 @@ pub fn pointer_events(
377377

378378
// Always send Over events
379379
let over_event = Pointer::new(
380-
hovered_entity,
381380
pointer_id,
382381
location.clone(),
382+
hovered_entity,
383383
Over { hit: hit.clone() },
384384
);
385385
commands.trigger_targets(over_event.clone(), hovered_entity);
@@ -409,9 +409,9 @@ pub fn pointer_events(
409409
.flat_map(|h| h.iter().map(|(entity, data)| (*entity, data.clone())))
410410
{
411411
let down_event = Pointer::new(
412-
hovered_entity,
413412
pointer_id,
414413
location.clone(),
414+
hovered_entity,
415415
Down {
416416
button,
417417
hit: hit.clone(),
@@ -436,9 +436,9 @@ pub fn pointer_events(
436436
if let Some((_, press_instant, _)) = state.pressing.get(&hovered_entity)
437437
{
438438
let click_event = Pointer::new(
439-
hovered_entity,
440439
pointer_id,
441440
location.clone(),
441+
hovered_entity,
442442
Click {
443443
button,
444444
hit: hit.clone(),
@@ -450,9 +450,9 @@ pub fn pointer_events(
450450
}
451451
// Always send the Up event
452452
let up_event = Pointer::new(
453-
hovered_entity,
454453
pointer_id,
455454
location.clone(),
455+
hovered_entity,
456456
Up {
457457
button,
458458
hit: hit.clone(),
@@ -467,9 +467,9 @@ pub fn pointer_events(
467467
// Emit DragDrop
468468
for (dragged_over, hit) in state.dragging_over.iter() {
469469
let drag_drop_event = Pointer::new(
470-
*dragged_over,
471470
pointer_id,
472471
location.clone(),
472+
*dragged_over,
473473
DragDrop {
474474
button,
475475
dropped: drag_target,
@@ -481,9 +481,9 @@ pub fn pointer_events(
481481
}
482482
// Emit DragEnd
483483
let drag_end_event = Pointer::new(
484-
drag_target,
485484
pointer_id,
486485
location.clone(),
486+
drag_target,
487487
DragEnd {
488488
button,
489489
distance: drag.latest_pos - drag.start_pos,
@@ -494,9 +494,9 @@ pub fn pointer_events(
494494
// Emit DragLeave
495495
for (dragged_over, hit) in state.dragging_over.iter() {
496496
let drag_leave_event = Pointer::new(
497-
*dragged_over,
498497
pointer_id,
499498
location.clone(),
499+
*dragged_over,
500500
DragLeave {
501501
button,
502502
dragged: drag_target,
@@ -534,9 +534,9 @@ pub fn pointer_events(
534534
},
535535
);
536536
let drag_start_event = Pointer::new(
537-
*press_target,
538537
pointer_id,
539538
location.clone(),
539+
*press_target,
540540
DragStart {
541541
button,
542542
hit: hit.clone(),
@@ -549,9 +549,9 @@ pub fn pointer_events(
549549
// Emit Drag events to the entities we are dragging
550550
for (drag_target, drag) in state.dragging.iter_mut() {
551551
let drag_event = Pointer::new(
552-
*drag_target,
553552
pointer_id,
554553
location.clone(),
554+
*drag_target,
555555
Drag {
556556
button,
557557
distance: location.position - drag.start_pos,
@@ -572,9 +572,9 @@ pub fn pointer_events(
572572
.filter(|(hovered_entity, _)| *hovered_entity != *drag_target)
573573
{
574574
let drag_over_event = Pointer::new(
575-
hovered_entity,
576575
pointer_id,
577576
location.clone(),
577+
hovered_entity,
578578
DragOver {
579579
button,
580580
dragged: *drag_target,
@@ -594,9 +594,9 @@ pub fn pointer_events(
594594
{
595595
// Emit Move events to the entities we are hovering
596596
let move_event = Pointer::new(
597-
hovered_entity,
598597
pointer_id,
599598
location.clone(),
599+
hovered_entity,
600600
Move {
601601
hit: hit.clone(),
602602
delta,
@@ -615,7 +615,7 @@ pub fn pointer_events(
615615
.flat_map(|h| h.iter().map(|(entity, data)| (*entity, data.to_owned())))
616616
{
617617
let cancel_event =
618-
Pointer::new(hovered_entity, pointer_id, location.clone(), Cancel { hit });
618+
Pointer::new(pointer_id, location.clone(), hovered_entity, Cancel { hit });
619619
commands.trigger_targets(cancel_event.clone(), hovered_entity);
620620
event_writers.cancel_events.send(cancel_event);
621621
}
@@ -652,9 +652,9 @@ pub fn pointer_events(
652652

653653
// Always send Out events
654654
let out_event = Pointer::new(
655-
hovered_entity,
656655
pointer_id,
657656
location.clone(),
657+
hovered_entity,
658658
Out { hit: hit.clone() },
659659
);
660660
commands.trigger_targets(out_event.clone(), hovered_entity);
@@ -666,9 +666,9 @@ pub fn pointer_events(
666666
state.dragging_over.remove(&hovered_entity);
667667
for drag_target in state.dragging.keys() {
668668
let drag_leave_event = Pointer::new(
669-
hovered_entity,
670669
pointer_id,
671670
location.clone(),
671+
hovered_entity,
672672
DragLeave {
673673
button,
674674
dragged: *drag_target,

crates/bevy_render/src/sync_world.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ mod render_entities_world_query_impls {
294294
}
295295

296296
const IS_DENSE: bool = <&'static RenderEntity as WorldQuery>::IS_DENSE;
297+
const IS_MUTATE: bool = <&'static RenderEntity as WorldQuery>::IS_MUTATE;
297298

298299
#[inline]
299300
unsafe fn set_archetype<'w>(
@@ -393,6 +394,7 @@ mod render_entities_world_query_impls {
393394
}
394395

395396
const IS_DENSE: bool = <&'static MainEntity as WorldQuery>::IS_DENSE;
397+
const IS_MUTATE: bool = <&'static MainEntity as WorldQuery>::IS_MUTATE;
396398

397399
#[inline]
398400
unsafe fn set_archetype<'w>(

examples/animation/animated_fox.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::{f32::consts::PI, time::Duration};
44

55
use bevy::{
6-
animation::{animate_targets, AnimationTargetId, RepeatAnimation},
6+
animation::{AnimationTargetId, RepeatAnimation},
77
color::palettes::css::WHITE,
88
pbr::CascadeShadowConfigBuilder,
99
prelude::*,
@@ -22,7 +22,7 @@ fn main() {
2222
.init_resource::<ParticleAssets>()
2323
.init_resource::<FoxFeetTargets>()
2424
.add_systems(Startup, setup)
25-
.add_systems(Update, setup_scene_once_loaded.before(animate_targets))
25+
.add_systems(Update, setup_scene_once_loaded)
2626
.add_systems(Update, (keyboard_animation_control, simulate_particles))
2727
.add_observer(observe_on_step)
2828
.run();

examples/animation/animation_graph.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
//! playing animations by clicking and dragging left or right within the nodes.
55
66
use bevy::{
7-
animation::animate_targets,
87
color::palettes::{
98
basic::WHITE,
109
css::{ANTIQUE_WHITE, DARK_GREEN},
@@ -83,7 +82,7 @@ fn main() {
8382
..default()
8483
}))
8584
.add_systems(Startup, (setup_assets, setup_scene, setup_ui))
86-
.add_systems(Update, init_animations.before(animate_targets))
85+
.add_systems(Update, init_animations)
8786
.add_systems(
8887
Update,
8988
(handle_weight_drag, update_ui, sync_weights).chain(),

0 commit comments

Comments
 (0)