platformInput.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #pragma once
  2. #include <GLFW/glfw3.h>
  3. #include "gameLayer.h"
  4. #include <string>
  5. namespace platform
  6. {
  7. struct Button
  8. {
  9. char pressed = 0;
  10. char held = 0;
  11. char released = 0;
  12. char newState = -1; // this can be -1, used for internal logic
  13. char typed = 0;
  14. float typedTime = 0;
  15. enum
  16. {
  17. A = 0,
  18. B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
  19. NR0, NR1, NR2, NR3, NR4, NR5, NR6, NR7, NR8, NR9,
  20. Space,
  21. Enter,
  22. Escape,
  23. Up,
  24. Down,
  25. Left,
  26. Right,
  27. LeftCtrl,
  28. LeftAlt,
  29. LeftShift,
  30. SlashQuestionMark,
  31. F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12,
  32. BUTTONS_COUNT, //
  33. };
  34. //static constexpr int buttonValues[BUTTONS_COUNT] =
  35. //{
  36. // GLFW_KEY_A, GLFW_KEY_B, GLFW_KEY_C, GLFW_KEY_D, GLFW_KEY_E, GLFW_KEY_F, GLFW_KEY_G,
  37. // GLFW_KEY_H, GLFW_KEY_I, GLFW_KEY_J, GLFW_KEY_K, GLFW_KEY_L, GLFW_KEY_M, GLFW_KEY_N,
  38. // GLFW_KEY_O, GLFW_KEY_P, GLFW_KEY_Q, GLFW_KEY_R, GLFW_KEY_S, GLFW_KEY_T, GLFW_KEY_U,
  39. // GLFW_KEY_V, GLFW_KEY_W, GLFW_KEY_X, GLFW_KEY_Y, GLFW_KEY_Z,
  40. // GLFW_KEY_0, GLFW_KEY_1, GLFW_KEY_2, GLFW_KEY_3, GLFW_KEY_4, GLFW_KEY_5, GLFW_KEY_6,
  41. // GLFW_KEY_7, GLFW_KEY_8, GLFW_KEY_9,
  42. // GLFW_KEY_SPACE, GLFW_KEY_ENTER, GLFW_KEY_ESCAPE, GLFW_KEY_UP, GLFW_KEY_DOWN, GLFW_KEY_LEFT, GLFW_KEY_RIGHT
  43. //};
  44. void merge(const Button &b)
  45. {
  46. this->pressed |= b.pressed;
  47. this->released |= b.released;
  48. this->held |= b.held;
  49. }
  50. };
  51. namespace internal
  52. {
  53. inline void resetButtonToZero(Button &b)
  54. {
  55. b.pressed = 0;
  56. b.held = 0;
  57. b.released = 0;
  58. }
  59. }
  60. struct ControllerButtons
  61. {
  62. enum Buttons
  63. {
  64. A = GLFW_GAMEPAD_BUTTON_A,
  65. B = GLFW_GAMEPAD_BUTTON_B,
  66. X = GLFW_GAMEPAD_BUTTON_X,
  67. Y = GLFW_GAMEPAD_BUTTON_Y,
  68. LBumper = GLFW_GAMEPAD_BUTTON_LEFT_BUMPER,
  69. RBumper = GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER,
  70. Back = GLFW_GAMEPAD_BUTTON_BACK,
  71. Start = GLFW_GAMEPAD_BUTTON_START,
  72. Guide = GLFW_GAMEPAD_BUTTON_GUIDE,
  73. LThumb = GLFW_GAMEPAD_BUTTON_LEFT_THUMB,
  74. Rthumb = GLFW_GAMEPAD_BUTTON_RIGHT_THUMB,
  75. Up = GLFW_GAMEPAD_BUTTON_DPAD_UP,
  76. Right = GLFW_GAMEPAD_BUTTON_DPAD_RIGHT,
  77. Down = GLFW_GAMEPAD_BUTTON_DPAD_DOWN,
  78. Left = GLFW_GAMEPAD_BUTTON_DPAD_LEFT,
  79. };
  80. Button buttons[GLFW_GAMEPAD_BUTTON_LAST + 1] = {};
  81. float LT = 0.f;
  82. float RT = 0.f;
  83. struct
  84. {
  85. float x = 0.f, y = 0.f;
  86. }LStick, RStick;
  87. void setAllToZero()
  88. {
  89. *this = ControllerButtons();
  90. }
  91. };
  92. //Button::key
  93. int isKeyHeld(int key);
  94. int isKeyPressedOn(int key);
  95. int isKeyReleased(int key);
  96. int isKeyTyped(int key);
  97. int isLMousePressed();
  98. int isRMousePressed();
  99. int isLMouseReleased();
  100. int isRMouseReleased();
  101. int isLMouseHeld();
  102. int isRMouseHeld();
  103. ControllerButtons getControllerButtons();
  104. std::string getTypedInput();
  105. namespace internal
  106. {
  107. void setButtonState(int button, int newState);
  108. void setLeftMouseState(int newState);
  109. void setRightMouseState(int newState);
  110. inline void processEventButton(Button &b, bool newState)
  111. {
  112. b.newState = newState;
  113. }
  114. inline void updateButton(Button &b, float deltaTime)
  115. {
  116. if (b.newState == 1)
  117. {
  118. if (b.held)
  119. {
  120. b.pressed = false;
  121. }
  122. else
  123. {
  124. b.pressed = true;
  125. }
  126. b.held = true;
  127. b.released = false;
  128. }
  129. else if(b.newState == 0)
  130. {
  131. b.held = false;
  132. b.pressed = false;
  133. b.released = true;
  134. }else
  135. {
  136. b.pressed = false;
  137. b.released = false;
  138. }
  139. //processing typed
  140. if (b.pressed)
  141. {
  142. b.typed = true;
  143. b.typedTime = 0.48f;
  144. }
  145. else if(b.held)
  146. {
  147. b.typedTime -= deltaTime;
  148. if (b.typedTime < 0.f)
  149. {
  150. b.typedTime += 0.07f;
  151. b.typed = true;
  152. }
  153. else
  154. {
  155. b.typed = false;
  156. }
  157. }
  158. else
  159. {
  160. b.typedTime = 0;
  161. b.typed = false;
  162. }
  163. b.newState = -1;
  164. }
  165. void updateAllButtons(float deltaTime);
  166. void resetInputsToZero();
  167. void addToTypedInput(char c);
  168. void resetTypedInput();
  169. };
  170. };