pub struct ButtonInput<T>{ /* private fields */ }Expand description
A “press-able” input of type T.
§Usage
This type can be used as a resource to keep the current state of an input, by reacting to events from the input. For a given input value:
ButtonInput::pressedwill returntruebetween a press and a release event.ButtonInput::just_pressedwill returntruefor one frame after a press event.ButtonInput::just_releasedwill returntruefor one frame after a release event.
§Multiple systems
In case multiple systems are checking for ButtonInput::just_pressed or ButtonInput::just_released
but only one should react, for example when modifying a
Resource, you should consider clearing the input state, either by:
- Using
ButtonInput::clear_just_pressedorButtonInput::clear_just_releasedinstead. - Calling
ButtonInput::clearorButtonInput::resetimmediately after the state change.
§Performance
For all operations, the following conventions are used:
- n is the number of stored inputs.
- m is the number of input arguments passed to the method.
- *-suffix denotes an amortized cost.
- ~-suffix denotes an expected cost.
See Rust’s std::collections doc on performance for more details on the conventions used here.
ButtonInput operations | Computational complexity |
|---|---|
ButtonInput::any_just_pressed | O(m)~ |
ButtonInput::any_just_released | O(m)~ |
ButtonInput::any_pressed | O(m)~ |
ButtonInput::get_just_pressed | O(n) |
ButtonInput::get_just_released | O(n) |
ButtonInput::get_pressed | O(n) |
ButtonInput::just_pressed | O(1)~ |
ButtonInput::just_released | O(1)~ |
ButtonInput::pressed | O(1)~ |
ButtonInput::press | O(1)~* |
ButtonInput::release | O(1)~* |
ButtonInput::release_all | O(n)~* |
ButtonInput::clear_just_pressed | O(1)~ |
ButtonInput::clear_just_released | O(1)~ |
ButtonInput::reset_all | O(n) |
ButtonInput::clear | O(n) |
§Window focus
ButtonInput<KeyCode> is tied to window focus. For example, if the user holds a button
while the window loses focus, ButtonInput::just_released will be triggered. Similarly if the window
regains focus, ButtonInput::just_pressed will be triggered.
ButtonInput<GamepadButton> is independent of window focus.
§Examples
Reading and checking against the current set of pressed buttons:
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(
Update,
print_mouse.run_if(resource_changed::<ButtonInput<MouseButton>>),
)
.add_systems(
Update,
print_keyboard.run_if(resource_changed::<ButtonInput<KeyCode>>),
)
.run();
}
fn print_mouse(mouse: Res<ButtonInput<MouseButton>>) {
println!("Mouse: {:?}", mouse.get_pressed().collect::<Vec<_>>());
}
fn print_keyboard(keyboard: Res<ButtonInput<KeyCode>>) {
if keyboard.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight])
&& keyboard.any_pressed([KeyCode::AltLeft, KeyCode::AltRight])
&& keyboard.any_pressed([KeyCode::ShiftLeft, KeyCode::ShiftRight])
&& keyboard.any_pressed([KeyCode::SuperLeft, KeyCode::SuperRight])
&& keyboard.pressed(KeyCode::KeyL)
{
println!("On Windows this opens LinkedIn.");
} else {
println!("keyboard: {:?}", keyboard.get_pressed().collect::<Vec<_>>());
}
}§Note
When adding this resource for a new input type, you should:
- Call the
ButtonInput::pressmethod for each press event. - Call the
ButtonInput::releasemethod for each release event. - Call the
ButtonInput::clearmethod at each frame start, before processing events.
Note: Calling clear from a ResMut will trigger change detection.
It may be preferable to use DetectChangesMut::bypass_change_detection
to avoid causing the resource to always be marked as changed.
Implementations§
Source§impl<T> ButtonInput<T>
impl<T> ButtonInput<T>
Sourcepub fn pressed(&self, input: T) -> bool
pub fn pressed(&self, input: T) -> bool
Returns true if the input has been pressed.
Examples found in repository?
More examples
136fn trigger_hooks(
137 mut commands: Commands,
138 keys: Res<ButtonInput<KeyCode>>,
139 index: Res<MyComponentIndex>,
140) {
141 for (key, entity) in index.iter() {
142 if !keys.pressed(*key) {
143 commands.entity(*entity).remove::<MyComponent>();
144 }
145 }
146 for key in keys.get_just_pressed() {
147 commands.spawn(MyComponent(*key));
148 }
149}16fn mouse_click_system(mouse_button_input: Res<ButtonInput<MouseButton>>) {
17 if mouse_button_input.pressed(MouseButton::Left) {
18 info!("left mouse currently pressed");
19 }
20
21 if mouse_button_input.just_pressed(MouseButton::Left) {
22 info!("left mouse just pressed");
23 }
24
25 if mouse_button_input.just_released(MouseButton::Left) {
26 info!("left mouse just released");
27 }
28}99fn text_submission(
100 input_focus: Res<InputFocus>,
101 keyboard_input: Res<ButtonInput<KeyCode>>,
102 mut text_input: Query<&mut EditableText>,
103 mut text_output: Single<&mut Text, With<TextOutput>>,
104) {
105 if keyboard_input.just_pressed(KeyCode::Enter)
106 && (keyboard_input.pressed(KeyCode::ControlLeft)
107 || keyboard_input.pressed(KeyCode::ControlRight))
108 && let Some(focused_entity) = input_focus.get()
109 && let Ok(mut input) = text_input.get_mut(focused_entity)
110 {
111 text_output.0 = input.value().to_string();
112 input.clear();
113 }
114}106fn update_listener(
107 keyboard: Res<ButtonInput<KeyCode>>,
108 time: Res<Time>,
109 mut listener: Single<&mut Transform, With<SpatialListener>>,
110) {
111 let speed = 200.;
112
113 if keyboard.pressed(KeyCode::ArrowRight) {
114 listener.translation.x += speed * time.delta_secs();
115 }
116 if keyboard.pressed(KeyCode::ArrowLeft) {
117 listener.translation.x -= speed * time.delta_secs();
118 }
119 if keyboard.pressed(KeyCode::ArrowUp) {
120 listener.translation.y += speed * time.delta_secs();
121 }
122 if keyboard.pressed(KeyCode::ArrowDown) {
123 listener.translation.y -= speed * time.delta_secs();
124 }
125}- examples/audio/spatial_audio_3d.rs
- examples/3d/lighting.rs
- examples/camera/first_person_view_model.rs
- examples/state/custom_transitions.rs
- examples/state/states.rs
- examples/state/sub_states.rs
- examples/camera/2d_top_down_camera.rs
- examples/3d/rect_light.rs
- examples/3d/depth_of_field.rs
- examples/ui/ui_transform.rs
- examples/showcase/breakout.rs
- examples/state/computed_states.rs
- examples/3d/reflection_probes.rs
- examples/stress_tests/bevymark_3d.rs
- examples/3d/spotlight.rs
- examples/3d/volumetric_fog.rs
- examples/input/keyboard_input.rs
- examples/3d/irradiance_volumes.rs
- examples/3d/generate_custom_mesh.rs
- examples/ui/text/letter_spacing.rs
- examples/ui/images/image_node_resizing.rs
- examples/3d/order_independent_transparency.rs
- examples/camera/free_camera_controller.rs
- examples/stress_tests/bevymark.rs
- examples/3d/mixed_lighting.rs
- examples/3d/solari_reflections.rs
- examples/testbed/full_ui.rs
- examples/gizmos/light_gizmos.rs
- examples/3d/ssr.rs
- examples/2d/rotation.rs
- examples/3d/mirror.rs
- examples/shader_advanced/render_depth_to_texture.rs
- examples/3d/visibility_range.rs
- examples/3d/tonemapping.rs
- examples/3d/auto_exposure.rs
- examples/3d/light_probe_blending.rs
- examples/camera/camera_orbit.rs
- examples/movement/physics_in_fixed_timestep.rs
- examples/showcase/alien_cake_addict.rs
- examples/3d/post_processing.rs
- examples/3d/atmosphere.rs
- examples/3d/blend_modes.rs
- examples/2d/2d_viewport_to_world.rs
- examples/gizmos/2d_gizmos.rs
- examples/gizmos/3d_gizmos.rs
- examples/3d/bloom_3d.rs
- examples/3d/fog.rs
- examples/2d/bloom_2d.rs
- examples/3d/transmission.rs
- examples/reflection/mutation_by_reflection.rs
- examples/ui/text/multiline_text_input.rs
Sourcepub fn any_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
pub fn any_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if any item in inputs has been pressed.
Examples found in repository?
More examples
27fn send_scroll_events(
28 mut mouse_wheel_reader: MessageReader<MouseWheel>,
29 hover_map: Res<HoverMap>,
30 keyboard_input: Res<ButtonInput<KeyCode>>,
31 mut commands: Commands,
32) {
33 for mouse_wheel in mouse_wheel_reader.read() {
34 let mut delta = -Vec2::new(mouse_wheel.x, mouse_wheel.y);
35
36 if mouse_wheel.unit == MouseScrollUnit::Line {
37 delta *= LINE_HEIGHT;
38 }
39
40 if keyboard_input.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight]) {
41 std::mem::swap(&mut delta.x, &mut delta.y);
42 }
43
44 for pointer_map in hover_map.values() {
45 for entity in pointer_map.keys().copied() {
46 commands.trigger(Scroll { entity, delta });
47 }
48 }
49 }
50}137fn update_system(
138 camera: Single<(&mut DistanceFog, &mut Transform)>,
139 mut text: Single<&mut Text>,
140 time: Res<Time>,
141 keycode: Res<ButtonInput<KeyCode>>,
142) {
143 let now = time.elapsed_secs();
144 let delta = time.delta_secs();
145
146 let (mut fog, mut transform) = camera.into_inner();
147
148 // Orbit camera around pyramid
149 let orbit_scale = 8.0 + ops::sin(now / 10.0) * 7.0;
150 *transform = Transform::from_xyz(
151 ops::cos(now / 5.0) * orbit_scale,
152 12.0 - orbit_scale / 2.0,
153 ops::sin(now / 5.0) * orbit_scale,
154 )
155 .looking_at(Vec3::ZERO, Vec3::Y);
156
157 // Fog Information
158 text.0 = format!("Fog Falloff: {:?}\nFog Color: {:?}", fog.falloff, fog.color);
159
160 // Fog Falloff Mode Switching
161 text.push_str("\n\n1 / 2 / 3 - Fog Falloff Mode");
162
163 if keycode.pressed(KeyCode::Digit1) {
164 if let FogFalloff::Linear { .. } = fog.falloff {
165 // No change
166 } else {
167 fog.falloff = FogFalloff::Linear {
168 start: 5.0,
169 end: 20.0,
170 };
171 };
172 }
173
174 if keycode.pressed(KeyCode::Digit2) {
175 if let FogFalloff::Exponential { .. } = fog.falloff {
176 // No change
177 } else if let FogFalloff::ExponentialSquared { density } = fog.falloff {
178 fog.falloff = FogFalloff::Exponential { density };
179 } else {
180 fog.falloff = FogFalloff::Exponential { density: 0.07 };
181 };
182 }
183
184 if keycode.pressed(KeyCode::Digit3) {
185 if let FogFalloff::Exponential { density } = fog.falloff {
186 fog.falloff = FogFalloff::ExponentialSquared { density };
187 } else if let FogFalloff::ExponentialSquared { .. } = fog.falloff {
188 // No change
189 } else {
190 fog.falloff = FogFalloff::ExponentialSquared { density: 0.07 };
191 };
192 }
193
194 // Linear Fog Controls
195 if let FogFalloff::Linear { start, end } = &mut fog.falloff {
196 text.push_str("\nA / S - Move Start Distance\nZ / X - Move End Distance");
197
198 if keycode.pressed(KeyCode::KeyA) {
199 *start -= delta * 3.0;
200 }
201 if keycode.pressed(KeyCode::KeyS) {
202 *start += delta * 3.0;
203 }
204 if keycode.pressed(KeyCode::KeyZ) {
205 *end -= delta * 3.0;
206 }
207 if keycode.pressed(KeyCode::KeyX) {
208 *end += delta * 3.0;
209 }
210 }
211
212 // Exponential Fog Controls
213 if let FogFalloff::Exponential { density } = &mut fog.falloff {
214 text.push_str("\nA / S - Change Density");
215
216 if keycode.pressed(KeyCode::KeyA) {
217 *density -= delta * 0.5 * *density;
218 if *density < 0.0 {
219 *density = 0.0;
220 }
221 }
222 if keycode.pressed(KeyCode::KeyS) {
223 *density += delta * 0.5 * *density;
224 }
225 }
226
227 // ExponentialSquared Fog Controls
228 if let FogFalloff::ExponentialSquared { density } = &mut fog.falloff {
229 text.push_str("\nA / S - Change Density");
230
231 if keycode.pressed(KeyCode::KeyA) {
232 *density -= delta * 0.5 * *density;
233 if *density < 0.0 {
234 *density = 0.0;
235 }
236 }
237 if keycode.pressed(KeyCode::KeyS) {
238 *density += delta * 0.5 * *density;
239 }
240 }
241
242 // RGBA Controls
243 text.push_str("\n\n- / = - Red\n[ / ] - Green\n; / ' - Blue\n. / ? - Alpha");
244
245 // We're performing various operations in the sRGB color space,
246 // so we convert the fog color to sRGB here, then modify it,
247 // and finally when we're done we can convert it back and set it.
248 let mut fog_color = Srgba::from(fog.color);
249 if keycode.pressed(KeyCode::Minus) {
250 fog_color.red = (fog_color.red - 0.1 * delta).max(0.0);
251 }
252
253 if keycode.any_pressed([KeyCode::Equal, KeyCode::NumpadEqual]) {
254 fog_color.red = (fog_color.red + 0.1 * delta).min(1.0);
255 }
256
257 if keycode.pressed(KeyCode::BracketLeft) {
258 fog_color.green = (fog_color.green - 0.1 * delta).max(0.0);
259 }
260
261 if keycode.pressed(KeyCode::BracketRight) {
262 fog_color.green = (fog_color.green + 0.1 * delta).min(1.0);
263 }
264
265 if keycode.pressed(KeyCode::Semicolon) {
266 fog_color.blue = (fog_color.blue - 0.1 * delta).max(0.0);
267 }
268
269 if keycode.pressed(KeyCode::Quote) {
270 fog_color.blue = (fog_color.blue + 0.1 * delta).min(1.0);
271 }
272
273 if keycode.pressed(KeyCode::Period) {
274 fog_color.alpha = (fog_color.alpha - 0.1 * delta).max(0.0);
275 }
276
277 if keycode.pressed(KeyCode::Slash) {
278 fog_color.alpha = (fog_color.alpha + 0.1 * delta).min(1.0);
279 }
280
281 fog.color = Color::from(fog_color);
282}Sourcepub fn all_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
pub fn all_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if all items in inputs have been pressed.
Sourcepub fn release_all(&mut self)
pub fn release_all(&mut self)
Registers a release for all currently pressed inputs.
Sourcepub fn just_pressed(&self, input: T) -> bool
pub fn just_pressed(&self, input: T) -> bool
Returns true if the input has been pressed during the current frame.
Note: This function does not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_released.
Examples found in repository?
More examples
617fn pause_scene(key_input: Res<ButtonInput<KeyCode>>, mut state: ResMut<DemoState>) {
618 if key_input.just_pressed(KeyCode::Space) {
619 state.paused = !state.paused;
620 }
621}
622
623fn set_metallic(material: &mut StandardMaterial, metallic: bool) {
624 material.metallic = if metallic { 1.0 } else { 0.0 };
625 material.base_color = if metallic {
626 METALLIC_BASE_COLOR
627 } else {
628 DIELECTRIC_BASE_COLOR
629 };
630}
631
632fn toggle_metallic(
633 key_input: Res<ButtonInput<KeyCode>>,
634 mut state: ResMut<DemoState>,
635 test_material: Res<TestMaterial>,
636 mut materials: ResMut<Assets<StandardMaterial>>,
637) {
638 if key_input.just_pressed(KeyCode::Digit1) {
639 state.metallic = !state.metallic;
640 set_metallic(
641 &mut materials.get_mut(&test_material.0).unwrap(),
642 state.metallic,
643 );
644 }
645}
646
647fn toggle_mirror_motion(key_input: Res<ButtonInput<KeyCode>>, mut state: ResMut<DemoState>) {
648 if key_input.just_pressed(KeyCode::Digit8) {
649 state.pan_mirror = !state.pan_mirror;
650 }
651 if key_input.just_pressed(KeyCode::Digit9) {
652 state.slide_mirror = !state.slide_mirror;
653 }
654}
655
656fn toggle_pathtracer(
657 key_input: Res<ButtonInput<KeyCode>>,
658 camera: Single<(Entity, Has<Pathtracer>), With<Camera3d>>,
659 mut commands: Commands,
660) {
661 if key_input.just_pressed(KeyCode::KeyP) {
662 let (entity, pathtracing) = *camera;
663 let mut camera = commands.entity(entity);
664
665 if pathtracing {
666 camera.remove_with_requires::<Pathtracer>();
667 camera.insert(SolariLighting::default());
668 } else {
669 camera.remove_with_requires::<SolariLighting>();
670 camera.insert(Pathtracer::default());
671
672 #[cfg(all(feature = "dlss", not(feature = "force_disable_dlss")))]
673 camera.remove::<(Dlss<DlssRayReconstructionFeature>, TemporalJitter, MipBias)>();
674 }
675 }
676}
677
678fn reset_pathtracer(state: Res<DemoState>, pathtracer: Option<Single<&mut Pathtracer>>) {
679 if let Some(mut pathtracer) = pathtracer
680 && state.is_changed()
681 {
682 pathtracer.reset = true;
683 }
684}
685
686fn select_preset(
687 key_input: Res<ButtonInput<KeyCode>>,
688 slider: Single<Entity, With<RoughnessSlider>>,
689 test_material: Res<TestMaterial>,
690 mut materials: ResMut<Assets<StandardMaterial>>,
691 mut commands: Commands,
692) {
693 for (key, _, roughness) in MATERIAL_PRESETS {
694 if key_input.just_pressed(key) {
695 materials
696 .get_mut(&test_material.0)
697 .unwrap()
698 .perceptual_roughness = roughness;
699
700 commands.entity(*slider).insert(SliderValue(roughness));
701 }
702 }
703}477fn toggle_restir(
478 key_input: Res<ButtonInput<KeyCode>>,
479 mut solari_lighting: Single<&mut SolariLighting>,
480) {
481 if key_input.just_pressed(KeyCode::KeyR) {
482 solari_lighting.restir = !solari_lighting.restir;
483 }
484}
485
486fn pause_scene(mut time: ResMut<Time<Virtual>>, key_input: Res<ButtonInput<KeyCode>>) {
487 if key_input.just_pressed(KeyCode::Space) {
488 time.toggle();
489 }
490}
491
492#[derive(Resource)]
493struct RobotLightMaterial(Handle<StandardMaterial>);
494
495fn toggle_lights(
496 key_input: Res<ButtonInput<KeyCode>>,
497 robot_light_material: Option<Res<RobotLightMaterial>>,
498 mut materials: ResMut<Assets<StandardMaterial>>,
499 directional_light: Query<Entity, With<DirectionalLight>>,
500 mut commands: Commands,
501) {
502 if key_input.just_pressed(KeyCode::Digit1) {
503 if let Ok(directional_light) = directional_light.single() {
504 commands.entity(directional_light).despawn();
505 } else {
506 commands.spawn((
507 DirectionalLight {
508 illuminance: light_consts::lux::FULL_DAYLIGHT,
509 shadow_maps_enabled: false, // Solari replaces shadow mapping
510 ..default()
511 },
512 Transform::from_rotation(Quat::from_xyzw(
513 -0.13334629,
514 -0.86597735,
515 -0.3586996,
516 0.3219264,
517 )),
518 ));
519 }
520 }
521
522 if key_input.just_pressed(KeyCode::Digit2)
523 && let Some(robot_light_material) = robot_light_material
524 {
525 let mut material = materials.get_mut(&robot_light_material.0).unwrap();
526 if material.emissive == LinearRgba::BLACK {
527 material.emissive = LinearRgba::from(Color::srgb(0.941, 0.714, 0.043)) * 1_000_000.0;
528 } else {
529 material.emissive = LinearRgba::BLACK;
530 }
531 }
532}- examples/ui/window_fallthrough.rs
- examples/testbed/2d.rs
- examples/testbed/3d.rs
- examples/testbed/ui.rs
- examples/ecs/hierarchy.rs
- examples/audio/audio_control.rs
- examples/ecs/observers.rs
- examples/3d/rect_light.rs
- examples/audio/play_sound_effect.rs
- examples/window/scale_factor_override.rs
- examples/input/keyboard_modifiers.rs
- examples/ui/images/ui_texture_atlas.rs
- examples/window/monitor_info.rs
- examples/state/sub_states.rs
- examples/window/screenshot.rs
- examples/stress_tests/many_gizmos.rs
- examples/3d/atmospheric_fog.rs
- examples/window/window_settings.rs
- examples/3d/depth_of_field.rs
- examples/state/computed_states.rs
- examples/input/mouse_input.rs
- examples/ecs/one_shot_systems.rs
- examples/ecs/run_conditions.rs
- examples/input/mouse_grab.rs
- examples/math/bounding_2d.rs
- examples/shader/gpu_readback.rs
- examples/reflection/mutation_by_reflection.rs
- examples/audio/pitch.rs
- examples/app/settings.rs
- examples/ecs/entity_disabling.rs
- examples/ui/text/text_input.rs
- examples/ui/ui_scaling.rs
- examples/window/window_resizing.rs
- examples/dev_tools/infinite_grid.rs
- examples/ui/scroll_and_overflow/overflow_debug.rs
- examples/window/low_power.rs
- examples/ui/text/ime_support.rs
- examples/camera/pan_orbit_camera_cad.rs
- examples/ui/widgets/standard_widgets_observers.rs
- examples/shader_advanced/fullscreen_material.rs
- examples/ui/navigation/directional_navigation.rs
- examples/ui/navigation/directional_navigation_overrides.rs
- examples/showcase/loading_screen.rs
- examples/audio/spatial_audio_2d.rs
- examples/3d/tonemapping.rs
- examples/ui/widgets/standard_widgets.rs
- examples/3d/shadow_caster_receiver.rs
- examples/audio/spatial_audio_3d.rs
- examples/camera/projection_zoom.rs
- examples/showcase/stepping.rs
- examples/math/cubic_splines.rs
- examples/3d/shadow_biases.rs
- examples/window/custom_cursor_image.rs
- examples/window/window_drag_move.rs
- examples/3d/irradiance_volumes.rs
- examples/transforms/align.rs
- examples/testbed/full_ui.rs
- examples/input/keyboard_input.rs
- examples/shader/shader_prepass.rs
- examples/ui/text/multiple_text_inputs.rs
- examples/3d/generate_custom_mesh.rs
- examples/3d/parallax_mapping.rs
- examples/dev_tools/fps_overlay.rs
- examples/ecs/fallible_params.rs
- examples/3d/motion_blur.rs
- examples/3d/order_independent_transparency.rs
- examples/camera/free_camera_controller.rs
- examples/ui/text/letter_spacing.rs
- examples/3d/lighting.rs
- examples/app/render_recovery.rs
- examples/gizmos/light_gizmos.rs
- examples/3d/visibility_range.rs
- examples/3d/volumetric_fog.rs
- examples/stress_tests/many_foxes.rs
- examples/3d/auto_exposure.rs
- examples/3d/post_processing.rs
- examples/diagnostics/log_diagnostics.rs
- examples/3d/reflection_probes.rs
- examples/3d/atmosphere.rs
- examples/3d/wireframe.rs
- examples/3d/blend_modes.rs
- examples/math/random_sampling.rs
- examples/3d/anisotropy.rs
- examples/3d/deferred_rendering.rs
- examples/animation/animated_mesh_control.rs
- examples/camera/pan_orbit_camera_custom_input_plugin.rs
- examples/gizmos/2d_gizmos.rs
- examples/gizmos/3d_gizmos.rs
- examples/3d/ssao.rs
- examples/3d/bloom_3d.rs
- examples/2d/bloom_2d.rs
- examples/3d/anti_aliasing.rs
- examples/3d/transmission.rs
Sourcepub fn any_just_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
pub fn any_just_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if any item in inputs has been pressed during the current frame.
Sourcepub fn clear_just_pressed(&mut self, input: T) -> bool
pub fn clear_just_pressed(&mut self, input: T) -> bool
Clears the just_pressed state of the input and returns true if the input has just been pressed.
Future calls to ButtonInput::just_pressed for the given input will return false until a new press event occurs.
Sourcepub fn just_released(&self, input: T) -> bool
pub fn just_released(&self, input: T) -> bool
Returns true if the input has been released during the current frame.
Note: This function does not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_pressed.
Examples found in repository?
16fn mouse_click_system(mouse_button_input: Res<ButtonInput<MouseButton>>) {
17 if mouse_button_input.pressed(MouseButton::Left) {
18 info!("left mouse currently pressed");
19 }
20
21 if mouse_button_input.just_pressed(MouseButton::Left) {
22 info!("left mouse just pressed");
23 }
24
25 if mouse_button_input.just_released(MouseButton::Left) {
26 info!("left mouse just released");
27 }
28}More examples
299fn mouse_handler(
300 mut commands: Commands,
301 args: Res<Args>,
302 time: Res<Time>,
303 mouse_button_input: Res<ButtonInput<MouseButton>>,
304 cube_resources: ResMut<CubeResources>,
305 mut counter: ResMut<BevyCounter>,
306 mut rng: Local<Option<ChaCha8Rng>>,
307 mut wave: Local<usize>,
308) {
309 if rng.is_none() {
310 *rng = Some(ChaCha8Rng::seed_from_u64(42));
311 }
312 let rng = rng.as_mut().unwrap();
313
314 if mouse_button_input.just_released(MouseButton::Left) {
315 counter.color = Color::linear_rgb(rng.random(), rng.random(), rng.random());
316 }
317
318 if mouse_button_input.pressed(MouseButton::Left) {
319 let spawn_count = (CUBES_PER_SECOND as f64 * time.delta_secs_f64()) as usize;
320 spawn_cubes(
321 &mut commands,
322 args.into_inner(),
323 &mut counter,
324 spawn_count,
325 cube_resources.into_inner(),
326 None,
327 *wave,
328 );
329 *wave += 1;
330 }
331}13fn keyboard_input_system(
14 keyboard_input: Res<ButtonInput<KeyCode>>,
15 key_input: Res<ButtonInput<Key>>,
16) {
17 // KeyCode is used when you want the key location across different keyboard layouts
18 // See https://w3c.github.io/uievents-code/#code-value-tables for the locations
19 if keyboard_input.pressed(KeyCode::KeyA) {
20 info!("'A' currently pressed");
21 }
22
23 if keyboard_input.just_pressed(KeyCode::KeyA) {
24 info!("'A' just pressed");
25 }
26 if keyboard_input.just_released(KeyCode::KeyA) {
27 info!("'A' just released");
28 }
29
30 // Key is used when you want a specific key, no matter where it is located.
31 // This is useful for symbols that have a specific connotation, e.g. '?' for
32 // a help menu or '+'/'-' for zoom
33 let key = Key::Character("?".into());
34 if key_input.pressed(key.clone()) {
35 info!("'?' currently pressed");
36 }
37 if key_input.just_pressed(key.clone()) {
38 info!("'?' just pressed");
39 }
40 if key_input.just_released(key) {
41 info!("'?' just released");
42 }
43}74fn customize_config(input: Res<ButtonInput<KeyCode>>, mut overlay: ResMut<FpsOverlayConfig>) {
75 if input.just_pressed(KeyCode::Digit1) {
76 // Changing resource will affect overlay
77 if overlay.text_color == OverlayColor::GREEN {
78 overlay.text_color = OverlayColor::RED;
79 } else {
80 overlay.text_color = OverlayColor::GREEN;
81 }
82 }
83
84 // The font size only adjustable when using `Px` units
85 if let FontSize::Px(mut px_font_size) = overlay.text_config.font_size {
86 if input.just_pressed(KeyCode::Digit2) {
87 px_font_size = (px_font_size - 2.).max(2.);
88 }
89 if input.just_pressed(KeyCode::Digit3) {
90 px_font_size += 2.;
91 }
92 if FontSize::Px(px_font_size) != overlay.text_config.font_size {
93 overlay.text_config.font_size = FontSize::Px(px_font_size);
94 }
95 }
96
97 if input.just_pressed(KeyCode::Digit4) {
98 overlay.enabled = !overlay.enabled;
99 }
100 if input.just_released(KeyCode::Digit5) {
101 overlay.frame_time_graph_config.enabled = !overlay.frame_time_graph_config.enabled;
102 }
103}321fn mouse_handler(
322 mut commands: Commands,
323 args: Res<Args>,
324 time: Res<Time>,
325 mouse_button_input: Res<ButtonInput<MouseButton>>,
326 window: Query<&Window>,
327 bird_resources: ResMut<BirdResources>,
328 mut counter: ResMut<BevyCounter>,
329 mut rng: Local<Option<ChaCha8Rng>>,
330 mut wave: Local<usize>,
331) {
332 let Ok(window) = window.single() else {
333 return;
334 };
335
336 if rng.is_none() {
337 // We're seeding the PRNG here to make this example deterministic for testing purposes.
338 // This isn't strictly required in practical use unless you need your app to be deterministic.
339 *rng = Some(ChaCha8Rng::seed_from_u64(500));
340 }
341 let rng = rng.as_mut().unwrap();
342
343 if mouse_button_input.just_released(MouseButton::Left) {
344 counter.color = Color::linear_rgb(rng.random(), rng.random(), rng.random());
345 }
346
347 if mouse_button_input.pressed(MouseButton::Left) {
348 let spawn_count = (BIRDS_PER_SECOND as f64 * time.delta_secs_f64()) as usize;
349 spawn_birds(
350 &mut commands,
351 args.into_inner(),
352 &window.resolution,
353 &mut counter,
354 spawn_count,
355 bird_resources.into_inner(),
356 None,
357 *wave,
358 );
359 *wave += 1;
360 }
361}Sourcepub fn any_just_released(&self, inputs: impl IntoIterator<Item = T>) -> bool
pub fn any_just_released(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if any item in inputs has just been released.
Examples found in repository?
69pub fn custom_camera_inputs(
70 pointers: Query<(&PointerId, &PointerLocation)>,
71 pointer_map: Res<CameraPointerMap>,
72 mut controller: MessageWriter<PanOrbitCameraInputMessage>,
73 mut mouse_wheel: MessageReader<MouseWheel>,
74 mouse_input: Res<ButtonInput<MouseButton>>,
75 cameras: Query<(Entity, &Camera, &RenderTarget, &PanOrbitCamera)>,
76 primary_window: Query<Entity, With<PrimaryWindow>>,
77) {
78 let orbit_start = MouseButton::Right;
79 let pan_start = MouseButton::Left;
80 let zoom_stop = 0.0;
81
82 if let Some(&camera) = pointer_map.get(&PointerId::Mouse) {
83 let camera_query = cameras.get(camera).ok();
84 let is_in_zoom_mode = camera_query
85 .map(|(.., editor_cam)| editor_cam.current_motion.is_zooming_only())
86 .unwrap_or_default();
87 let zoom_amount_abs = camera_query
88 .and_then(|(.., editor_cam)| {
89 editor_cam
90 .current_motion
91 .inputs()
92 .map(|inputs| inputs.zoom_velocity_abs(editor_cam.smoothing.zoom.mul_f32(2.0)))
93 })
94 .unwrap_or(0.0);
95 let should_zoom_end = is_in_zoom_mode && zoom_amount_abs <= zoom_stop;
96
97 if mouse_input.any_just_released([orbit_start, pan_start]) || should_zoom_end {
98 controller.write(PanOrbitCameraInputMessage::End { camera });
99 }
100 }
101
102 for (&pointer, pointer_location) in pointers
103 .iter()
104 .filter_map(|(id, loc)| loc.location().map(|loc| (id, loc)))
105 {
106 match pointer {
107 PointerId::Mouse => {
108 let Some((camera, ..)) = cameras.iter().find(|(_, camera, render_target, _)| {
109 pointer_location.is_in_viewport(camera, render_target, &primary_window)
110 }) else {
111 continue; // Pointer must be in viewport to start a motion.
112 };
113
114 if mouse_input.just_pressed(orbit_start) {
115 controller.write(PanOrbitCameraInputMessage::Start {
116 kind: MotionKind::OrbitZoom,
117 camera,
118 pointer,
119 });
120 } else if mouse_input.just_pressed(pan_start) {
121 controller.write(PanOrbitCameraInputMessage::Start {
122 kind: MotionKind::PanZoom,
123 camera,
124 pointer,
125 });
126 } else if mouse_wheel.read().map(|mw| mw.y.abs()).sum::<f32>() > 0.0 {
127 // Note we can't just check if the mouse wheel inputs are empty, we need to
128 // check if the y value abs greater than zero, otherwise we get a bunch of false
129 // positives, which can cause issues with figuring out what the user is trying
130 // to do.
131 controller.write(PanOrbitCameraInputMessage::Start {
132 kind: MotionKind::Zoom,
133 camera,
134 pointer,
135 });
136 }
137 }
138 PointerId::Touch(_) | PointerId::Custom(_) => continue,
139 }
140 }
141
142 // This must be cleared manually because reading these inputs is conditional - we are not
143 // guaranteed to be flushing the events every frame.
144 mouse_wheel.clear();
145}Sourcepub fn all_just_released(&self, inputs: impl IntoIterator<Item = T>) -> bool
pub fn all_just_released(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if all items in inputs have just been released.
Sourcepub fn all_just_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
pub fn all_just_pressed(&self, inputs: impl IntoIterator<Item = T>) -> bool
Returns true if all items in inputs have been just pressed.
Sourcepub fn clear_just_released(&mut self, input: T) -> bool
pub fn clear_just_released(&mut self, input: T) -> bool
Clears the just_released state of the input and returns true if the input has just been released.
Future calls to ButtonInput::just_released for the given input will return false until a new release event occurs.
Sourcepub fn reset(&mut self, input: T)
pub fn reset(&mut self, input: T)
Clears the pressed, just_pressed and just_released data of the input.
Sourcepub fn reset_all(&mut self)
pub fn reset_all(&mut self)
Clears the pressed, just_pressed, and just_released data for every input.
See also ButtonInput::clear for simulating elapsed time steps.
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clears the just pressed and just released data for every input.
See also ButtonInput::reset_all for a full reset.
Sourcepub fn get_pressed(&self) -> impl ExactSizeIterator
pub fn get_pressed(&self) -> impl ExactSizeIterator
An iterator visiting every pressed input in arbitrary order.
Sourcepub fn get_just_pressed(&self) -> impl ExactSizeIterator
pub fn get_just_pressed(&self) -> impl ExactSizeIterator
An iterator visiting every just pressed input in arbitrary order.
Note: Returned elements do not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_released.
Examples found in repository?
136fn trigger_hooks(
137 mut commands: Commands,
138 keys: Res<ButtonInput<KeyCode>>,
139 index: Res<MyComponentIndex>,
140) {
141 for (key, entity) in index.iter() {
142 if !keys.pressed(*key) {
143 commands.entity(*entity).remove::<MyComponent>();
144 }
145 }
146 for key in keys.get_just_pressed() {
147 commands.spawn(MyComponent(*key));
148 }
149}Sourcepub fn get_just_released(&self) -> impl ExactSizeIterator
pub fn get_just_released(&self) -> impl ExactSizeIterator
An iterator visiting every just released input in arbitrary order.
Note: Returned elements do not imply information regarding the current state of ButtonInput::pressed or ButtonInput::just_pressed.
Trait Implementations§
Source§impl<T> Clone for ButtonInput<T>
impl<T> Clone for ButtonInput<T>
Source§fn clone(&self) -> ButtonInput<T>
fn clone(&self) -> ButtonInput<T>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T> Component for ButtonInput<T>
impl<T> Component for ButtonInput<T>
Source§const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::SparseSet
const STORAGE_TYPE: StorageType = bevy_ecs::component::StorageType::SparseSet
Source§type Mutability = Mutable
type Mutability = Mutable
Component<Mutability = Mutable>,
while immutable components will instead have Component<Mutability = Immutable>. Read moreSource§fn register_required_components(
_requiree: ComponentId,
required_components: &mut RequiredComponentsRegistrator<'_, '_>,
)
fn register_required_components( _requiree: ComponentId, required_components: &mut RequiredComponentsRegistrator<'_, '_>, )
Source§fn clone_behavior() -> ComponentCloneBehavior
fn clone_behavior() -> ComponentCloneBehavior
Source§fn relationship_accessor() -> Option<ComponentRelationshipAccessor<ButtonInput<T>>>
fn relationship_accessor() -> Option<ComponentRelationshipAccessor<ButtonInput<T>>>
ComponentRelationshipAccessor required for working with relationships in dynamic contexts. Read moreSource§fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_add() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_insert() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_discard() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_remove() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
fn on_despawn() -> Option<for<'w> fn(DeferredWorld<'w>, HookContext)>
Source§fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
fn map_entities<E>(_this: &mut Self, _mapper: &mut E)where
E: EntityMapper,
EntityMapper. This is used to remap entities in contexts like scenes and entity cloning.
When deriving Component, this is populated by annotating fields containing entities with #[entities] Read moreSource§const HAS_SUMMARY_TICK: bool = false
const HAS_SUMMARY_TICK: bool = false
Source§impl<T> Debug for ButtonInput<T>
impl<T> Debug for ButtonInput<T>
Source§impl<T> Default for ButtonInput<T>
impl<T> Default for ButtonInput<T>
Source§fn default() -> ButtonInput<T>
fn default() -> ButtonInput<T>
Source§impl<T> FromArg for ButtonInput<T>
impl<T> FromArg for ButtonInput<T>
Source§impl<T> FromReflect for ButtonInput<T>
impl<T> FromReflect for ButtonInput<T>
Source§fn from_reflect(
reflect: &(dyn PartialReflect + 'static),
) -> Option<ButtonInput<T>>
fn from_reflect( reflect: &(dyn PartialReflect + 'static), ) -> Option<ButtonInput<T>>
Self from a reflected value.Source§fn take_from_reflect(
reflect: Box<dyn PartialReflect>,
) -> Result<Self, Box<dyn PartialReflect>>
fn take_from_reflect( reflect: Box<dyn PartialReflect>, ) -> Result<Self, Box<dyn PartialReflect>>
Self using,
constructing the value using from_reflect if that fails. Read moreSource§impl<T> GetOwnership for ButtonInput<T>
impl<T> GetOwnership for ButtonInput<T>
Source§impl<T> GetTypeRegistration for ButtonInput<T>
impl<T> GetTypeRegistration for ButtonInput<T>
Source§fn get_type_registration() -> TypeRegistration
fn get_type_registration() -> TypeRegistration
TypeRegistration for this type.Source§fn register_type_dependencies(registry: &mut TypeRegistry)
fn register_type_dependencies(registry: &mut TypeRegistry)
Source§impl<T> IntoReturn for ButtonInput<T>
impl<T> IntoReturn for ButtonInput<T>
Source§fn into_return<'into_return>(self) -> Return<'into_return>where
ButtonInput<T>: 'into_return,
fn into_return<'into_return>(self) -> Return<'into_return>where
ButtonInput<T>: 'into_return,
Source§impl<T> PartialReflect for ButtonInput<T>
impl<T> PartialReflect for ButtonInput<T>
Source§fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
fn get_represented_type_info(&self) -> Option<&'static TypeInfo>
Source§fn try_apply(
&mut self,
value: &(dyn PartialReflect + 'static),
) -> Result<(), ApplyError>
fn try_apply( &mut self, value: &(dyn PartialReflect + 'static), ) -> Result<(), ApplyError>
Source§fn reflect_kind(&self) -> ReflectKind
fn reflect_kind(&self) -> ReflectKind
Source§fn reflect_ref(&self) -> ReflectRef<'_>
fn reflect_ref(&self) -> ReflectRef<'_>
Source§fn reflect_mut(&mut self) -> ReflectMut<'_>
fn reflect_mut(&mut self) -> ReflectMut<'_>
Source§fn reflect_owned(self: Box<ButtonInput<T>>) -> ReflectOwned
fn reflect_owned(self: Box<ButtonInput<T>>) -> ReflectOwned
Source§fn try_into_reflect(
self: Box<ButtonInput<T>>,
) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
fn try_into_reflect( self: Box<ButtonInput<T>>, ) -> Result<Box<dyn Reflect>, Box<dyn PartialReflect>>
Source§fn try_as_reflect(&self) -> Option<&(dyn Reflect + 'static)>
fn try_as_reflect(&self) -> Option<&(dyn Reflect + 'static)>
Source§fn try_as_reflect_mut(&mut self) -> Option<&mut (dyn Reflect + 'static)>
fn try_as_reflect_mut(&mut self) -> Option<&mut (dyn Reflect + 'static)>
Source§fn into_partial_reflect(self: Box<ButtonInput<T>>) -> Box<dyn PartialReflect>
fn into_partial_reflect(self: Box<ButtonInput<T>>) -> Box<dyn PartialReflect>
Source§fn as_partial_reflect(&self) -> &(dyn PartialReflect + 'static)
fn as_partial_reflect(&self) -> &(dyn PartialReflect + 'static)
Source§fn as_partial_reflect_mut(&mut self) -> &mut (dyn PartialReflect + 'static)
fn as_partial_reflect_mut(&mut self) -> &mut (dyn PartialReflect + 'static)
Source§fn reflect_partial_eq(
&self,
value: &(dyn PartialReflect + 'static),
) -> Option<bool>
fn reflect_partial_eq( &self, value: &(dyn PartialReflect + 'static), ) -> Option<bool>
Source§fn reflect_partial_cmp(
&self,
value: &(dyn PartialReflect + 'static),
) -> Option<Ordering>
fn reflect_partial_cmp( &self, value: &(dyn PartialReflect + 'static), ) -> Option<Ordering>
Source§fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError>
fn reflect_clone(&self) -> Result<Box<dyn Reflect>, ReflectCloneError>
Self using reflection. Read moreSource§fn apply(&mut self, value: &(dyn PartialReflect + 'static))
fn apply(&mut self, value: &(dyn PartialReflect + 'static))
Source§fn to_dynamic(&self) -> Result<Box<dyn PartialReflect>, ReflectCloneError>
fn to_dynamic(&self) -> Result<Box<dyn PartialReflect>, ReflectCloneError>
Source§fn reflect_clone_and_take<T>(&self) -> Result<T, ReflectCloneError>
fn reflect_clone_and_take<T>(&self) -> Result<T, ReflectCloneError>
PartialReflect, combines reflect_clone and
take in a useful fashion, automatically constructing an appropriate
ReflectCloneError if the downcast fails.Source§fn reflect_hash(&self) -> Option<u64>
fn reflect_hash(&self) -> Option<u64>
Source§fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
fn debug(&self, f: &mut Formatter<'_>) -> Result<(), Error>
Source§fn is_dynamic(&self) -> bool
fn is_dynamic(&self) -> bool
Source§impl<T> Reflect for ButtonInput<T>
impl<T> Reflect for ButtonInput<T>
Source§fn into_any(self: Box<ButtonInput<T>>) -> Box<dyn Any>
fn into_any(self: Box<ButtonInput<T>>) -> Box<dyn Any>
Box<dyn Any>. Read moreSource§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut dyn Any. Read moreSource§fn into_reflect(self: Box<ButtonInput<T>>) -> Box<dyn Reflect>
fn into_reflect(self: Box<ButtonInput<T>>) -> Box<dyn Reflect>
Source§fn as_reflect(&self) -> &(dyn Reflect + 'static)
fn as_reflect(&self) -> &(dyn Reflect + 'static)
Source§fn as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)
fn as_reflect_mut(&mut self) -> &mut (dyn Reflect + 'static)
impl<T> Resource for ButtonInput<T>
Source§impl<T> Struct for ButtonInput<T>
impl<T> Struct for ButtonInput<T>
Source§fn field(&self, name: &str) -> Option<&(dyn PartialReflect + 'static)>
fn field(&self, name: &str) -> Option<&(dyn PartialReflect + 'static)>
name as a &dyn PartialReflect.Source§fn field_mut(
&mut self,
name: &str,
) -> Option<&mut (dyn PartialReflect + 'static)>
fn field_mut( &mut self, name: &str, ) -> Option<&mut (dyn PartialReflect + 'static)>
name as a
&mut dyn PartialReflect.Source§fn field_at(&self, index: usize) -> Option<&(dyn PartialReflect + 'static)>
fn field_at(&self, index: usize) -> Option<&(dyn PartialReflect + 'static)>
index as a
&dyn PartialReflect.Source§fn field_at_mut(
&mut self,
index: usize,
) -> Option<&mut (dyn PartialReflect + 'static)>
fn field_at_mut( &mut self, index: usize, ) -> Option<&mut (dyn PartialReflect + 'static)>
index
as a &mut dyn PartialReflect.Source§fn index_of_name(&self, name: &str) -> Option<usize>
fn index_of_name(&self, name: &str) -> Option<usize>
Source§fn iter_fields(&self) -> FieldIter<'_> ⓘ
fn iter_fields(&self) -> FieldIter<'_> ⓘ
Source§fn to_dynamic_struct(&self) -> Result<DynamicStruct, ReflectCloneError>
fn to_dynamic_struct(&self) -> Result<DynamicStruct, ReflectCloneError>
DynamicStruct from this struct. Read moreSource§fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
fn get_represented_struct_info(&self) -> Option<&'static StructInfo>
None if TypeInfo is not available.Source§impl<T> TypePath for ButtonInput<T>
impl<T> TypePath for ButtonInput<T>
Source§fn type_path() -> &'static str
fn type_path() -> &'static str
Source§fn short_type_path() -> &'static str
fn short_type_path() -> &'static str
Source§fn type_ident() -> Option<&'static str>
fn type_ident() -> Option<&'static str>
Source§fn crate_name() -> Option<&'static str>
fn crate_name() -> Option<&'static str>
Source§impl<T> Typed for ButtonInput<T>
impl<T> Typed for ButtonInput<T>
Auto Trait Implementations§
impl<T> Freeze for ButtonInput<T>
impl<T> RefUnwindSafe for ButtonInput<T>where
HashSet<T>: RefUnwindSafe,
impl<T> Send for ButtonInput<T>
impl<T> Sync for ButtonInput<T>
impl<T> Unpin for ButtonInput<T>
impl<T> UnsafeUnpin for ButtonInput<T>where
HashSet<T>: UnsafeUnpin,
impl<T> UnwindSafe for ButtonInput<T>where
HashSet<T>: UnwindSafe,
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T ShaderType for self. When used in AsBindGroup
derives, it is safe to assume that all images in self exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<C> Bundle for Cwhere
C: Component,
impl<C> Bundle for Cwhere
C: Component,
fn component_ids( components: &mut ComponentsRegistrator<'_>, ) -> impl Iterator<Item = ComponentId> + use<C>
Source§fn get_component_ids(
components: &Components,
) -> impl Iterator<Item = Option<ComponentId>>
fn get_component_ids( components: &Components, ) -> impl Iterator<Item = Option<ComponentId>>
Source§impl<C> BundleFromComponents for Cwhere
C: Component,
impl<C> BundleFromComponents for Cwhere
C: Component,
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> ConditionalSend for Twhere
T: Send,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
Source§impl<C> DynamicBundle for Cwhere
C: Component,
impl<C> DynamicBundle for Cwhere
C: Component,
Source§unsafe fn get_components(
ptr: MovingPtr<'_, C>,
func: &mut impl FnMut(StorageType, OwningPtr<'_>),
) -> <C as DynamicBundle>::Effect
unsafe fn get_components( ptr: MovingPtr<'_, C>, func: &mut impl FnMut(StorageType, OwningPtr<'_>), ) -> <C as DynamicBundle>::Effect
Source§unsafe fn apply_effect(
_ptr: MovingPtr<'_, MaybeUninit<C>>,
_entity: &mut EntityWorldMut<'_>,
)
unsafe fn apply_effect( _ptr: MovingPtr<'_, MaybeUninit<C>>, _entity: &mut EntityWorldMut<'_>, )
Source§impl<T> DynamicTypePath for Twhere
T: TypePath,
impl<T> DynamicTypePath for Twhere
T: TypePath,
Source§fn reflect_type_path(&self) -> &str
fn reflect_type_path(&self) -> &str
TypePath::type_path.Source§fn reflect_short_type_path(&self) -> &str
fn reflect_short_type_path(&self) -> &str
Source§fn reflect_type_ident(&self) -> Option<&str>
fn reflect_type_ident(&self) -> Option<&str>
TypePath::type_ident.Source§fn reflect_crate_name(&self) -> Option<&str>
fn reflect_crate_name(&self) -> Option<&str>
TypePath::crate_name.Source§fn reflect_module_path(&self) -> Option<&str>
fn reflect_module_path(&self) -> Option<&str>
Source§impl<T> DynamicTyped for Twhere
T: Typed,
impl<T> DynamicTyped for Twhere
T: Typed,
Source§fn reflect_type_info(&self) -> &'static TypeInfo
fn reflect_type_info(&self) -> &'static TypeInfo
Typed::type_info.Source§impl<T> ErasedBundleTemplate for T
impl<T> ErasedBundleTemplate for T
Source§unsafe fn apply(
&self,
context: &mut TemplateContext<'_, '_>,
) -> Result<(), BevyError>
unsafe fn apply( &self, context: &mut TemplateContext<'_, '_>, ) -> Result<(), BevyError>
entity. Read moreSource§fn clone_template(&self) -> Box<dyn ErasedBundleTemplate>
fn clone_template(&self) -> Box<dyn ErasedBundleTemplate>
Clone.impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> ErasedTemplate for T
impl<T> ErasedTemplate for T
Source§unsafe fn apply(
&self,
context: &mut TemplateContext<'_, '_>,
bundle_writer: &mut BundleWriter<'_>,
) -> Result<(), BevyError>
unsafe fn apply( &self, context: &mut TemplateContext<'_, '_>, bundle_writer: &mut BundleWriter<'_>, ) -> Result<(), BevyError>
entity. Read moreSource§fn clone_template(&self) -> Box<dyn ErasedTemplate>
fn clone_template(&self) -> Box<dyn ErasedTemplate>
Clone.Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> FromTemplate for T
impl<T> FromTemplate for T
Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self using default().
Source§impl<S> GetField for Swhere
S: Struct,
impl<S> GetField for Swhere
S: Struct,
Source§impl<T> GetPath for T
impl<T> GetPath for T
Source§fn reflect_path<'p>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path<'p>( &self, path: impl ReflectPath<'p>, ) -> Result<&(dyn PartialReflect + 'static), ReflectPathError<'p>>
path. Read moreSource§fn reflect_path_mut<'p>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
fn reflect_path_mut<'p>( &mut self, path: impl ReflectPath<'p>, ) -> Result<&mut (dyn PartialReflect + 'static), ReflectPathError<'p>>
path. Read moreSource§fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
fn path<'p, T>(
&self,
path: impl ReflectPath<'p>,
) -> Result<&T, ReflectPathError<'p>>where
T: Reflect,
path. Read moreSource§fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
fn path_mut<'p, T>(
&mut self,
path: impl ReflectPath<'p>,
) -> Result<&mut T, ReflectPathError<'p>>where
T: Reflect,
path. Read moreSource§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T> HitDataExtra for T
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
Source§impl<T> InitializeFromFunction<T> for T
impl<T> InitializeFromFunction<T> for T
Source§fn initialize_from_function(f: fn() -> T) -> T
fn initialize_from_function(f: fn() -> T) -> T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
Source§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<G> PatchFromTemplate for Gwhere
G: FromTemplate,
impl<G> PatchFromTemplate for Gwhere
G: FromTemplate,
Source§fn patch<F>(func: F) -> TemplatePatch<F, <G as PatchFromTemplate>::Template>
fn patch<F>(func: F) -> TemplatePatch<F, <G as PatchFromTemplate>::Template>
func, and turns it into a TemplatePatch.Source§impl<T> PatchTemplate for Twhere
T: Template,
impl<T> PatchTemplate for Twhere
T: Template,
Source§fn patch_template<F>(func: F) -> TemplatePatch<F, T>
fn patch_template<F>(func: F) -> TemplatePatch<F, T>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().impl<T> Reflectable for T
Source§impl<C> SceneEffect for Cwhere
C: Component,
impl<C> SceneEffect for Cwhere
C: Component,
Source§fn apply(
self,
context: &mut TemplateContext<'_, '_>,
bundle_writer: &mut BundleWriter<'_>,
)
fn apply( self, context: &mut TemplateContext<'_, '_>, bundle_writer: &mut BundleWriter<'_>, )
impl<T> Settings for T
Source§impl<Ret> SpawnIfAsync<(), Ret> for Ret
impl<Ret> SpawnIfAsync<(), Ret> for Ret
Source§impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
impl<T, O> SuperFrom<T> for Owhere
O: From<T>,
Source§fn super_from(input: T) -> O
fn super_from(input: T) -> O
Source§impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
impl<T, O, M> SuperInto<O, M> for Twhere
O: SuperFrom<T, M>,
Source§fn super_into(self) -> O
fn super_into(self) -> O
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.Source§impl<T> Template for T
impl<T> Template for T
Source§fn build_template(
&self,
_context: &mut TemplateContext<'_, '_>,
) -> Result<<T as Template>::Output, BevyError>
fn build_template( &self, _context: &mut TemplateContext<'_, '_>, ) -> Result<<T as Template>::Output, BevyError>
entity context to produce a Template::Output.Source§fn clone_template(&self) -> T
fn clone_template(&self) -> T
Clone.Source§impl<T, U> ToSample<U> for Twhere
U: FromSample<T>,
impl<T, U> ToSample<U> for Twhere
U: FromSample<T>,
fn to_sample_(self) -> U
Source§impl<T> TypeData for T
impl<T> TypeData for T
Source§fn clone_type_data(&self) -> Box<dyn TypeData>
fn clone_type_data(&self) -> Box<dyn TypeData>
self.