lua_input.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  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. { "kp_0", KeyboardButton::KP_0 },
  25. { "kp_1", KeyboardButton::KP_1 },
  26. { "kp_2", KeyboardButton::KP_2 },
  27. { "kp_3", KeyboardButton::KP_3 },
  28. { "kp_4", KeyboardButton::KP_4 },
  29. { "kp_5", KeyboardButton::KP_5 },
  30. { "kp_6", KeyboardButton::KP_6 },
  31. { "kp_7", KeyboardButton::KP_7 },
  32. { "kp_8", KeyboardButton::KP_8 },
  33. { "kp_9", KeyboardButton::KP_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. { "lcontrol", KeyboardButton::LCONTROL },
  54. { "rcontrol", KeyboardButton::RCONTROL },
  55. { "lshift", KeyboardButton::LSHIFT },
  56. { "rshift", KeyboardButton::RSHIFT },
  57. { "caps_lock", KeyboardButton::CAPS_LOCK },
  58. { "lalt", KeyboardButton::LALT },
  59. { "ralt", KeyboardButton::RALT },
  60. { "lsuper", KeyboardButton::LSUPER },
  61. { "rsuper", KeyboardButton::RSUPER },
  62. { "num_0", KeyboardButton::NUM_0 },
  63. { "num_1", KeyboardButton::NUM_1 },
  64. { "num_2", KeyboardButton::NUM_2 },
  65. { "num_3", KeyboardButton::NUM_3 },
  66. { "num_4", KeyboardButton::NUM_4 },
  67. { "num_5", KeyboardButton::NUM_5 },
  68. { "num_6", KeyboardButton::NUM_6 },
  69. { "num_7", KeyboardButton::NUM_7 },
  70. { "num_8", KeyboardButton::NUM_8 },
  71. { "num_9", KeyboardButton::NUM_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. { "wheel", MouseAxis::WHEEL }
  122. };
  123. CE_STATIC_ASSERT(CE_COUNTOF(s_mouse_axis) == MouseAxis::COUNT);
  124. struct PadButtonInfo
  125. {
  126. const char* name;
  127. JoypadButton::Enum button;
  128. };
  129. static PadButtonInfo s_pad_button[] =
  130. {
  131. { "up", JoypadButton::UP },
  132. { "down", JoypadButton::DOWN },
  133. { "left", JoypadButton::LEFT },
  134. { "right", JoypadButton::RIGHT },
  135. { "start", JoypadButton::START },
  136. { "back", JoypadButton::BACK },
  137. { "guide", JoypadButton::GUIDE },
  138. { "left_thumb", JoypadButton::LEFT_THUMB },
  139. { "right_thumb", JoypadButton::RIGHT_THUMB },
  140. { "left_shoulder", JoypadButton::LEFT_SHOULDER },
  141. { "right_shoulder", JoypadButton::RIGHT_SHOULDER },
  142. { "a", JoypadButton::A },
  143. { "b", JoypadButton::B },
  144. { "x", JoypadButton::X },
  145. { "y", JoypadButton::Y }
  146. };
  147. CE_STATIC_ASSERT(CE_COUNTOF(s_pad_button) == JoypadButton::COUNT);
  148. struct PadAxisInfo
  149. {
  150. const char* name;
  151. JoypadAxis::Enum button;
  152. };
  153. static PadAxisInfo s_pad_axis[] =
  154. {
  155. { "left", JoypadAxis::LEFT },
  156. { "right", JoypadAxis::RIGHT }
  157. };
  158. CE_STATIC_ASSERT(CE_COUNTOF(s_pad_axis) == JoypadAxis::COUNT);
  159. static KeyboardButton::Enum name_to_keyboard_button(LuaStack& stack, const char* name)
  160. {
  161. for (uint32_t i = 0; i < CE_COUNTOF(s_keyboard_button); ++i)
  162. {
  163. if (strcmp(s_keyboard_button[i].name, name) == 0)
  164. return s_keyboard_button[i].button;
  165. }
  166. LUA_ASSERT(false, stack, "Unknown button: %s", name);
  167. return KeyboardButton::COUNT;
  168. }
  169. static MouseButton::Enum name_to_mouse_button(LuaStack& stack, const char* name)
  170. {
  171. for (uint32_t i = 0; i < CE_COUNTOF(s_mouse_button); ++i)
  172. {
  173. if (strcmp(s_mouse_button[i].name, name) == 0)
  174. return s_mouse_button[i].button;
  175. }
  176. LUA_ASSERT(false, stack, "Unknown button: %s", name);
  177. return MouseButton::COUNT;
  178. }
  179. static MouseAxis::Enum name_to_mouse_axis(LuaStack& stack, const char* name)
  180. {
  181. for (uint32_t i = 0; i < CE_COUNTOF(s_mouse_axis); ++i)
  182. {
  183. if (strcmp(s_mouse_axis[i].name, name) == 0)
  184. return s_mouse_axis[i].button;
  185. }
  186. LUA_ASSERT(false, stack, "Unknown axis: %s", name);
  187. return MouseAxis::COUNT;
  188. }
  189. static JoypadButton::Enum name_to_pad_button(LuaStack& stack, const char* name)
  190. {
  191. for (uint32_t i = 0; i < CE_COUNTOF(s_pad_button); ++i)
  192. {
  193. if (strcmp(s_pad_button[i].name, name) == 0)
  194. return s_pad_button[i].button;
  195. }
  196. LUA_ASSERT(false, stack, "Unknown button: %s", name);
  197. return JoypadButton::COUNT;
  198. }
  199. static JoypadAxis::Enum name_to_pad_axis(LuaStack& stack, const char* name)
  200. {
  201. for (uint32_t i = 0; i < CE_COUNTOF(s_pad_axis); ++i)
  202. {
  203. if (strcmp(s_pad_axis[i].name, name) == 0)
  204. return s_pad_axis[i].button;
  205. }
  206. LUA_ASSERT(false, stack, "Unknown button: %s", name);
  207. return JoypadAxis::COUNT;
  208. }
  209. static int input_device_name(lua_State* L, InputDevice& id)
  210. {
  211. LuaStack stack(L);
  212. stack.push_string(id.name());
  213. return 1;
  214. }
  215. static int input_device_connected(lua_State* L, InputDevice& id)
  216. {
  217. LuaStack stack(L);
  218. stack.push_bool(id.connected());
  219. return 1;
  220. }
  221. static int input_device_num_buttons(lua_State* L, InputDevice& id)
  222. {
  223. LuaStack stack(L);
  224. stack.push_uint32(id.num_buttons());
  225. return 1;
  226. }
  227. static int input_device_num_axes(lua_State* L, InputDevice& id)
  228. {
  229. LuaStack stack(L);
  230. stack.push_uint32(id.num_axes());
  231. return 1;
  232. }
  233. static int input_device_pressed(lua_State* L, InputDevice& id)
  234. {
  235. LuaStack stack(L);
  236. stack.push_bool(id.pressed(stack.get_int(1)));
  237. return 1;
  238. }
  239. static int input_device_released(lua_State* L, InputDevice& id)
  240. {
  241. LuaStack stack(L);
  242. stack.push_bool(id.released(stack.get_int(1)));
  243. return 1;
  244. }
  245. static int input_device_any_pressed(lua_State* L, InputDevice& id)
  246. {
  247. LuaStack stack(L);
  248. stack.push_bool(id.any_pressed());
  249. return 1;
  250. }
  251. static int input_device_any_released(lua_State* L, InputDevice& id)
  252. {
  253. LuaStack stack(L);
  254. stack.push_bool(id.any_released());
  255. return 1;
  256. }
  257. static int input_device_axis(lua_State* L, InputDevice& id)
  258. {
  259. LuaStack stack(L);
  260. stack.push_vector3(id.axis(stack.get_int(1)));
  261. return 1;
  262. }
  263. static int keyboard_button_id(lua_State* L)
  264. {
  265. LuaStack stack(L);
  266. stack.push_uint32(name_to_keyboard_button(stack, stack.get_string(1)));
  267. return 1;
  268. }
  269. static int mouse_button_id(lua_State* L)
  270. {
  271. LuaStack stack(L);
  272. stack.push_uint32(name_to_mouse_button(stack, stack.get_string(1)));
  273. return 1;
  274. }
  275. static int mouse_axis_id(lua_State* L)
  276. {
  277. LuaStack stack(L);
  278. stack.push_uint32(name_to_mouse_axis(stack, stack.get_string(1)));
  279. return 1;
  280. }
  281. static int pad_button_id(lua_State* L)
  282. {
  283. LuaStack stack(L);
  284. stack.push_uint32(name_to_pad_button(stack, stack.get_string(1)));
  285. return 1;
  286. }
  287. static int pad_axis_id(lua_State* L)
  288. {
  289. LuaStack stack(L);
  290. stack.push_uint32(name_to_pad_axis(stack, stack.get_string(1)));
  291. return 1;
  292. }
  293. #define KEYBOARD_FN(name) keyboard_##name
  294. #define MOUSE_FN(name) mouse_##name
  295. #define TOUCH_FN(name) touch_##name
  296. #define JOYPAD_FN(index, name) joypad_##name##index
  297. #define KEYBOARD(name) static int KEYBOARD_FN(name)(lua_State* L)\
  298. { return input_device_##name(L, *device()->input_manager()->keyboard()); }
  299. #define MOUSE(name) static int MOUSE_FN(name)(lua_State* L)\
  300. { return input_device_##name(L, *device()->input_manager()->mouse()); }
  301. #define TOUCH(name) static int TOUCH_FN(name)(lua_State* L)\
  302. { return input_device_##name(L, *device()->input_manager()->touch()); }
  303. #define JOYPAD(index, name) static int JOYPAD_FN(index, name)(lua_State* L)\
  304. { return input_device_##name(L, *device()->input_manager()->joypad(index)); }
  305. KEYBOARD(name)
  306. KEYBOARD(connected)
  307. KEYBOARD(num_buttons)
  308. KEYBOARD(num_axes)
  309. KEYBOARD(pressed)
  310. KEYBOARD(released)
  311. KEYBOARD(any_pressed)
  312. KEYBOARD(any_released)
  313. // KEYBOARD(axis) // Keyboard has no axis
  314. MOUSE(name)
  315. MOUSE(connected)
  316. MOUSE(num_buttons)
  317. MOUSE(num_axes)
  318. MOUSE(pressed)
  319. MOUSE(released)
  320. MOUSE(any_pressed)
  321. MOUSE(any_released)
  322. MOUSE(axis)
  323. TOUCH(name)
  324. TOUCH(connected)
  325. TOUCH(num_buttons)
  326. TOUCH(num_axes)
  327. TOUCH(pressed)
  328. TOUCH(released)
  329. TOUCH(any_pressed)
  330. TOUCH(any_released)
  331. TOUCH(axis)
  332. JOYPAD(0, name)
  333. JOYPAD(0, connected)
  334. JOYPAD(0, num_buttons)
  335. JOYPAD(0, num_axes)
  336. JOYPAD(0, pressed)
  337. JOYPAD(0, released)
  338. JOYPAD(0, any_pressed)
  339. JOYPAD(0, any_released)
  340. JOYPAD(0, axis)
  341. JOYPAD(1, name)
  342. JOYPAD(1, connected)
  343. JOYPAD(1, num_buttons)
  344. JOYPAD(1, num_axes)
  345. JOYPAD(1, pressed)
  346. JOYPAD(1, released)
  347. JOYPAD(1, any_pressed)
  348. JOYPAD(1, any_released)
  349. JOYPAD(1, axis)
  350. JOYPAD(2, name)
  351. JOYPAD(2, connected)
  352. JOYPAD(2, num_buttons)
  353. JOYPAD(2, num_axes)
  354. JOYPAD(2, pressed)
  355. JOYPAD(2, released)
  356. JOYPAD(2, any_pressed)
  357. JOYPAD(2, any_released)
  358. JOYPAD(2, axis)
  359. JOYPAD(3, name)
  360. JOYPAD(3, connected)
  361. JOYPAD(3, num_buttons)
  362. JOYPAD(3, num_axes)
  363. JOYPAD(3, pressed)
  364. JOYPAD(3, released)
  365. JOYPAD(3, any_pressed)
  366. JOYPAD(3, any_released)
  367. JOYPAD(3, axis)
  368. void load_input(LuaEnvironment& env)
  369. {
  370. env.load_module_function("Keyboard", "name", KEYBOARD_FN(name));
  371. env.load_module_function("Keyboard", "connected", KEYBOARD_FN(connected));
  372. env.load_module_function("Keyboard", "num_buttons", KEYBOARD_FN(num_buttons));
  373. env.load_module_function("Keyboard", "num_axes", KEYBOARD_FN(num_axes));
  374. env.load_module_function("Keyboard", "pressed", KEYBOARD_FN(pressed));
  375. env.load_module_function("Keyboard", "released", KEYBOARD_FN(released));
  376. env.load_module_function("Keyboard", "any_pressed", KEYBOARD_FN(any_pressed));
  377. env.load_module_function("Keyboard", "any_released", KEYBOARD_FN(any_released));
  378. env.load_module_function("Keyboard", "button_id", keyboard_button_id);
  379. env.load_module_function("Mouse", "name", MOUSE_FN(name));
  380. env.load_module_function("Mouse", "connected", MOUSE_FN(connected));
  381. env.load_module_function("Mouse", "num_buttons", MOUSE_FN(num_buttons));
  382. env.load_module_function("Mouse", "num_axes", MOUSE_FN(num_axes));
  383. env.load_module_function("Mouse", "pressed", MOUSE_FN(pressed));
  384. env.load_module_function("Mouse", "released", MOUSE_FN(released));
  385. env.load_module_function("Mouse", "any_pressed", MOUSE_FN(any_pressed));
  386. env.load_module_function("Mouse", "any_released", MOUSE_FN(any_released));
  387. env.load_module_function("Mouse", "axis", MOUSE_FN(axis));
  388. env.load_module_function("Mouse", "button_id", mouse_button_id);
  389. env.load_module_function("Mouse", "axis_id", mouse_axis_id);
  390. env.load_module_function("Touch", "name", TOUCH_FN(name));
  391. env.load_module_function("Touch", "connected", TOUCH_FN(connected));
  392. env.load_module_function("Touch", "num_buttons", TOUCH_FN(num_buttons));
  393. env.load_module_function("Touch", "num_axes", TOUCH_FN(num_axes));
  394. env.load_module_function("Touch", "pressed", TOUCH_FN(pressed));
  395. env.load_module_function("Touch", "released", TOUCH_FN(released));
  396. env.load_module_function("Touch", "any_pressed", TOUCH_FN(any_pressed));
  397. env.load_module_function("Touch", "any_released", TOUCH_FN(any_released));
  398. env.load_module_function("Touch", "axis", TOUCH_FN(axis));
  399. env.load_module_function("Pad1", "name", JOYPAD_FN(0, name));
  400. env.load_module_function("Pad1", "connected", JOYPAD_FN(0, connected));
  401. env.load_module_function("Pad1", "num_buttons", JOYPAD_FN(0, num_buttons));
  402. env.load_module_function("Pad1", "num_axes", JOYPAD_FN(0, num_axes));
  403. env.load_module_function("Pad1", "pressed", JOYPAD_FN(0, pressed));
  404. env.load_module_function("Pad1", "released", JOYPAD_FN(0, released));
  405. env.load_module_function("Pad1", "any_pressed", JOYPAD_FN(0, any_pressed));
  406. env.load_module_function("Pad1", "any_released", JOYPAD_FN(0, any_released));
  407. env.load_module_function("Pad1", "axis", JOYPAD_FN(0, axis));
  408. env.load_module_function("Pad1", "button_id", pad_button_id);
  409. env.load_module_function("Pad1", "axis_id", pad_axis_id);
  410. env.load_module_function("Pad2", "name", JOYPAD_FN(1, name));
  411. env.load_module_function("Pad2", "connected", JOYPAD_FN(1, connected));
  412. env.load_module_function("Pad2", "num_buttons", JOYPAD_FN(1, num_buttons));
  413. env.load_module_function("Pad2", "num_axes", JOYPAD_FN(1, num_axes));
  414. env.load_module_function("Pad2", "pressed", JOYPAD_FN(1, pressed));
  415. env.load_module_function("Pad2", "released", JOYPAD_FN(1, released));
  416. env.load_module_function("Pad2", "any_pressed", JOYPAD_FN(1, any_pressed));
  417. env.load_module_function("Pad2", "any_released", JOYPAD_FN(1, any_released));
  418. env.load_module_function("Pad2", "axis", JOYPAD_FN(1, axis));
  419. env.load_module_function("Pad2", "button_id", pad_button_id);
  420. env.load_module_function("Pad2", "axis_id", pad_axis_id);
  421. env.load_module_function("Pad3", "name", JOYPAD_FN(2, name));
  422. env.load_module_function("Pad3", "connected", JOYPAD_FN(2, connected));
  423. env.load_module_function("Pad3", "num_buttons", JOYPAD_FN(2, num_buttons));
  424. env.load_module_function("Pad3", "num_axes", JOYPAD_FN(2, num_axes));
  425. env.load_module_function("Pad3", "pressed", JOYPAD_FN(2, pressed));
  426. env.load_module_function("Pad3", "released", JOYPAD_FN(2, released));
  427. env.load_module_function("Pad3", "any_pressed", JOYPAD_FN(2, any_pressed));
  428. env.load_module_function("Pad3", "any_released", JOYPAD_FN(2, any_released));
  429. env.load_module_function("Pad3", "axis", JOYPAD_FN(2, axis));
  430. env.load_module_function("Pad3", "button_id", pad_button_id);
  431. env.load_module_function("Pad3", "axis_id", pad_axis_id);
  432. env.load_module_function("Pad4", "name", JOYPAD_FN(3, name));
  433. env.load_module_function("Pad4", "connected", JOYPAD_FN(3, connected));
  434. env.load_module_function("Pad4", "num_buttons", JOYPAD_FN(3, num_buttons));
  435. env.load_module_function("Pad4", "num_axes", JOYPAD_FN(3, num_axes));
  436. env.load_module_function("Pad4", "pressed", JOYPAD_FN(3, pressed));
  437. env.load_module_function("Pad4", "released", JOYPAD_FN(3, released));
  438. env.load_module_function("Pad4", "any_pressed", JOYPAD_FN(3, any_pressed));
  439. env.load_module_function("Pad4", "any_released", JOYPAD_FN(3, any_released));
  440. env.load_module_function("Pad4", "axis", JOYPAD_FN(3, axis));
  441. env.load_module_function("Pad4", "button_id", pad_button_id);
  442. env.load_module_function("Pad4", "axis_id", pad_axis_id);
  443. }
  444. } // namespace crown