entry_p.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /*
  2. * Copyright 2011-2017 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
  4. */
  5. #ifndef ENTRY_PRIVATE_H_HEADER_GUARD
  6. #define ENTRY_PRIVATE_H_HEADER_GUARD
  7. #define TINYSTL_ALLOCATOR entry::TinyStlAllocator
  8. #include <bx/spscqueue.h>
  9. #include "entry.h"
  10. #ifndef ENTRY_CONFIG_USE_NOOP
  11. # define ENTRY_CONFIG_USE_NOOP (BX_PLATFORM_QNX)
  12. #endif // ENTRY_CONFIG_USE_NOOP
  13. #ifndef ENTRY_CONFIG_USE_SDL
  14. # define ENTRY_CONFIG_USE_SDL BX_PLATFORM_STEAMLINK
  15. #endif // ENTRY_CONFIG_USE_SDL
  16. #ifndef ENTRY_CONFIG_USE_GLFW
  17. # define ENTRY_CONFIG_USE_GLFW 0
  18. #endif // ENTRY_CONFIG_USE_GLFW
  19. #if !defined(ENTRY_CONFIG_USE_NATIVE) \
  20. && !ENTRY_CONFIG_USE_NOOP \
  21. && !ENTRY_CONFIG_USE_SDL \
  22. && !ENTRY_CONFIG_USE_GLFW
  23. # define ENTRY_CONFIG_USE_NATIVE 1
  24. #else
  25. # define ENTRY_CONFIG_USE_NATIVE 0
  26. #endif // ...
  27. #ifndef ENTRY_CONFIG_MAX_WINDOWS
  28. # define ENTRY_CONFIG_MAX_WINDOWS 8
  29. #endif // ENTRY_CONFIG_MAX_WINDOWS
  30. #ifndef ENTRY_CONFIG_MAX_GAMEPADS
  31. # define ENTRY_CONFIG_MAX_GAMEPADS 4
  32. #endif // ENTRY_CONFIG_MAX_GAMEPADS
  33. #if !defined(ENTRY_DEFAULT_WIDTH) && !defined(ENTRY_DEFAULT_HEIGHT)
  34. # define ENTRY_DEFAULT_WIDTH 1280
  35. # define ENTRY_DEFAULT_HEIGHT 720
  36. #elif !defined(ENTRY_DEFAULT_WIDTH) || !defined(ENTRY_DEFAULT_HEIGHT)
  37. # error "Both ENTRY_DEFAULT_WIDTH and ENTRY_DEFAULT_HEIGHT must be defined."
  38. #endif // ENTRY_DEFAULT_WIDTH
  39. #ifndef ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR
  40. # define ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR 1
  41. #endif // ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR
  42. #ifndef ENTRY_CONFIG_PROFILER
  43. # define ENTRY_CONFIG_PROFILER 0
  44. #endif // ENTRY_CONFIG_PROFILER
  45. #define ENTRY_IMPLEMENT_EVENT(_class, _type) \
  46. _class(WindowHandle _handle) : Event(_type, _handle) {}
  47. namespace entry
  48. {
  49. struct TinyStlAllocator
  50. {
  51. static void* static_allocate(size_t _bytes);
  52. static void static_deallocate(void* _ptr, size_t /*_bytes*/);
  53. };
  54. int main(int _argc, char** _argv);
  55. char keyToAscii(Key::Enum _key, uint8_t _modifiers);
  56. struct Event
  57. {
  58. enum Enum
  59. {
  60. Axis,
  61. Char,
  62. Exit,
  63. Gamepad,
  64. Key,
  65. Mouse,
  66. Size,
  67. Window,
  68. Suspend,
  69. };
  70. Event(Enum _type)
  71. : m_type(_type)
  72. {
  73. m_handle.idx = UINT16_MAX;
  74. }
  75. Event(Enum _type, WindowHandle _handle)
  76. : m_type(_type)
  77. , m_handle(_handle)
  78. {
  79. }
  80. Event::Enum m_type;
  81. WindowHandle m_handle;
  82. };
  83. struct AxisEvent : public Event
  84. {
  85. ENTRY_IMPLEMENT_EVENT(AxisEvent, Event::Axis);
  86. GamepadAxis::Enum m_axis;
  87. int32_t m_value;
  88. GamepadHandle m_gamepad;
  89. };
  90. struct CharEvent : public Event
  91. {
  92. ENTRY_IMPLEMENT_EVENT(CharEvent, Event::Char);
  93. uint8_t m_len;
  94. uint8_t m_char[4];
  95. };
  96. struct GamepadEvent : public Event
  97. {
  98. ENTRY_IMPLEMENT_EVENT(GamepadEvent, Event::Gamepad);
  99. GamepadHandle m_gamepad;
  100. bool m_connected;
  101. };
  102. struct KeyEvent : public Event
  103. {
  104. ENTRY_IMPLEMENT_EVENT(KeyEvent, Event::Key);
  105. Key::Enum m_key;
  106. uint8_t m_modifiers;
  107. bool m_down;
  108. };
  109. struct MouseEvent : public Event
  110. {
  111. ENTRY_IMPLEMENT_EVENT(MouseEvent, Event::Mouse);
  112. int32_t m_mx;
  113. int32_t m_my;
  114. int32_t m_mz;
  115. MouseButton::Enum m_button;
  116. bool m_down;
  117. bool m_move;
  118. };
  119. struct SizeEvent : public Event
  120. {
  121. ENTRY_IMPLEMENT_EVENT(SizeEvent, Event::Size);
  122. uint32_t m_width;
  123. uint32_t m_height;
  124. };
  125. struct WindowEvent : public Event
  126. {
  127. ENTRY_IMPLEMENT_EVENT(WindowEvent, Event::Window);
  128. void* m_nwh;
  129. };
  130. struct SuspendEvent : public Event
  131. {
  132. ENTRY_IMPLEMENT_EVENT(SuspendEvent, Event::Suspend);
  133. Suspend::Enum m_state;
  134. };
  135. const Event* poll();
  136. const Event* poll(WindowHandle _handle);
  137. void release(const Event* _event);
  138. class EventQueue
  139. {
  140. public:
  141. ~EventQueue()
  142. {
  143. for (const Event* ev = poll(); NULL != ev; ev = poll() )
  144. {
  145. release(ev);
  146. }
  147. }
  148. void postAxisEvent(WindowHandle _handle, GamepadHandle _gamepad, GamepadAxis::Enum _axis, int32_t _value)
  149. {
  150. AxisEvent* ev = new AxisEvent(_handle);
  151. ev->m_gamepad = _gamepad;
  152. ev->m_axis = _axis;
  153. ev->m_value = _value;
  154. m_queue.push(ev);
  155. }
  156. void postCharEvent(WindowHandle _handle, uint8_t _len, const uint8_t _char[4])
  157. {
  158. CharEvent* ev = new CharEvent(_handle);
  159. ev->m_len = _len;
  160. bx::memCopy(ev->m_char, _char, 4);
  161. m_queue.push(ev);
  162. }
  163. void postExitEvent()
  164. {
  165. Event* ev = new Event(Event::Exit);
  166. m_queue.push(ev);
  167. }
  168. void postGamepadEvent(WindowHandle _handle, GamepadHandle _gamepad, bool _connected)
  169. {
  170. GamepadEvent* ev = new GamepadEvent(_handle);
  171. ev->m_gamepad = _gamepad;
  172. ev->m_connected = _connected;
  173. m_queue.push(ev);
  174. }
  175. void postKeyEvent(WindowHandle _handle, Key::Enum _key, uint8_t _modifiers, bool _down)
  176. {
  177. KeyEvent* ev = new KeyEvent(_handle);
  178. ev->m_key = _key;
  179. ev->m_modifiers = _modifiers;
  180. ev->m_down = _down;
  181. m_queue.push(ev);
  182. }
  183. void postMouseEvent(WindowHandle _handle, int32_t _mx, int32_t _my, int32_t _mz)
  184. {
  185. MouseEvent* ev = new MouseEvent(_handle);
  186. ev->m_mx = _mx;
  187. ev->m_my = _my;
  188. ev->m_mz = _mz;
  189. ev->m_button = MouseButton::None;
  190. ev->m_down = false;
  191. ev->m_move = true;
  192. m_queue.push(ev);
  193. }
  194. void postMouseEvent(WindowHandle _handle, int32_t _mx, int32_t _my, int32_t _mz, MouseButton::Enum _button, bool _down)
  195. {
  196. MouseEvent* ev = new MouseEvent(_handle);
  197. ev->m_mx = _mx;
  198. ev->m_my = _my;
  199. ev->m_mz = _mz;
  200. ev->m_button = _button;
  201. ev->m_down = _down;
  202. ev->m_move = false;
  203. m_queue.push(ev);
  204. }
  205. void postSizeEvent(WindowHandle _handle, uint32_t _width, uint32_t _height)
  206. {
  207. SizeEvent* ev = new SizeEvent(_handle);
  208. ev->m_width = _width;
  209. ev->m_height = _height;
  210. m_queue.push(ev);
  211. }
  212. void postWindowEvent(WindowHandle _handle, void* _nwh = NULL)
  213. {
  214. WindowEvent* ev = new WindowEvent(_handle);
  215. ev->m_nwh = _nwh;
  216. m_queue.push(ev);
  217. }
  218. void postSuspendEvent(WindowHandle _handle, Suspend::Enum _state)
  219. {
  220. SuspendEvent* ev = new SuspendEvent(_handle);
  221. ev->m_state = _state;
  222. m_queue.push(ev);
  223. }
  224. const Event* poll()
  225. {
  226. return m_queue.pop();
  227. }
  228. const Event* poll(WindowHandle _handle)
  229. {
  230. if (isValid(_handle) )
  231. {
  232. Event* ev = m_queue.peek();
  233. if (NULL == ev
  234. || ev->m_handle.idx != _handle.idx)
  235. {
  236. return NULL;
  237. }
  238. }
  239. return poll();
  240. }
  241. void release(const Event* _event) const
  242. {
  243. delete _event;
  244. }
  245. private:
  246. bx::SpScUnboundedQueue<Event> m_queue;
  247. };
  248. } // namespace entry
  249. #endif // ENTRY_PRIVATE_H_HEADER_GUARD