lua_input.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "lua_stack.h"
  6. #include "lua_environment.h"
  7. #include "device.h"
  8. #include "input_manager.h"
  9. #include "input_device.h"
  10. namespace crown
  11. {
  12. struct KeyboardButtonInfo
  13. {
  14. const char* name;
  15. KeyboardButton::Enum button;
  16. };
  17. static KeyboardButtonInfo s_keyboard_button[] =
  18. {
  19. { "tab", KeyboardButton::TAB },
  20. { "enter", KeyboardButton::ENTER },
  21. { "escape", KeyboardButton::ESCAPE },
  22. { "space", KeyboardButton::SPACE },
  23. { "backspace", KeyboardButton::BACKSPACE },
  24. { "numpad_0", KeyboardButton::NUMPAD_0 },
  25. { "numpad_1", KeyboardButton::NUMPAD_1 },
  26. { "numpad_2", KeyboardButton::NUMPAD_2 },
  27. { "numpad_3", KeyboardButton::NUMPAD_3 },
  28. { "numpad_4", KeyboardButton::NUMPAD_4 },
  29. { "numpad_5", KeyboardButton::NUMPAD_5 },
  30. { "numpad_6", KeyboardButton::NUMPAD_6 },
  31. { "numpad_7", KeyboardButton::NUMPAD_7 },
  32. { "numpad_8", KeyboardButton::NUMPAD_8 },
  33. { "numpad_9", KeyboardButton::NUMPAD_9 },
  34. { "f1", KeyboardButton::F1 },
  35. { "f2", KeyboardButton::F2 },
  36. { "f3", KeyboardButton::F3 },
  37. { "f4", KeyboardButton::F4 },
  38. { "f5", KeyboardButton::F5 },
  39. { "f6", KeyboardButton::F6 },
  40. { "f7", KeyboardButton::F7 },
  41. { "f8", KeyboardButton::F8 },
  42. { "f9", KeyboardButton::F9 },
  43. { "f10", KeyboardButton::F10 },
  44. { "f11", KeyboardButton::F11 },
  45. { "f12", KeyboardButton::F12 },
  46. { "home", KeyboardButton::HOME },
  47. { "left", KeyboardButton::LEFT },
  48. { "up", KeyboardButton::UP },
  49. { "right", KeyboardButton::RIGHT },
  50. { "down", KeyboardButton::DOWN },
  51. { "page_up", KeyboardButton::PAGE_UP },
  52. { "page_down", KeyboardButton::PAGE_DOWN },
  53. { "left_ctrl", KeyboardButton::LEFT_CTRL },
  54. { "right_ctrl", KeyboardButton::RIGHT_CTRL },
  55. { "left_shift", KeyboardButton::LEFT_SHIFT },
  56. { "right_shift", KeyboardButton::RIGHT_SHIFT },
  57. { "caps_lock", KeyboardButton::CAPS_LOCK },
  58. { "left_alt", KeyboardButton::LEFT_ALT },
  59. { "right_alt", KeyboardButton::RIGHT_ALT },
  60. { "left_super", KeyboardButton::LEFT_SUPER },
  61. { "right_super", KeyboardButton::RIGHT_SUPER },
  62. { "0", KeyboardButton::NUMBER_0 },
  63. { "1", KeyboardButton::NUMBER_1 },
  64. { "2", KeyboardButton::NUMBER_2 },
  65. { "3", KeyboardButton::NUMBER_3 },
  66. { "4", KeyboardButton::NUMBER_4 },
  67. { "5", KeyboardButton::NUMBER_5 },
  68. { "6", KeyboardButton::NUMBER_6 },
  69. { "7", KeyboardButton::NUMBER_7 },
  70. { "8", KeyboardButton::NUMBER_8 },
  71. { "9", KeyboardButton::NUMBER_9 },
  72. { "a", KeyboardButton::A },
  73. { "b", KeyboardButton::B },
  74. { "c", KeyboardButton::C },
  75. { "d", KeyboardButton::D },
  76. { "e", KeyboardButton::E },
  77. { "f", KeyboardButton::F },
  78. { "g", KeyboardButton::G },
  79. { "h", KeyboardButton::H },
  80. { "i", KeyboardButton::I },
  81. { "j", KeyboardButton::J },
  82. { "k", KeyboardButton::K },
  83. { "l", KeyboardButton::L },
  84. { "m", KeyboardButton::M },
  85. { "n", KeyboardButton::N },
  86. { "o", KeyboardButton::O },
  87. { "p", KeyboardButton::P },
  88. { "q", KeyboardButton::Q },
  89. { "r", KeyboardButton::R },
  90. { "s", KeyboardButton::S },
  91. { "t", KeyboardButton::T },
  92. { "u", KeyboardButton::U },
  93. { "v", KeyboardButton::V },
  94. { "w", KeyboardButton::W },
  95. { "x", KeyboardButton::X },
  96. { "y", KeyboardButton::Y },
  97. { "z", KeyboardButton::Z }
  98. };
  99. struct MouseButtonInfo
  100. {
  101. const char* name;
  102. MouseButton::Enum button;
  103. };
  104. static MouseButtonInfo s_mouse_button[] =
  105. {
  106. { "left", MouseButton::LEFT },
  107. { "middle", MouseButton::MIDDLE },
  108. { "right", MouseButton::RIGHT },
  109. { "extra_1", MouseButton::EXTRA_1 },
  110. { "extra_2", MouseButton::EXTRA_2 }
  111. };
  112. CE_STATIC_ASSERT(CE_COUNTOF(s_mouse_button) == MouseButton::COUNT);
  113. struct MouseAxisInfo
  114. {
  115. const char* name;
  116. MouseAxis::Enum button;
  117. };
  118. static MouseAxisInfo s_mouse_axis[] =
  119. {
  120. { "cursor", MouseAxis::CURSOR },
  121. { "cursor_delta", MouseAxis::CURSOR_DELTA },
  122. { "wheel", MouseAxis::WHEEL }
  123. };
  124. CE_STATIC_ASSERT(CE_COUNTOF(s_mouse_axis) == MouseAxis::COUNT);
  125. struct PadButtonInfo
  126. {
  127. const char* name;
  128. JoypadButton::Enum button;
  129. };
  130. static PadButtonInfo s_pad_button[] =
  131. {
  132. { "up", JoypadButton::UP },
  133. { "down", JoypadButton::DOWN },
  134. { "left", JoypadButton::LEFT },
  135. { "right", JoypadButton::RIGHT },
  136. { "start", JoypadButton::START },
  137. { "back", JoypadButton::BACK },
  138. { "guide", JoypadButton::GUIDE },
  139. { "left_thumb", JoypadButton::LEFT_THUMB },
  140. { "right_thumb", JoypadButton::RIGHT_THUMB },
  141. { "left_shoulder", JoypadButton::LEFT_SHOULDER },
  142. { "right_shoulder", JoypadButton::RIGHT_SHOULDER },
  143. { "a", JoypadButton::A },
  144. { "b", JoypadButton::B },
  145. { "x", JoypadButton::X },
  146. { "y", JoypadButton::Y }
  147. };
  148. CE_STATIC_ASSERT(CE_COUNTOF(s_pad_button) == JoypadButton::COUNT);
  149. struct PadAxisInfo
  150. {
  151. const char* name;
  152. JoypadAxis::Enum button;
  153. };
  154. static PadAxisInfo s_pad_axis[] =
  155. {
  156. { "left", JoypadAxis::LEFT },
  157. { "right", JoypadAxis::RIGHT }
  158. };
  159. CE_STATIC_ASSERT(CE_COUNTOF(s_pad_axis) == JoypadAxis::COUNT);
  160. static KeyboardButton::Enum name_to_keyboard_button(LuaStack& stack, const char* name)
  161. {
  162. for (uint32_t i = 0; i < CE_COUNTOF(s_keyboard_button); ++i)
  163. {
  164. if (strcmp(s_keyboard_button[i].name, name) == 0)
  165. return s_keyboard_button[i].button;
  166. }
  167. LUA_ASSERT(false, stack, "Unknown button: %s", name);
  168. return KeyboardButton::COUNT;
  169. }
  170. static MouseButton::Enum name_to_mouse_button(LuaStack& stack, const char* name)
  171. {
  172. for (uint32_t i = 0; i < CE_COUNTOF(s_mouse_button); ++i)
  173. {
  174. if (strcmp(s_mouse_button[i].name, name) == 0)
  175. return s_mouse_button[i].button;
  176. }
  177. LUA_ASSERT(false, stack, "Unknown button: %s", name);
  178. return MouseButton::COUNT;
  179. }
  180. static MouseAxis::Enum name_to_mouse_axis(LuaStack& stack, const char* name)
  181. {
  182. for (uint32_t i = 0; i < CE_COUNTOF(s_mouse_axis); ++i)
  183. {
  184. if (strcmp(s_mouse_axis[i].name, name) == 0)
  185. return s_mouse_axis[i].button;
  186. }
  187. LUA_ASSERT(false, stack, "Unknown axis: %s", name);
  188. return MouseAxis::COUNT;
  189. }
  190. static JoypadButton::Enum name_to_pad_button(LuaStack& stack, const char* name)
  191. {
  192. for (uint32_t i = 0; i < CE_COUNTOF(s_pad_button); ++i)
  193. {
  194. if (strcmp(s_pad_button[i].name, name) == 0)
  195. return s_pad_button[i].button;
  196. }
  197. LUA_ASSERT(false, stack, "Unknown button: %s", name);
  198. return JoypadButton::COUNT;
  199. }
  200. static JoypadAxis::Enum name_to_pad_axis(LuaStack& stack, const char* name)
  201. {
  202. for (uint32_t i = 0; i < CE_COUNTOF(s_pad_axis); ++i)
  203. {
  204. if (strcmp(s_pad_axis[i].name, name) == 0)
  205. return s_pad_axis[i].button;
  206. }
  207. LUA_ASSERT(false, stack, "Unknown button: %s", name);
  208. return JoypadAxis::COUNT;
  209. }
  210. static int input_device_name(lua_State* L, InputDevice& id)
  211. {
  212. LuaStack stack(L);
  213. stack.push_string(id.name());
  214. return 1;
  215. }
  216. static int input_device_connected(lua_State* L, InputDevice& id)
  217. {
  218. LuaStack stack(L);
  219. stack.push_bool(id.connected());
  220. return 1;
  221. }
  222. static int input_device_num_buttons(lua_State* L, InputDevice& id)
  223. {
  224. LuaStack stack(L);
  225. stack.push_uint32(id.num_buttons());
  226. return 1;
  227. }
  228. static int input_device_num_axes(lua_State* L, InputDevice& id)
  229. {
  230. LuaStack stack(L);
  231. stack.push_uint32(id.num_axes());
  232. return 1;
  233. }
  234. static int input_device_pressed(lua_State* L, InputDevice& id)
  235. {
  236. LuaStack stack(L);
  237. stack.push_bool(id.pressed(stack.get_int(1)));
  238. return 1;
  239. }
  240. static int input_device_released(lua_State* L, InputDevice& id)
  241. {
  242. LuaStack stack(L);
  243. stack.push_bool(id.released(stack.get_int(1)));
  244. return 1;
  245. }
  246. static int input_device_any_pressed(lua_State* L, InputDevice& id)
  247. {
  248. LuaStack stack(L);
  249. stack.push_bool(id.any_pressed());
  250. return 1;
  251. }
  252. static int input_device_any_released(lua_State* L, InputDevice& id)
  253. {
  254. LuaStack stack(L);
  255. stack.push_bool(id.any_released());
  256. return 1;
  257. }
  258. static int input_device_axis(lua_State* L, InputDevice& id)
  259. {
  260. LuaStack stack(L);
  261. stack.push_vector3(id.axis(stack.get_int(1)));
  262. return 1;
  263. }
  264. static int keyboard_button_id(lua_State* L)
  265. {
  266. LuaStack stack(L);
  267. stack.push_uint32(name_to_keyboard_button(stack, stack.get_string(1)));
  268. return 1;
  269. }
  270. static int mouse_button_id(lua_State* L)
  271. {
  272. LuaStack stack(L);
  273. stack.push_uint32(name_to_mouse_button(stack, stack.get_string(1)));
  274. return 1;
  275. }
  276. static int mouse_axis_id(lua_State* L)
  277. {
  278. LuaStack stack(L);
  279. stack.push_uint32(name_to_mouse_axis(stack, stack.get_string(1)));
  280. return 1;
  281. }
  282. static int pad_button_id(lua_State* L)
  283. {
  284. LuaStack stack(L);
  285. stack.push_uint32(name_to_pad_button(stack, stack.get_string(1)));
  286. return 1;
  287. }
  288. static int pad_axis_id(lua_State* L)
  289. {
  290. LuaStack stack(L);
  291. stack.push_uint32(name_to_pad_axis(stack, stack.get_string(1)));
  292. return 1;
  293. }
  294. #define KEYBOARD_FN(name) keyboard_##name
  295. #define MOUSE_FN(name) mouse_##name
  296. #define TOUCH_FN(name) touch_##name
  297. #define JOYPAD_FN(index, name) joypad_##name##index
  298. #define KEYBOARD(name) static int KEYBOARD_FN(name)(lua_State* L)\
  299. { return input_device_##name(L, *device()->input_manager()->keyboard()); }
  300. #define MOUSE(name) static int MOUSE_FN(name)(lua_State* L)\
  301. { return input_device_##name(L, *device()->input_manager()->mouse()); }
  302. #define TOUCH(name) static int TOUCH_FN(name)(lua_State* L)\
  303. { return input_device_##name(L, *device()->input_manager()->touch()); }
  304. #define JOYPAD(index, name) static int JOYPAD_FN(index, name)(lua_State* L)\
  305. { return input_device_##name(L, *device()->input_manager()->joypad(index)); }
  306. KEYBOARD(name)
  307. KEYBOARD(connected)
  308. KEYBOARD(num_buttons)
  309. KEYBOARD(num_axes)
  310. KEYBOARD(pressed)
  311. KEYBOARD(released)
  312. KEYBOARD(any_pressed)
  313. KEYBOARD(any_released)
  314. // KEYBOARD(axis) // Keyboard has no axis
  315. MOUSE(name)
  316. MOUSE(connected)
  317. MOUSE(num_buttons)
  318. MOUSE(num_axes)
  319. MOUSE(pressed)
  320. MOUSE(released)
  321. MOUSE(any_pressed)
  322. MOUSE(any_released)
  323. MOUSE(axis)
  324. TOUCH(name)
  325. TOUCH(connected)
  326. TOUCH(num_buttons)
  327. TOUCH(num_axes)
  328. TOUCH(pressed)
  329. TOUCH(released)
  330. TOUCH(any_pressed)
  331. TOUCH(any_released)
  332. TOUCH(axis)
  333. JOYPAD(0, name)
  334. JOYPAD(0, connected)
  335. JOYPAD(0, num_buttons)
  336. JOYPAD(0, num_axes)
  337. JOYPAD(0, pressed)
  338. JOYPAD(0, released)
  339. JOYPAD(0, any_pressed)
  340. JOYPAD(0, any_released)
  341. JOYPAD(0, axis)
  342. JOYPAD(1, name)
  343. JOYPAD(1, connected)
  344. JOYPAD(1, num_buttons)
  345. JOYPAD(1, num_axes)
  346. JOYPAD(1, pressed)
  347. JOYPAD(1, released)
  348. JOYPAD(1, any_pressed)
  349. JOYPAD(1, any_released)
  350. JOYPAD(1, axis)
  351. JOYPAD(2, name)
  352. JOYPAD(2, connected)
  353. JOYPAD(2, num_buttons)
  354. JOYPAD(2, num_axes)
  355. JOYPAD(2, pressed)
  356. JOYPAD(2, released)
  357. JOYPAD(2, any_pressed)
  358. JOYPAD(2, any_released)
  359. JOYPAD(2, axis)
  360. JOYPAD(3, name)
  361. JOYPAD(3, connected)
  362. JOYPAD(3, num_buttons)
  363. JOYPAD(3, num_axes)
  364. JOYPAD(3, pressed)
  365. JOYPAD(3, released)
  366. JOYPAD(3, any_pressed)
  367. JOYPAD(3, any_released)
  368. JOYPAD(3, axis)
  369. void load_input(LuaEnvironment& env)
  370. {
  371. env.load_module_function("Keyboard", "name", KEYBOARD_FN(name));
  372. env.load_module_function("Keyboard", "connected", KEYBOARD_FN(connected));
  373. env.load_module_function("Keyboard", "num_buttons", KEYBOARD_FN(num_buttons));
  374. env.load_module_function("Keyboard", "num_axes", KEYBOARD_FN(num_axes));
  375. env.load_module_function("Keyboard", "pressed", KEYBOARD_FN(pressed));
  376. env.load_module_function("Keyboard", "released", KEYBOARD_FN(released));
  377. env.load_module_function("Keyboard", "any_pressed", KEYBOARD_FN(any_pressed));
  378. env.load_module_function("Keyboard", "any_released", KEYBOARD_FN(any_released));
  379. env.load_module_function("Keyboard", "button_id", keyboard_button_id);
  380. env.load_module_function("Mouse", "name", MOUSE_FN(name));
  381. env.load_module_function("Mouse", "connected", MOUSE_FN(connected));
  382. env.load_module_function("Mouse", "num_buttons", MOUSE_FN(num_buttons));
  383. env.load_module_function("Mouse", "num_axes", MOUSE_FN(num_axes));
  384. env.load_module_function("Mouse", "pressed", MOUSE_FN(pressed));
  385. env.load_module_function("Mouse", "released", MOUSE_FN(released));
  386. env.load_module_function("Mouse", "any_pressed", MOUSE_FN(any_pressed));
  387. env.load_module_function("Mouse", "any_released", MOUSE_FN(any_released));
  388. env.load_module_function("Mouse", "axis", MOUSE_FN(axis));
  389. env.load_module_function("Mouse", "button_id", mouse_button_id);
  390. env.load_module_function("Mouse", "axis_id", mouse_axis_id);
  391. env.load_module_function("Touch", "name", TOUCH_FN(name));
  392. env.load_module_function("Touch", "connected", TOUCH_FN(connected));
  393. env.load_module_function("Touch", "num_buttons", TOUCH_FN(num_buttons));
  394. env.load_module_function("Touch", "num_axes", TOUCH_FN(num_axes));
  395. env.load_module_function("Touch", "pressed", TOUCH_FN(pressed));
  396. env.load_module_function("Touch", "released", TOUCH_FN(released));
  397. env.load_module_function("Touch", "any_pressed", TOUCH_FN(any_pressed));
  398. env.load_module_function("Touch", "any_released", TOUCH_FN(any_released));
  399. env.load_module_function("Touch", "axis", TOUCH_FN(axis));
  400. env.load_module_function("Pad1", "name", JOYPAD_FN(0, name));
  401. env.load_module_function("Pad1", "connected", JOYPAD_FN(0, connected));
  402. env.load_module_function("Pad1", "num_buttons", JOYPAD_FN(0, num_buttons));
  403. env.load_module_function("Pad1", "num_axes", JOYPAD_FN(0, num_axes));
  404. env.load_module_function("Pad1", "pressed", JOYPAD_FN(0, pressed));
  405. env.load_module_function("Pad1", "released", JOYPAD_FN(0, released));
  406. env.load_module_function("Pad1", "any_pressed", JOYPAD_FN(0, any_pressed));
  407. env.load_module_function("Pad1", "any_released", JOYPAD_FN(0, any_released));
  408. env.load_module_function("Pad1", "axis", JOYPAD_FN(0, axis));
  409. env.load_module_function("Pad1", "button_id", pad_button_id);
  410. env.load_module_function("Pad1", "axis_id", pad_axis_id);
  411. env.load_module_function("Pad2", "name", JOYPAD_FN(1, name));
  412. env.load_module_function("Pad2", "connected", JOYPAD_FN(1, connected));
  413. env.load_module_function("Pad2", "num_buttons", JOYPAD_FN(1, num_buttons));
  414. env.load_module_function("Pad2", "num_axes", JOYPAD_FN(1, num_axes));
  415. env.load_module_function("Pad2", "pressed", JOYPAD_FN(1, pressed));
  416. env.load_module_function("Pad2", "released", JOYPAD_FN(1, released));
  417. env.load_module_function("Pad2", "any_pressed", JOYPAD_FN(1, any_pressed));
  418. env.load_module_function("Pad2", "any_released", JOYPAD_FN(1, any_released));
  419. env.load_module_function("Pad2", "axis", JOYPAD_FN(1, axis));
  420. env.load_module_function("Pad2", "button_id", pad_button_id);
  421. env.load_module_function("Pad2", "axis_id", pad_axis_id);
  422. env.load_module_function("Pad3", "name", JOYPAD_FN(2, name));
  423. env.load_module_function("Pad3", "connected", JOYPAD_FN(2, connected));
  424. env.load_module_function("Pad3", "num_buttons", JOYPAD_FN(2, num_buttons));
  425. env.load_module_function("Pad3", "num_axes", JOYPAD_FN(2, num_axes));
  426. env.load_module_function("Pad3", "pressed", JOYPAD_FN(2, pressed));
  427. env.load_module_function("Pad3", "released", JOYPAD_FN(2, released));
  428. env.load_module_function("Pad3", "any_pressed", JOYPAD_FN(2, any_pressed));
  429. env.load_module_function("Pad3", "any_released", JOYPAD_FN(2, any_released));
  430. env.load_module_function("Pad3", "axis", JOYPAD_FN(2, axis));
  431. env.load_module_function("Pad3", "button_id", pad_button_id);
  432. env.load_module_function("Pad3", "axis_id", pad_axis_id);
  433. env.load_module_function("Pad4", "name", JOYPAD_FN(3, name));
  434. env.load_module_function("Pad4", "connected", JOYPAD_FN(3, connected));
  435. env.load_module_function("Pad4", "num_buttons", JOYPAD_FN(3, num_buttons));
  436. env.load_module_function("Pad4", "num_axes", JOYPAD_FN(3, num_axes));
  437. env.load_module_function("Pad4", "pressed", JOYPAD_FN(3, pressed));
  438. env.load_module_function("Pad4", "released", JOYPAD_FN(3, released));
  439. env.load_module_function("Pad4", "any_pressed", JOYPAD_FN(3, any_pressed));
  440. env.load_module_function("Pad4", "any_released", JOYPAD_FN(3, any_released));
  441. env.load_module_function("Pad4", "axis", JOYPAD_FN(3, axis));
  442. env.load_module_function("Pad4", "button_id", pad_button_id);
  443. env.load_module_function("Pad4", "axis_id", pad_axis_id);
  444. }
  445. } // namespace crown