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}588fn adjust_color_grading_option(
589 mut color_grading: Single<&mut ColorGrading>,
590 input: Res<ButtonInput<KeyCode>>,
591 currently_selected_option: Res<SelectedColorGradingOption>,
592) {
593 let mut delta = 0.0;
594 if input.pressed(KeyCode::ArrowLeft) {
595 delta -= OPTION_ADJUSTMENT_SPEED;
596 }
597 if input.pressed(KeyCode::ArrowRight) {
598 delta += OPTION_ADJUSTMENT_SPEED;
599 }
600
601 if delta != 0.0 {
602 let new_value = currently_selected_option.get(color_grading.as_ref()) + delta;
603 currently_selected_option.set(&mut color_grading, new_value);
604 }
605}152fn handle_keyboard_input(mut app_settings: ResMut<AppSettings>, input: Res<ButtonInput<KeyCode>>) {
153 let mut delta = 0.0;
154 if input.pressed(KeyCode::ArrowLeft) {
155 delta -= CHROMATIC_ABERRATION_INTENSITY_ADJUSTMENT_SPEED;
156 } else if input.pressed(KeyCode::ArrowRight) {
157 delta += CHROMATIC_ABERRATION_INTENSITY_ADJUSTMENT_SPEED;
158 }
159
160 // If no arrow key was pressed, just bail out.
161 if delta == 0.0 {
162 return;
163 }
164
165 app_settings.chromatic_aberration_intensity = (app_settings.chromatic_aberration_intensity
166 + delta)
167 .clamp(0.0, MAX_CHROMATIC_ABERRATION_INTENSITY);
168}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/depth_of_field.rs
- examples/ui/ui_transform.rs
- examples/games/breakout.rs
- examples/state/computed_states.rs
- examples/3d/reflection_probes.rs
- examples/3d/spotlight.rs
- examples/3d/volumetric_fog.rs
- examples/input/keyboard_input.rs
- examples/3d/generate_custom_mesh.rs
- examples/3d/irradiance_volumes.rs
- examples/stress_tests/bevymark.rs
- examples/3d/mixed_lighting.rs
- examples/testbed/full_ui.rs
- examples/gizmos/light_gizmos.rs
- examples/3d/ssr.rs
- examples/2d/rotation.rs
- examples/shader_advanced/render_depth_to_texture.rs
- examples/3d/visibility_range.rs
- examples/3d/tonemapping.rs
- examples/3d/auto_exposure.rs
- examples/camera/camera_orbit.rs
- examples/movement/physics_in_fixed_timestep.rs
- examples/3d/clustered_decals.rs
- examples/games/alien_cake_addict.rs
- examples/3d/light_textures.rs
- examples/gizmos/2d_gizmos.rs
- examples/3d/blend_modes.rs
- examples/2d/2d_viewport_to_world.rs
- examples/gizmos/3d_gizmos.rs
- examples/3d/../helpers/camera_controller.rs
- examples/3d/bloom_3d.rs
- examples/3d/fog.rs
- examples/2d/bloom_2d.rs
- examples/3d/transmission.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
25fn send_scroll_events(
26 mut mouse_wheel_reader: MessageReader<MouseWheel>,
27 hover_map: Res<HoverMap>,
28 keyboard_input: Res<ButtonInput<KeyCode>>,
29 mut commands: Commands,
30) {
31 for mouse_wheel in mouse_wheel_reader.read() {
32 let mut delta = -Vec2::new(mouse_wheel.x, mouse_wheel.y);
33
34 if mouse_wheel.unit == MouseScrollUnit::Line {
35 delta *= LINE_HEIGHT;
36 }
37
38 if keyboard_input.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight]) {
39 std::mem::swap(&mut delta.x, &mut delta.y);
40 }
41
42 for pointer_map in hover_map.values() {
43 for entity in pointer_map.keys().copied() {
44 commands.trigger(Scroll { entity, delta });
45 }
46 }
47 }
48}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
- examples/3d/solari.rs
- examples/testbed/2d.rs
- examples/testbed/3d.rs
- examples/testbed/ui.rs
- examples/audio/audio_control.rs
- examples/window/scale_factor_override.rs
- examples/input/keyboard_modifiers.rs
- examples/ui/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/state/custom_transitions.rs
- examples/ecs/one_shot_systems.rs
- examples/ecs/run_conditions.rs
- examples/input/text_input.rs
- examples/input/mouse_grab.rs
- examples/math/bounding_2d.rs
- examples/audio/pitch.rs
- examples/ecs/entity_disabling.rs
- examples/ui/ui_scaling.rs
- examples/window/window_resizing.rs
- examples/ui/overflow_debug.rs
- examples/window/low_power.rs
- examples/shader/shader_material_wesl.rs
- examples/ecs/observers.rs
- examples/window/custom_user_event.rs
- examples/ui/standard_widgets_observers.rs
- examples/games/loading_screen.rs
- examples/audio/spatial_audio_2d.rs
- examples/ui/standard_widgets.rs
- examples/3d/tonemapping.rs
- examples/3d/shadow_caster_receiver.rs
- examples/audio/spatial_audio_3d.rs
- examples/dev_tools/fps_overlay.rs
- examples/camera/projection_zoom.rs
- examples/games/stepping.rs
- examples/math/cubic_splines.rs
- examples/3d/clearcoat.rs
- examples/3d/shadow_biases.rs
- examples/3d/occlusion_culling.rs
- examples/window/custom_cursor_image.rs
- examples/3d/order_independent_transparency.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/directional_navigation.rs
- examples/3d/generate_custom_mesh.rs
- examples/3d/parallax_mapping.rs
- examples/ecs/fallible_params.rs
- examples/3d/motion_blur.rs
- examples/3d/wireframe.rs
- examples/2d/wireframe_2d.rs
- examples/3d/lighting.rs
- examples/gizmos/light_gizmos.rs
- examples/3d/specular_tint.rs
- examples/3d/visibility_range.rs
- examples/3d/volumetric_fog.rs
- examples/stress_tests/many_foxes.rs
- examples/3d/auto_exposure.rs
- examples/diagnostics/log_diagnostics.rs
- examples/3d/ssr.rs
- examples/3d/reflection_probes.rs
- examples/gizmos/2d_gizmos.rs
- examples/3d/blend_modes.rs
- examples/math/random_sampling.rs
- examples/3d/anisotropy.rs
- examples/3d/deferred_rendering.rs
- examples/math/sampling_primitives.rs
- examples/animation/animated_mesh_control.rs
- examples/gizmos/3d_gizmos.rs
- examples/3d/ssao.rs
- examples/3d/../helpers/camera_controller.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
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 if input.just_pressed(KeyCode::Digit2) {
84 overlay.text_config.font_size -= 2.0;
85 }
86 if input.just_pressed(KeyCode::Digit3) {
87 overlay.text_config.font_size += 2.0;
88 }
89 if input.just_pressed(KeyCode::Digit4) {
90 overlay.enabled = !overlay.enabled;
91 }
92 if input.just_released(KeyCode::Digit5) {
93 overlay.frame_time_graph_config.enabled = !overlay.frame_time_graph_config.enabled;
94 }
95}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}319fn mouse_handler(
320 mut commands: Commands,
321 args: Res<Args>,
322 time: Res<Time>,
323 mouse_button_input: Res<ButtonInput<MouseButton>>,
324 window: Query<&Window>,
325 bird_resources: ResMut<BirdResources>,
326 mut counter: ResMut<BevyCounter>,
327 mut rng: Local<Option<ChaCha8Rng>>,
328 mut wave: Local<usize>,
329) {
330 let Ok(window) = window.single() else {
331 return;
332 };
333
334 if rng.is_none() {
335 // We're seeding the PRNG here to make this example deterministic for testing purposes.
336 // This isn't strictly required in practical use unless you need your app to be deterministic.
337 *rng = Some(ChaCha8Rng::seed_from_u64(42));
338 }
339 let rng = rng.as_mut().unwrap();
340
341 if mouse_button_input.just_released(MouseButton::Left) {
342 counter.color = Color::linear_rgb(rng.random(), rng.random(), rng.random());
343 }
344
345 if mouse_button_input.pressed(MouseButton::Left) {
346 let spawn_count = (BIRDS_PER_SECOND as f64 * time.delta_secs_f64()) as usize;
347 spawn_birds(
348 &mut commands,
349 args.into_inner(),
350 &window.resolution,
351 &mut counter,
352 spawn_count,
353 bird_resources.into_inner(),
354 None,
355 *wave,
356 );
357 *wave += 1;
358 }
359}127fn run_camera_controller(
128 time: Res<Time<Real>>,
129 mut windows: Query<(&Window, &mut CursorOptions)>,
130 accumulated_mouse_motion: Res<AccumulatedMouseMotion>,
131 accumulated_mouse_scroll: Res<AccumulatedMouseScroll>,
132 mouse_button_input: Res<ButtonInput<MouseButton>>,
133 key_input: Res<ButtonInput<KeyCode>>,
134 mut toggle_cursor_grab: Local<bool>,
135 mut mouse_cursor_grab: Local<bool>,
136 mut query: Query<(&mut Transform, &mut CameraController), With<Camera>>,
137) {
138 let dt = time.delta_secs();
139
140 let Ok((mut transform, mut controller)) = query.single_mut() else {
141 return;
142 };
143
144 if !controller.initialized {
145 let (yaw, pitch, _roll) = transform.rotation.to_euler(EulerRot::YXZ);
146 controller.yaw = yaw;
147 controller.pitch = pitch;
148 controller.initialized = true;
149 info!("{}", *controller);
150 }
151 if !controller.enabled {
152 return;
153 }
154
155 let mut scroll = 0.0;
156
157 let amount = match accumulated_mouse_scroll.unit {
158 MouseScrollUnit::Line => accumulated_mouse_scroll.delta.y,
159 MouseScrollUnit::Pixel => accumulated_mouse_scroll.delta.y / 16.0,
160 };
161 scroll += amount;
162 controller.walk_speed += scroll * controller.scroll_factor * controller.walk_speed;
163 controller.run_speed = controller.walk_speed * 3.0;
164
165 // Handle key input
166 let mut axis_input = Vec3::ZERO;
167 if key_input.pressed(controller.key_forward) {
168 axis_input.z += 1.0;
169 }
170 if key_input.pressed(controller.key_back) {
171 axis_input.z -= 1.0;
172 }
173 if key_input.pressed(controller.key_right) {
174 axis_input.x += 1.0;
175 }
176 if key_input.pressed(controller.key_left) {
177 axis_input.x -= 1.0;
178 }
179 if key_input.pressed(controller.key_up) {
180 axis_input.y += 1.0;
181 }
182 if key_input.pressed(controller.key_down) {
183 axis_input.y -= 1.0;
184 }
185
186 let mut cursor_grab_change = false;
187 if key_input.just_pressed(controller.keyboard_key_toggle_cursor_grab) {
188 *toggle_cursor_grab = !*toggle_cursor_grab;
189 cursor_grab_change = true;
190 }
191 if mouse_button_input.just_pressed(controller.mouse_key_cursor_grab) {
192 *mouse_cursor_grab = true;
193 cursor_grab_change = true;
194 }
195 if mouse_button_input.just_released(controller.mouse_key_cursor_grab) {
196 *mouse_cursor_grab = false;
197 cursor_grab_change = true;
198 }
199 let cursor_grab = *mouse_cursor_grab || *toggle_cursor_grab;
200
201 // Update velocity
202 if axis_input != Vec3::ZERO {
203 let max_speed = if key_input.pressed(controller.key_run) {
204 controller.run_speed
205 } else {
206 controller.walk_speed
207 };
208 controller.velocity = axis_input.normalize() * max_speed;
209 } else {
210 let friction = controller.friction.clamp(0.0, 1.0);
211 controller.velocity *= 1.0 - friction;
212 if controller.velocity.length_squared() < 1e-6 {
213 controller.velocity = Vec3::ZERO;
214 }
215 }
216
217 // Apply movement update
218 if controller.velocity != Vec3::ZERO {
219 let forward = *transform.forward();
220 let right = *transform.right();
221 transform.translation += controller.velocity.x * dt * right
222 + controller.velocity.y * dt * Vec3::Y
223 + controller.velocity.z * dt * forward;
224 }
225
226 // Handle cursor grab
227 if cursor_grab_change {
228 if cursor_grab {
229 for (window, mut cursor_options) in &mut windows {
230 if !window.focused {
231 continue;
232 }
233
234 cursor_options.grab_mode = CursorGrabMode::Locked;
235 cursor_options.visible = false;
236 }
237 } else {
238 for (_, mut cursor_options) in &mut windows {
239 cursor_options.grab_mode = CursorGrabMode::None;
240 cursor_options.visible = true;
241 }
242 }
243 }
244
245 // Handle mouse input
246 if accumulated_mouse_motion.delta != Vec2::ZERO && cursor_grab {
247 // Apply look update
248 controller.pitch = (controller.pitch
249 - accumulated_mouse_motion.delta.y * RADIANS_PER_DOT * controller.sensitivity)
250 .clamp(-PI / 2., PI / 2.);
251 controller.yaw -=
252 accumulated_mouse_motion.delta.x * RADIANS_PER_DOT * controller.sensitivity;
253 transform.rotation = Quat::from_euler(EulerRot::ZYX, 0.0, controller.yaw, controller.pitch);
254 }
255}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.
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 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§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_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) -> Box<dyn PartialReflect>
fn to_dynamic(&self) -> Box<dyn PartialReflect>
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. Read moreSource§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)
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 name_at(&self, index: usize) -> Option<&str>
fn name_at(&self, index: usize) -> Option<&str>
index.Source§fn iter_fields(&self) -> FieldIter<'_> ⓘ
fn iter_fields(&self) -> FieldIter<'_> ⓘ
Source§fn to_dynamic_struct(&self) -> DynamicStruct
fn to_dynamic_struct(&self) -> DynamicStruct
DynamicStruct from this struct.Source§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>
impl<T> Resource for ButtonInput<T>
Auto Trait Implementations§
impl<T> Freeze for ButtonInput<T>
impl<T> RefUnwindSafe for ButtonInput<T>where
T: RefUnwindSafe,
impl<T> Send for ButtonInput<T>
impl<T> Sync for ButtonInput<T>
impl<T> Unpin for ButtonInput<T>where
T: Unpin,
impl<T> UnwindSafe for ButtonInput<T>where
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<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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
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> 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> 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,
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<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.Source§impl<T> Pointable for T
impl<T> Pointable for T
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().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.