Procházet zdrojové kódy

device: simplify reading input events

Daniele Bartolini před 3 roky
rodič
revize
30045b51a7
2 změnil soubory, kde provedl 68 přidání a 41 odebrání
  1. 65 41
      src/device/input_manager.cpp
  2. 3 0
      src/device/input_manager.h

+ 65 - 41
src/device/input_manager.cpp

@@ -229,6 +229,27 @@ InputManager::~InputManager()
 	input_device::destroy(*_allocator, *_keyboard);
 }
 
+InputDevice *InputManager::device_from_type(u16 type, u16 num)
+{
+	switch (type) {
+	case InputDeviceType::KEYBOARD:
+		return _keyboard;
+
+	case InputDeviceType::MOUSE:
+		return _mouse;
+
+	case InputDeviceType::TOUCHSCREEN:
+		return _touch;
+
+	case InputDeviceType::JOYPAD:
+		return _joypad[num];
+
+	default:
+		CE_FATAL("Unknown device type: %d", type);
+		return NULL;
+	}
+}
+
 InputDevice *InputManager::keyboard()
 {
 	return _keyboard;
@@ -257,65 +278,68 @@ InputDevice *InputManager::joypad(u8 i)
 
 void InputManager::read(const OsEvent &event)
 {
+	InputDevice *dev;
+
 	switch (event.type) {
 	case OsEventType::BUTTON: {
 		const ButtonEvent ev = event.button;
-		switch (ev.device_id) {
-		case InputDeviceType::KEYBOARD:
-			_keyboard->set_button(ev.button_num, ev.pressed);
-			break;
-
-		case InputDeviceType::MOUSE:
-			_mouse->set_button(ev.button_num, ev.pressed);
-			break;
-
-		case InputDeviceType::TOUCHSCREEN:
-			_touch->set_button(ev.button_num, ev.pressed);
-			break;
-
-		case InputDeviceType::JOYPAD:
-			_joypad[ev.device_num]->set_button(ev.button_num, ev.pressed);
-			break;
-		}
+
+		dev = device_from_type(ev.device_id, ev.device_num);
+		if (CE_UNLIKELY(dev == NULL))
+			return;
+
+		dev->set_button(ev.button_num, ev.pressed);
 		break;
 	}
 
 	case OsEventType::AXIS: {
 		const AxisEvent ev = event.axis;
-		switch (ev.device_id) {
-		case InputDeviceType::MOUSE:
+
+		dev = device_from_type(ev.device_id, ev.device_num);
+		if (CE_UNLIKELY(dev == NULL))
+			return;
+
+		Vector3 axis;
+
+		if (ev.device_id == InputDeviceType::MOUSE) {
 			if (ev.axis_num == MouseAxis::CURSOR_DELTA) {
-				const Vector3 delta = _has_delta_axis_event ? _mouse->axis(MouseAxis::CURSOR_DELTA) : vector3(0, 0, 0);
-				_mouse->set_axis(MouseAxis::CURSOR_DELTA
-					, delta.x + ev.axis_x
-					, delta.y + ev.axis_y
-					, 0
-					);
+				const Vector3 delta = _has_delta_axis_event ?
+					dev->axis(MouseAxis::CURSOR_DELTA)
+					: vector3(0, 0, 0)
+					;
+
+				axis.x = delta.x + ev.axis_x;
+				axis.y = delta.y + ev.axis_y;
+				axis.z = 0.0f;
+
 				_has_delta_axis_event = true;
 			} else {
-				_mouse->set_axis(ev.axis_num, ev.axis_x, ev.axis_y, ev.axis_z);
+				axis.x = ev.axis_x;
+				axis.y = ev.axis_y;
+				axis.z = ev.axis_z;
 			}
-
-			break;
-
-		case InputDeviceType::JOYPAD:
-			_joypad[ev.device_num]->set_axis(ev.axis_num
-				, (f32)ev.axis_x / (f32)INT16_MAX
-				, (f32)ev.axis_y / (f32)INT16_MAX
-				, (f32)ev.axis_z / (f32)INT16_MAX
-				);
-			break;
+		} else if (ev.device_id == InputDeviceType::JOYPAD) {
+			axis.x = (f32)ev.axis_x / (f32)INT16_MAX;
+			axis.y = (f32)ev.axis_y / (f32)INT16_MAX;
+			axis.z = (f32)ev.axis_z / (f32)INT16_MAX;
+		} else {
+			axis.x = ev.axis_x;
+			axis.y = ev.axis_y;
+			axis.z = ev.axis_z;
 		}
+
+		dev->set_axis(ev.axis_num, axis.x, axis.y, axis.z);
 		break;
 	}
 
 	case OsEventType::STATUS: {
 		const StatusEvent ev = event.status;
-		switch (ev.device_id) {
-		case InputDeviceType::JOYPAD:
-			_joypad[ev.device_num]->_connected = ev.connected;
-			break;
-		}
+
+		dev = device_from_type(ev.device_id, ev.device_num);
+		if (CE_UNLIKELY(dev == NULL))
+			return;
+
+		dev->_connected = ev.connected;
 		break;
 	}
 

+ 3 - 0
src/device/input_manager.h

@@ -33,6 +33,9 @@ struct InputManager
 	/// Destructor.
 	~InputManager();
 
+	/// Returns the InputDevice associated with @a type and @a num.
+	InputDevice *device_from_type(u16 type, u16 num);
+
 	/// Returns the default keyboard input device.
 	InputDevice *keyboard();