Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_picking/src/window.rs
6596 views
1
//! This module contains a basic backend that implements picking for window
2
//! entities.
3
//!
4
//! Pointers can exist on windows, images, and gpu texture views. With
5
//! [`update_window_hits`] enabled, when a pointer hovers over a window that
6
//! window will be inserted as a pointer hit, listed behind all other pointer
7
//! hits. This means that when the pointer isn't hovering any other entities,
8
//! the picking events will be routed to the window.
9
//!
10
//! ## Implementation Notes
11
//!
12
//! - This backend does not provide `position` or `normal` in `HitData`.
13
14
use core::f32;
15
16
use bevy_camera::NormalizedRenderTarget;
17
use bevy_ecs::prelude::*;
18
19
use crate::{
20
backend::{HitData, PointerHits},
21
pointer::{Location, PointerId, PointerLocation},
22
};
23
24
/// Generates pointer hit events for window entities.
25
///
26
/// A pointer is treated as hitting a window when it is located on that window. The order
27
/// of the hit event is negative infinity, meaning it should appear behind all other entities.
28
///
29
/// The depth of the hit will be listed as zero.
30
pub fn update_window_hits(
31
pointers: Query<(&PointerId, &PointerLocation)>,
32
mut output_events: EventWriter<PointerHits>,
33
) {
34
for (pointer_id, pointer_location) in pointers.iter() {
35
if let Some(Location {
36
target: NormalizedRenderTarget::Window(window_ref),
37
..
38
}) = pointer_location.location
39
{
40
let entity = window_ref.entity();
41
let hit_data = HitData::new(entity, 0.0, None, None);
42
output_events.write(PointerHits::new(
43
*pointer_id,
44
vec![(entity, hit_data)],
45
f32::NEG_INFINITY,
46
));
47
}
48
}
49
}
50
51