entry_p.h 6.2 KB

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