mousewheel

This commit is contained in:
2019-07-27 18:52:16 +02:00
parent 21d642ec59
commit d53170c5ce
4 changed files with 51 additions and 11 deletions

View File

@@ -4,11 +4,11 @@ scan_code = 1
[[button]] [[button]]
name = "FORWARD" name = "FORWARD"
mouse = "Left" mouse = "WheelUp"
[[button]] [[button]]
name = "BACKWARD" name = "BACKWARD"
mouse = "Right" mouse = "WheelDown"
[[button]] [[button]]
name = "RELOAD_SHADERS" name = "RELOAD_SHADERS"

View File

@@ -1 +1 @@
input = false input = true

View File

@@ -1,4 +1,4 @@
use winit::{ScanCode, ModifiersState, MouseButton, ElementState}; use winit::{ScanCode, ModifiersState, MouseButton, ElementState, MouseScrollDelta};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::fs; use std::fs;
@@ -74,13 +74,15 @@ impl InputState {
let input = if let Some(scan_code) = bn.scan_code { let input = if let Some(scan_code) = bn.scan_code {
DigitalInput::Keyboard(KeyboardInput { scan_code, modifiers }) DigitalInput::Keyboard(KeyboardInput { scan_code, modifiers })
} else if let Some(button_name) = &bn.mouse { } else if let Some(button_name) = &bn.mouse {
let button = match button_name.to_lowercase().as_str() { let button_name_lower = button_name.to_lowercase();
"left" => MouseButton::Left, match button_name_lower.as_str() {
"middle" => MouseButton::Middle, "left" => DigitalInput::Mouse(MouseInput { button: MouseButton::Left, modifiers }),
"right" => MouseButton::Right, "middle" => DigitalInput::Mouse(MouseInput { button: MouseButton::Middle, modifiers }),
other => MouseButton::Other(other.parse().expect(&format!("Unknown button: {:?}", other))) "right" => DigitalInput::Mouse(MouseInput { button: MouseButton::Right, modifiers }),
}; "wheelup" => DigitalInput::Wheel(WheelInput { direction: WheelInputDirection::Up, modifiers }),
DigitalInput::Mouse(MouseInput { button, modifiers }) "wheeldown" => DigitalInput::Wheel(WheelInput { direction: WheelInputDirection::Down, modifiers }),
other => DigitalInput::Mouse(MouseInput { button: MouseButton::Other(other.parse().expect(&format!("Unknown button: {:?}", other))), modifiers }),
}
} else { } else {
panic!("No mouse or keyboard input for button {:?}", bn.name); panic!("No mouse or keyboard input for button {:?}", bn.name);
}; };
@@ -184,6 +186,9 @@ impl InputState {
DigitalInput::Mouse(mouse_input) => { DigitalInput::Mouse(mouse_input) => {
self.pressed_mouse_buttons.contains(&mouse_input.button) self.pressed_mouse_buttons.contains(&mouse_input.button)
&& self.modifiers_are_pressed(mouse_input.modifiers) && self.modifiers_are_pressed(mouse_input.modifiers)
},
DigitalInput::Wheel(wheel_input) => {
self.input_events.contains(&DigitalInputEvent::Pressed(DigitalInput::Wheel(wheel_input.clone())))
} }
} }
} }
@@ -227,6 +232,16 @@ impl InputState {
} }
} }
pub fn on_mouse_wheel_event(self: &mut Self, delta: &MouseScrollDelta, modifiers: &ModifiersState) {
let direction = match delta {
MouseScrollDelta::LineDelta(_x, y) => if *y >= 0.0 { WheelInputDirection::Up } else { WheelInputDirection::Down },
MouseScrollDelta::PixelDelta(pixels) => if pixels.y >= 0.0 { WheelInputDirection::Up } else { WheelInputDirection::Down },
};
let input = DigitalInput::Wheel(WheelInput { direction, modifiers: modifiers.clone() });
self.input_events.insert(DigitalInputEvent::Pressed(input.clone()));
self.input_events.insert(DigitalInputEvent::Released(input));
}
pub fn frame_end(self: &mut Self) { pub fn frame_end(self: &mut Self) {
self.input_events.clear(); self.input_events.clear();
} }
@@ -249,6 +264,7 @@ pub enum AxisInput {
#[derive(Debug, Eq, PartialEq, Hash, Clone)] #[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub enum DigitalInput { pub enum DigitalInput {
Keyboard(KeyboardInput), Keyboard(KeyboardInput),
Wheel(WheelInput),
Mouse(MouseInput) Mouse(MouseInput)
} }
@@ -264,6 +280,18 @@ pub struct MouseInput {
modifiers: ModifiersState modifiers: ModifiersState
} }
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub struct WheelInput {
direction: WheelInputDirection,
modifiers: ModifiersState
}
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
pub enum WheelInputDirection {
Up,
Down
}
#[derive(Debug, Eq, PartialEq, Clone)] #[derive(Debug, Eq, PartialEq, Clone)]
pub struct AnalogInput { pub struct AnalogInput {

View File

@@ -83,6 +83,18 @@ impl Game for TestGame {
} }
self.input.on_mouse_event(state, button, modifiers); self.input.on_mouse_event(state, button, modifiers);
},
Event::WindowEvent { event: WindowEvent::MouseWheel { device_id, delta, phase, modifiers }, .. } => {
if self.log_config.input {
let mods = mods_to_string(modifiers);
if mods.len() > 0 {
println!("Scroll {:?} {:?} {:?} + {:?}", device_id, phase, &mods, delta)
} else {
println!("Scroll {:?} {:?} {:?}", device_id, phase, delta)
}
}
self.input.on_mouse_wheel_event(&delta, &modifiers);
} }
_ => {} _ => {}
} }