Skip to content

Commit 6adf31b

Browse files
TotalKrillDasLixoualice-i-cecilekristoff3r
authored
hooking up observers and clicking for ui node (#14695)
Makes the newly merged picking usable for UI elements. currently it both triggers the events, as well as sends them as throught commands.trigger_targets. We should probably figure out if this is needed for them all. # Objective Hooks up obserers and picking for a very simple example ## Solution upstreamed the UI picking backend from bevy_mod_picking ## Testing tested with the new example picking/simple_picking.rs --- --------- Co-authored-by: Lixou <[email protected]> Co-authored-by: Alice Cecile <[email protected]> Co-authored-by: Kristoffer Søholm <[email protected]>
1 parent 0ea4666 commit 6adf31b

File tree

13 files changed

+455
-66
lines changed

13 files changed

+455
-66
lines changed

Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3352,6 +3352,18 @@ description = "Demonstrates how to rotate the skybox and the environment map sim
33523352
category = "3D Rendering"
33533353
wasm = false
33543354

3355+
[[example]]
3356+
name = "simple_picking"
3357+
path = "examples/picking/simple_picking.rs"
3358+
doc-scrape-examples = true
3359+
required-features = ["bevy_picking"]
3360+
3361+
[package.metadata.example.simple_picking]
3362+
name = "Showcases simple picking events and usage"
3363+
description = "Demonstrates how to use picking events to spawn simple objects"
3364+
category = "Picking"
3365+
wasm = true
3366+
33553367
[profile.wasm-release]
33563368
inherits = "release"
33573369
opt-level = "z"

crates/bevy_internal/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ meshlet_processor = ["bevy_pbr?/meshlet_processor"]
191191
bevy_dev_tools = ["dep:bevy_dev_tools"]
192192

193193
# Provides a picking functionality
194-
bevy_picking = ["dep:bevy_picking"]
194+
bevy_picking = ["dep:bevy_picking", "bevy_ui?/bevy_picking"]
195195

196196
# Enable support for the ios_simulator by downgrading some rendering capabilities
197197
ios_simulator = ["bevy_pbr?/ios_simulator", "bevy_render?/ios_simulator"]

crates/bevy_internal/src/default_plugins.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ plugin_group! {
5656
bevy_gizmos:::GizmoPlugin,
5757
#[cfg(feature = "bevy_state")]
5858
bevy_state::app:::StatesPlugin,
59+
#[cfg(feature = "bevy_picking")]
60+
bevy_picking:::DefaultPickingPlugins,
5961
#[cfg(feature = "bevy_dev_tools")]
6062
bevy_dev_tools:::DevToolsPlugin,
6163
#[cfg(feature = "bevy_ci_testing")]

crates/bevy_internal/src/prelude.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,7 @@ pub use crate::state::prelude::*;
6666
#[doc(hidden)]
6767
#[cfg(feature = "bevy_gltf")]
6868
pub use crate::gltf::prelude::*;
69+
70+
#[doc(hidden)]
71+
#[cfg(feature = "bevy_picking")]
72+
pub use crate::picking::prelude::*;

crates/bevy_picking/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ bevy_transform = { path = "../bevy_transform", version = "0.15.0-dev" }
2020
bevy_utils = { path = "../bevy_utils", version = "0.15.0-dev" }
2121
bevy_window = { path = "../bevy_window", version = "0.15.0-dev" }
2222

23+
bevy_time = { path = "../bevy_time", version = "0.15.0-dev" }
24+
bevy_asset = { path = "../bevy_asset", version = "0.15.0-dev" }
25+
2326
uuid = { version = "1.1", features = ["v4"] }
2427

2528
[lints]

crates/bevy_picking/src/events.rs

Lines changed: 68 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ pub struct Drop {
205205
/// Generates pointer events from input and focus data
206206
#[allow(clippy::too_many_arguments)]
207207
pub fn pointer_events(
208+
mut commands: Commands,
208209
// Input
209210
mut input_presses: EventReader<InputPress>,
210211
mut input_moves: EventReader<InputMove>,
@@ -237,12 +238,14 @@ pub fn pointer_events(
237238
.iter()
238239
.flat_map(|h| h.iter().map(|(entity, data)| (*entity, data.to_owned())))
239240
{
240-
pointer_move.send(Pointer::new(
241+
let event = Pointer::new(
241242
pointer_id,
242243
location.clone(),
243244
hovered_entity,
244245
Move { hit, delta },
245-
));
246+
);
247+
commands.trigger_targets(event.clone(), event.target);
248+
pointer_move.send(event);
246249
}
247250
}
248251

@@ -264,12 +267,14 @@ pub fn pointer_events(
264267
);
265268
continue;
266269
};
267-
pointer_up.send(Pointer::new(
270+
let event = Pointer::new(
268271
press_event.pointer_id,
269272
location,
270273
hovered_entity,
271274
Up { button, hit },
272-
));
275+
);
276+
commands.trigger_targets(event.clone(), event.target);
277+
pointer_up.send(event);
273278
}
274279
}
275280
for (hovered_entity, hit) in hover_map
@@ -285,12 +290,14 @@ pub fn pointer_events(
285290
);
286291
continue;
287292
};
288-
pointer_down.send(Pointer::new(
293+
let event = Pointer::new(
289294
press_event.pointer_id,
290295
location,
291296
hovered_entity,
292297
Down { button, hit },
293-
));
298+
);
299+
commands.trigger_targets(event.clone(), event.target);
300+
pointer_down.send(event);
294301
}
295302
}
296303
}
@@ -313,12 +320,9 @@ pub fn pointer_events(
313320
);
314321
continue;
315322
};
316-
pointer_over.send(Pointer::new(
317-
pointer_id,
318-
location,
319-
hovered_entity,
320-
Over { hit },
321-
));
323+
let event = Pointer::new(pointer_id, location, hovered_entity, Over { hit });
324+
commands.trigger_targets(event.clone(), event.target);
325+
pointer_over.send(event);
322326
}
323327
}
324328

@@ -340,12 +344,9 @@ pub fn pointer_events(
340344
);
341345
continue;
342346
};
343-
pointer_out.send(Pointer::new(
344-
pointer_id,
345-
location,
346-
hovered_entity,
347-
Out { hit },
348-
));
347+
let event = Pointer::new(pointer_id, location, hovered_entity, Out { hit });
348+
commands.trigger_targets(event.clone(), event.target);
349+
pointer_out.send(event);
349350
}
350351
}
351352
}
@@ -366,6 +367,11 @@ pub struct DragEntry {
366367
/// Uses pointer events to determine when click and drag events occur.
367368
#[allow(clippy::too_many_arguments)]
368369
pub fn send_click_and_drag_events(
370+
// for triggering observers
371+
// - Pointer<Click>
372+
// - Pointer<Drag>
373+
// - Pointer<DragStart>
374+
mut commands: Commands,
369375
// Input
370376
mut pointer_down: EventReader<Pointer<Down>>,
371377
mut pointer_up: EventReader<Pointer<Up>>,
@@ -377,12 +383,9 @@ pub fn send_click_and_drag_events(
377383
mut down_map: Local<
378384
HashMap<(PointerId, PointerButton), HashMap<Entity, (Pointer<Down>, Instant)>>,
379385
>,
380-
// Output
386+
// Outputs used for further processing
381387
mut drag_map: ResMut<DragMap>,
382-
mut pointer_click: EventWriter<Pointer<Click>>,
383-
mut pointer_drag_start: EventWriter<Pointer<DragStart>>,
384388
mut pointer_drag_end: EventWriter<Pointer<DragEnd>>,
385-
mut pointer_drag: EventWriter<Pointer<Drag>>,
386389
) {
387390
let pointer_location = |pointer_id: PointerId| {
388391
pointer_map
@@ -415,15 +418,16 @@ pub fn send_click_and_drag_events(
415418
latest_pos: down.pointer_location.position,
416419
},
417420
);
418-
pointer_drag_start.send(Pointer::new(
421+
let event = Pointer::new(
419422
pointer_id,
420423
down.pointer_location.clone(),
421424
down.target,
422425
DragStart {
423426
button,
424427
hit: down.hit.clone(),
425428
},
426-
));
429+
);
430+
commands.trigger_targets(event, down.target);
427431
}
428432

429433
for (dragged_entity, drag) in drag_list.iter_mut() {
@@ -433,12 +437,9 @@ pub fn send_click_and_drag_events(
433437
delta: location.position - drag.latest_pos,
434438
};
435439
drag.latest_pos = location.position;
436-
pointer_drag.send(Pointer::new(
437-
pointer_id,
438-
location.clone(),
439-
*dragged_entity,
440-
drag_event,
441-
));
440+
let target = *dragged_entity;
441+
let event = Pointer::new(pointer_id, location.clone(), target, drag_event);
442+
commands.trigger_targets(event, target);
442443
}
443444
}
444445
}
@@ -458,7 +459,7 @@ pub fn send_click_and_drag_events(
458459
.and_then(|down| down.get(&target))
459460
{
460461
let duration = now - *down_instant;
461-
pointer_click.send(Pointer::new(
462+
let event = Pointer::new(
462463
pointer_id,
463464
pointer_location,
464465
target,
@@ -467,7 +468,8 @@ pub fn send_click_and_drag_events(
467468
hit,
468469
duration,
469470
},
470-
));
471+
);
472+
commands.trigger_targets(event, target);
471473
}
472474
}
473475

@@ -501,19 +503,22 @@ pub fn send_click_and_drag_events(
501503
button: press.button,
502504
distance: drag.latest_pos - drag.start_pos,
503505
};
504-
pointer_drag_end.send(Pointer::new(
505-
press.pointer_id,
506-
location.clone(),
507-
drag_target,
508-
drag_end,
509-
));
506+
let event = Pointer::new(press.pointer_id, location.clone(), drag_target, drag_end);
507+
commands.trigger_targets(event.clone(), event.target);
508+
pointer_drag_end.send(event);
510509
}
511510
}
512511
}
513512

514513
/// Uses pointer events to determine when drag-over events occur
515514
#[allow(clippy::too_many_arguments)]
516515
pub fn send_drag_over_events(
516+
// uses this to trigger the following
517+
// - Pointer<DragEnter>,
518+
// - Pointer<DragOver>,
519+
// - Pointer<DragLeave>,
520+
// - Pointer<Drop>,
521+
mut commands: Commands,
517522
// Input
518523
drag_map: Res<DragMap>,
519524
mut pointer_over: EventReader<Pointer<Over>>,
@@ -522,12 +527,6 @@ pub fn send_drag_over_events(
522527
mut pointer_drag_end: EventReader<Pointer<DragEnd>>,
523528
// Local
524529
mut drag_over_map: Local<HashMap<(PointerId, PointerButton), HashMap<Entity, HitData>>>,
525-
526-
// Output
527-
mut pointer_drag_enter: EventWriter<Pointer<DragEnter>>,
528-
mut pointer_drag_over: EventWriter<Pointer<DragOver>>,
529-
mut pointer_drag_leave: EventWriter<Pointer<DragLeave>>,
530-
mut pointer_drop: EventWriter<Pointer<Drop>>,
531530
) {
532531
// Fire PointerDragEnter events.
533532
for Pointer {
@@ -548,17 +547,17 @@ pub fn send_drag_over_events(
548547
{
549548
let drag_entry = drag_over_map.entry((pointer_id, button)).or_default();
550549
drag_entry.insert(target, hit.clone());
551-
let event = DragEnter {
552-
button,
553-
dragged: *drag_target,
554-
hit: hit.clone(),
555-
};
556-
pointer_drag_enter.send(Pointer::new(
550+
let event = Pointer::new(
557551
pointer_id,
558552
pointer_location.clone(),
559553
target,
560-
event,
561-
));
554+
DragEnter {
555+
button,
556+
dragged: *drag_target,
557+
hit: hit.clone(),
558+
},
559+
);
560+
commands.trigger_targets(event, target);
562561
}
563562
}
564563
}
@@ -580,7 +579,7 @@ pub fn send_drag_over_events(
580579
|&&drag_target| target != drag_target, /* can't drag over itself */
581580
)
582581
{
583-
pointer_drag_over.send(Pointer::new(
582+
let event = Pointer::new(
584583
pointer_id,
585584
pointer_location.clone(),
586585
target,
@@ -589,7 +588,8 @@ pub fn send_drag_over_events(
589588
dragged: *drag_target,
590589
hit: hit.clone(),
591590
},
592-
));
591+
);
592+
commands.trigger_targets(event, target);
593593
}
594594
}
595595
}
@@ -598,7 +598,7 @@ pub fn send_drag_over_events(
598598
for Pointer {
599599
pointer_id,
600600
pointer_location,
601-
target,
601+
target: drag_end_target,
602602
event: DragEnd {
603603
button,
604604
distance: _,
@@ -609,26 +609,30 @@ pub fn send_drag_over_events(
609609
continue;
610610
};
611611
for (dragged_over, hit) in drag_over_set.drain() {
612-
pointer_drag_leave.send(Pointer::new(
612+
let target = dragged_over;
613+
let event = Pointer::new(
613614
pointer_id,
614615
pointer_location.clone(),
615616
dragged_over,
616617
DragLeave {
617618
button,
618-
dragged: target,
619+
dragged: drag_end_target,
619620
hit: hit.clone(),
620621
},
621-
));
622-
pointer_drop.send(Pointer::new(
622+
);
623+
commands.trigger_targets(event, target);
624+
625+
let event = Pointer::new(
623626
pointer_id,
624627
pointer_location.clone(),
625-
dragged_over,
628+
target,
626629
Drop {
627630
button,
628631
dropped: target,
629632
hit: hit.clone(),
630633
},
631-
));
634+
);
635+
commands.trigger_targets(event, target);
632636
}
633637
}
634638

@@ -651,7 +655,7 @@ pub fn send_drag_over_events(
651655
continue;
652656
};
653657
for drag_target in drag_list.keys() {
654-
pointer_drag_leave.send(Pointer::new(
658+
let event = Pointer::new(
655659
pointer_id,
656660
pointer_location.clone(),
657661
target,
@@ -660,7 +664,8 @@ pub fn send_drag_over_events(
660664
dragged: *drag_target,
661665
hit: hit.clone(),
662666
},
663-
));
667+
);
668+
commands.trigger_targets(event, target);
664669
}
665670
}
666671
}

0 commit comments

Comments
 (0)