input_event_codec.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. /**************************************************************************/
  2. /* input_event_codec.cpp */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #include "input_event_codec.h"
  31. #include "core/input/input.h"
  32. #include "core/io/marshalls.h"
  33. #include "core/os/os.h"
  34. enum class BoolShift : uint8_t {
  35. SHIFT = 0,
  36. CTRL,
  37. ALT,
  38. META,
  39. ECHO,
  40. PRESSED,
  41. DOUBLE_CLICK,
  42. PEN_INVERTED,
  43. };
  44. // cast operator for BoolShift to uint8_t
  45. inline uint8_t operator<<(uint8_t a, BoolShift b) {
  46. return a << static_cast<uint8_t>(b);
  47. }
  48. uint8_t encode_key_modifier_state(Ref<InputEventWithModifiers> p_event) {
  49. uint8_t bools = 0;
  50. bools |= (uint8_t)p_event->is_shift_pressed() << BoolShift::SHIFT;
  51. bools |= (uint8_t)p_event->is_ctrl_pressed() << BoolShift::CTRL;
  52. bools |= (uint8_t)p_event->is_alt_pressed() << BoolShift::ALT;
  53. bools |= (uint8_t)p_event->is_meta_pressed() << BoolShift::META;
  54. return bools;
  55. }
  56. void decode_key_modifier_state(uint8_t bools, Ref<InputEventWithModifiers> p_event) {
  57. p_event->set_shift_pressed(bools & (1 << BoolShift::SHIFT));
  58. p_event->set_ctrl_pressed(bools & (1 << BoolShift::CTRL));
  59. p_event->set_alt_pressed(bools & (1 << BoolShift::ALT));
  60. p_event->set_meta_pressed(bools & (1 << BoolShift::META));
  61. }
  62. int encode_vector2(const Vector2 &p_vector, uint8_t *p_data) {
  63. p_data += encode_float(p_vector.x, p_data);
  64. encode_float(p_vector.y, p_data);
  65. return sizeof(float) * 2;
  66. }
  67. const uint8_t *decode_vector2(Vector2 &r_vector, const uint8_t *p_data) {
  68. r_vector.x = decode_float(p_data);
  69. p_data += sizeof(float);
  70. r_vector.y = decode_float(p_data);
  71. p_data += sizeof(float);
  72. return p_data;
  73. }
  74. void encode_input_event_key(const Ref<InputEventKey> &p_event, PackedByteArray &r_data) {
  75. r_data.resize(19);
  76. uint8_t *data = r_data.ptrw();
  77. *data = (uint8_t)InputEventType::KEY;
  78. data++;
  79. uint8_t bools = encode_key_modifier_state(p_event);
  80. bools |= (uint8_t)p_event->is_echo() << BoolShift::ECHO;
  81. bools |= (uint8_t)p_event->is_pressed() << BoolShift::PRESSED;
  82. *data = bools;
  83. data++;
  84. data += encode_uint32((uint32_t)p_event->get_keycode(), data);
  85. data += encode_uint32((uint32_t)p_event->get_physical_keycode(), data);
  86. data += encode_uint32((uint32_t)p_event->get_key_label(), data);
  87. data += encode_uint32(p_event->get_unicode(), data);
  88. *data = (uint8_t)p_event->get_location();
  89. data++;
  90. // Assert we had enough space.
  91. DEV_ASSERT(data - r_data.ptrw() >= r_data.size());
  92. }
  93. Error decode_input_event_key(const PackedByteArray &p_data, Ref<InputEventKey> &r_event) {
  94. const uint8_t *data = p_data.ptr();
  95. DEV_ASSERT(static_cast<InputEventType>(*data) == InputEventType::KEY);
  96. data++; // Skip event type.
  97. uint8_t bools = *data;
  98. data++;
  99. decode_key_modifier_state(bools, r_event);
  100. r_event->set_echo(bools & (1 << BoolShift::ECHO));
  101. r_event->set_pressed(bools & (1 << BoolShift::PRESSED));
  102. Key keycode = (Key)decode_uint32(data);
  103. data += sizeof(uint32_t);
  104. Key physical_keycode = (Key)decode_uint32(data);
  105. data += sizeof(uint32_t);
  106. Key key_label = (Key)decode_uint32(data);
  107. data += sizeof(uint32_t);
  108. char32_t unicode = (char32_t)decode_uint32(data);
  109. data += sizeof(uint32_t);
  110. KeyLocation location = (KeyLocation)*data;
  111. r_event->set_keycode(keycode);
  112. r_event->set_physical_keycode(physical_keycode);
  113. r_event->set_key_label(key_label);
  114. r_event->set_unicode(unicode);
  115. r_event->set_location(location);
  116. return OK;
  117. }
  118. void encode_input_event_mouse_button(const Ref<InputEventMouseButton> &p_event, PackedByteArray &r_data) {
  119. r_data.resize(12);
  120. uint8_t *data = r_data.ptrw();
  121. *data = (uint8_t)InputEventType::MOUSE_BUTTON;
  122. data++;
  123. uint8_t bools = encode_key_modifier_state(p_event);
  124. bools |= (uint8_t)p_event->is_pressed() << BoolShift::PRESSED;
  125. bools |= (uint8_t)p_event->is_double_click() << BoolShift::DOUBLE_CLICK;
  126. *data = bools;
  127. data++;
  128. *data = (uint8_t)p_event->get_button_index();
  129. data++;
  130. // Rather than use encode_variant, we explicitly encode the Vector2,
  131. // so decoding is easier. Specifically, we don't have to perform additional error
  132. // checking for decoding the variant and then checking the variant type.
  133. data += encode_vector2(p_event->get_position(), data);
  134. *data = (uint8_t)p_event->get_button_mask();
  135. data++;
  136. // Assert we had enough space.
  137. DEV_ASSERT(data - r_data.ptrw() >= r_data.size());
  138. }
  139. Error decode_input_event_mouse_button(const PackedByteArray &p_data, Ref<InputEventMouseButton> &r_event) {
  140. const uint8_t *data = p_data.ptr();
  141. DEV_ASSERT(static_cast<InputEventType>(*data) == InputEventType::MOUSE_BUTTON);
  142. data++; // Skip event type.
  143. uint8_t bools = *data;
  144. data++;
  145. decode_key_modifier_state(bools, r_event);
  146. r_event->set_pressed(bools & (1 << BoolShift::PRESSED));
  147. r_event->set_double_click(bools & (1 << BoolShift::DOUBLE_CLICK));
  148. r_event->set_button_index((MouseButton)*data);
  149. data++;
  150. Vector2 pos;
  151. data = decode_vector2(pos, data);
  152. r_event->set_position(pos);
  153. r_event->set_global_position(pos); // these are the same
  154. BitField<MouseButtonMask> button_mask = (MouseButtonMask)*data;
  155. r_event->set_button_mask(button_mask);
  156. return OK;
  157. }
  158. void encode_input_event_mouse_motion(const Ref<InputEventMouseMotion> &p_event, PackedByteArray &r_data) {
  159. r_data.resize(31);
  160. uint8_t *data = r_data.ptrw();
  161. *data = (uint8_t)InputEventType::MOUSE_MOTION;
  162. data++;
  163. uint8_t bools = encode_key_modifier_state(p_event);
  164. bools |= (uint8_t)p_event->get_pen_inverted() << BoolShift::PEN_INVERTED;
  165. *data = bools;
  166. data++;
  167. // Rather than use encode_variant, we explicitly encode the Vector2,
  168. // so decoding is easier. Specifically, we don't have to perform additional error
  169. // checking for decoding the variant and then checking the variant type.
  170. data += encode_vector2(p_event->get_position(), data);
  171. data += encode_float(p_event->get_pressure(), data);
  172. data += encode_vector2(p_event->get_tilt(), data);
  173. data += encode_vector2(p_event->get_relative(), data);
  174. *data = (uint8_t)p_event->get_button_mask();
  175. data++;
  176. // Assert we had enough space.
  177. DEV_ASSERT(data - r_data.ptrw() >= r_data.size());
  178. }
  179. void decode_input_event_mouse_motion(const PackedByteArray &p_data, Ref<InputEventMouseMotion> &r_event) {
  180. Input *input = Input::get_singleton();
  181. const uint8_t *data = p_data.ptr();
  182. DEV_ASSERT(static_cast<InputEventType>(*data) == InputEventType::MOUSE_MOTION);
  183. data++; // Skip event type.
  184. uint8_t bools = *data;
  185. data++;
  186. decode_key_modifier_state(bools, r_event);
  187. r_event->set_pen_inverted(bools & (1 << BoolShift::PEN_INVERTED));
  188. {
  189. Vector2 pos;
  190. data = decode_vector2(pos, data);
  191. r_event->set_position(pos);
  192. r_event->set_global_position(pos); // these are the same
  193. }
  194. r_event->set_pressure(decode_float(data));
  195. data += sizeof(float);
  196. {
  197. Vector2 tilt;
  198. data = decode_vector2(tilt, data);
  199. r_event->set_tilt(tilt);
  200. }
  201. r_event->set_velocity(input->get_last_mouse_velocity());
  202. r_event->set_screen_velocity(input->get_last_mouse_screen_velocity());
  203. {
  204. Vector2 relative;
  205. data = decode_vector2(relative, data);
  206. r_event->set_relative(relative);
  207. r_event->set_relative_screen_position(relative);
  208. }
  209. BitField<MouseButtonMask> button_mask = (MouseButtonMask)*data;
  210. r_event->set_button_mask(button_mask);
  211. data++;
  212. // Assert we had enough space.
  213. DEV_ASSERT(data - p_data.ptr() >= p_data.size());
  214. }
  215. void encode_input_event_joypad_button(const Ref<InputEventJoypadButton> &p_event, PackedByteArray &r_data) {
  216. r_data.resize(11);
  217. uint8_t *data = r_data.ptrw();
  218. *data = (uint8_t)InputEventType::JOY_BUTTON;
  219. data++;
  220. uint8_t bools = 0;
  221. bools |= (uint8_t)p_event->is_pressed() << BoolShift::PRESSED;
  222. *data = bools;
  223. data++;
  224. data += encode_uint64(p_event->get_device(), data);
  225. *data = (uint8_t)p_event->get_button_index();
  226. data++;
  227. // Assert we had enough space.
  228. DEV_ASSERT(data - r_data.ptrw() >= r_data.size());
  229. }
  230. void decode_input_event_joypad_button(const PackedByteArray &p_data, Ref<InputEventJoypadButton> &r_event) {
  231. const uint8_t *data = p_data.ptr();
  232. DEV_ASSERT(static_cast<InputEventType>(*data) == InputEventType::JOY_BUTTON);
  233. data++; // Skip event type.
  234. uint8_t bools = *data;
  235. data++;
  236. r_event->set_pressed(bools & (1 << BoolShift::PRESSED));
  237. r_event->set_device(decode_uint64(data));
  238. data += sizeof(uint64_t);
  239. r_event->set_button_index((JoyButton)*data);
  240. data++;
  241. // Assert we had enough space.
  242. DEV_ASSERT(data - p_data.ptr() >= p_data.size());
  243. }
  244. void encode_input_event_joypad_motion(const Ref<InputEventJoypadMotion> &p_event, PackedByteArray &r_data) {
  245. r_data.resize(14);
  246. uint8_t *data = r_data.ptrw();
  247. *data = (uint8_t)InputEventType::JOY_MOTION;
  248. data++;
  249. data += encode_uint64(p_event->get_device(), data);
  250. *data = (uint8_t)p_event->get_axis();
  251. data++;
  252. data += encode_float(p_event->get_axis_value(), data);
  253. // Assert we had enough space.
  254. DEV_ASSERT(data - r_data.ptrw() >= r_data.size());
  255. }
  256. void decode_input_event_joypad_motion(const PackedByteArray &p_data, Ref<InputEventJoypadMotion> &r_event) {
  257. const uint8_t *data = p_data.ptr();
  258. DEV_ASSERT(static_cast<InputEventType>(*data) == InputEventType::JOY_MOTION);
  259. data++; // Skip event type.
  260. r_event->set_device(decode_uint64(data));
  261. data += sizeof(uint64_t);
  262. r_event->set_axis((JoyAxis)*data);
  263. data++;
  264. r_event->set_axis_value(decode_float(data));
  265. data += sizeof(float);
  266. // Assert we had enough space.
  267. DEV_ASSERT(data - p_data.ptr() >= p_data.size());
  268. }
  269. void encode_input_event_gesture_pan(const Ref<InputEventPanGesture> &p_event, PackedByteArray &r_data) {
  270. r_data.resize(18);
  271. uint8_t *data = r_data.ptrw();
  272. *data = (uint8_t)InputEventType::PAN_GESTURE;
  273. data++;
  274. uint8_t bools = encode_key_modifier_state(p_event);
  275. *data = bools;
  276. data++;
  277. data += encode_vector2(p_event->get_position(), data);
  278. data += encode_vector2(p_event->get_delta(), data);
  279. // Assert we had enough space.
  280. DEV_ASSERT(data - r_data.ptrw() >= r_data.size());
  281. }
  282. void decode_input_event_gesture_pan(const PackedByteArray &p_data, Ref<InputEventPanGesture> &r_event) {
  283. const uint8_t *data = p_data.ptr();
  284. DEV_ASSERT(static_cast<InputEventType>(*data) == InputEventType::PAN_GESTURE);
  285. data++; // Skip event type.
  286. uint8_t bools = *data;
  287. data++;
  288. decode_key_modifier_state(bools, r_event);
  289. Vector2 pos;
  290. data = decode_vector2(pos, data);
  291. r_event->set_position(pos);
  292. Vector2 delta;
  293. data = decode_vector2(delta, data);
  294. r_event->set_delta(delta);
  295. // Assert we had enough space.
  296. DEV_ASSERT(data - p_data.ptr() >= p_data.size());
  297. }
  298. void encode_input_event_gesture_magnify(const Ref<InputEventMagnifyGesture> &p_event, PackedByteArray &r_data) {
  299. r_data.resize(14);
  300. uint8_t *data = r_data.ptrw();
  301. *data = (uint8_t)InputEventType::MAGNIFY_GESTURE;
  302. data++;
  303. uint8_t bools = encode_key_modifier_state(p_event);
  304. *data = bools;
  305. data++;
  306. data += encode_vector2(p_event->get_position(), data);
  307. data += encode_float(p_event->get_factor(), data);
  308. // Assert we had enough space.
  309. DEV_ASSERT(data - r_data.ptrw() >= r_data.size());
  310. }
  311. void decode_input_event_gesture_magnify(const PackedByteArray &p_data, Ref<InputEventMagnifyGesture> &r_event) {
  312. const uint8_t *data = p_data.ptr();
  313. DEV_ASSERT(static_cast<InputEventType>(*data) == InputEventType::MAGNIFY_GESTURE);
  314. data++; // Skip event type.
  315. uint8_t bools = *data;
  316. data++;
  317. decode_key_modifier_state(bools, r_event);
  318. Vector2 pos;
  319. data = decode_vector2(pos, data);
  320. r_event->set_position(pos);
  321. r_event->set_factor(decode_float(data));
  322. data += sizeof(float);
  323. // Assert we had enough space.
  324. DEV_ASSERT(data - p_data.ptr() >= p_data.size());
  325. }
  326. bool encode_input_event(const Ref<InputEvent> &p_event, PackedByteArray &r_data) {
  327. switch (p_event->get_type()) {
  328. case InputEventType::KEY:
  329. encode_input_event_key(p_event, r_data);
  330. break;
  331. case InputEventType::MOUSE_BUTTON:
  332. encode_input_event_mouse_button(p_event, r_data);
  333. break;
  334. case InputEventType::MOUSE_MOTION:
  335. encode_input_event_mouse_motion(p_event, r_data);
  336. break;
  337. case InputEventType::JOY_MOTION:
  338. encode_input_event_joypad_motion(p_event, r_data);
  339. break;
  340. case InputEventType::JOY_BUTTON:
  341. encode_input_event_joypad_button(p_event, r_data);
  342. break;
  343. case InputEventType::MAGNIFY_GESTURE:
  344. encode_input_event_gesture_magnify(p_event, r_data);
  345. break;
  346. case InputEventType::PAN_GESTURE:
  347. encode_input_event_gesture_pan(p_event, r_data);
  348. break;
  349. default:
  350. return false;
  351. }
  352. return true;
  353. }
  354. void decode_input_event(const PackedByteArray &p_data, Ref<InputEvent> &r_event) {
  355. const uint8_t *data = p_data.ptr();
  356. switch (static_cast<InputEventType>(*data)) {
  357. case InputEventType::KEY: {
  358. Ref<InputEventKey> event;
  359. event.instantiate();
  360. decode_input_event_key(p_data, event);
  361. r_event = event;
  362. } break;
  363. case InputEventType::MOUSE_BUTTON: {
  364. Ref<InputEventMouseButton> event;
  365. event.instantiate();
  366. decode_input_event_mouse_button(p_data, event);
  367. r_event = event;
  368. } break;
  369. case InputEventType::MOUSE_MOTION: {
  370. Ref<InputEventMouseMotion> event;
  371. event.instantiate();
  372. decode_input_event_mouse_motion(p_data, event);
  373. r_event = event;
  374. } break;
  375. case InputEventType::JOY_BUTTON: {
  376. Ref<InputEventJoypadButton> event;
  377. event.instantiate();
  378. decode_input_event_joypad_button(p_data, event);
  379. r_event = event;
  380. } break;
  381. case InputEventType::JOY_MOTION: {
  382. Ref<InputEventJoypadMotion> event;
  383. event.instantiate();
  384. decode_input_event_joypad_motion(p_data, event);
  385. r_event = event;
  386. } break;
  387. case InputEventType::PAN_GESTURE: {
  388. Ref<InputEventPanGesture> event;
  389. event.instantiate();
  390. decode_input_event_gesture_pan(p_data, event);
  391. r_event = event;
  392. } break;
  393. case InputEventType::MAGNIFY_GESTURE: {
  394. Ref<InputEventMagnifyGesture> event;
  395. event.instantiate();
  396. decode_input_event_gesture_magnify(p_data, event);
  397. r_event = event;
  398. } break;
  399. default: {
  400. WARN_PRINT(vformat("Unknown event type %d.", static_cast<int>(*data)));
  401. } break;
  402. }
  403. }