platformInput.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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. BUTTONS_COUNT, //
  30. };
  31. //static constexpr int buttonValues[BUTTONS_COUNT] =
  32. //{
  33. // GLFW_KEY_A, GLFW_KEY_B, GLFW_KEY_C, GLFW_KEY_D, GLFW_KEY_E, GLFW_KEY_F, GLFW_KEY_G,
  34. // GLFW_KEY_H, GLFW_KEY_I, GLFW_KEY_J, GLFW_KEY_K, GLFW_KEY_L, GLFW_KEY_M, GLFW_KEY_N,
  35. // GLFW_KEY_O, GLFW_KEY_P, GLFW_KEY_Q, GLFW_KEY_R, GLFW_KEY_S, GLFW_KEY_T, GLFW_KEY_U,
  36. // GLFW_KEY_V, GLFW_KEY_W, GLFW_KEY_X, GLFW_KEY_Y, GLFW_KEY_Z,
  37. // GLFW_KEY_0, GLFW_KEY_1, GLFW_KEY_2, GLFW_KEY_3, GLFW_KEY_4, GLFW_KEY_5, GLFW_KEY_6,
  38. // GLFW_KEY_7, GLFW_KEY_8, GLFW_KEY_9,
  39. // GLFW_KEY_SPACE, GLFW_KEY_ENTER, GLFW_KEY_ESCAPE, GLFW_KEY_UP, GLFW_KEY_DOWN, GLFW_KEY_LEFT, GLFW_KEY_RIGHT
  40. //};
  41. void merge(const Button &b)
  42. {
  43. this->pressed |= b.pressed;
  44. this->released |= b.released;
  45. this->held |= b.held;
  46. }
  47. };
  48. namespace internal
  49. {
  50. inline void resetButtonToZero(Button &b)
  51. {
  52. b.pressed = 0;
  53. b.held = 0;
  54. b.released = 0;
  55. }
  56. }
  57. struct ControllerButtons
  58. {
  59. enum Buttons
  60. {
  61. A = GLFW_GAMEPAD_BUTTON_A,
  62. B = GLFW_GAMEPAD_BUTTON_B,
  63. X = GLFW_GAMEPAD_BUTTON_X,
  64. Y = GLFW_GAMEPAD_BUTTON_Y,
  65. LBumper = GLFW_GAMEPAD_BUTTON_LEFT_BUMPER,
  66. RBumper = GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER,
  67. Back = GLFW_GAMEPAD_BUTTON_BACK,
  68. Start = GLFW_GAMEPAD_BUTTON_START,
  69. Guide = GLFW_GAMEPAD_BUTTON_GUIDE,
  70. LThumb = GLFW_GAMEPAD_BUTTON_LEFT_THUMB,
  71. Rthumb = GLFW_GAMEPAD_BUTTON_RIGHT_THUMB,
  72. Up = GLFW_GAMEPAD_BUTTON_DPAD_UP,
  73. Right = GLFW_GAMEPAD_BUTTON_DPAD_RIGHT,
  74. Down = GLFW_GAMEPAD_BUTTON_DPAD_DOWN,
  75. Left = GLFW_GAMEPAD_BUTTON_DPAD_LEFT,
  76. };
  77. Button buttons[GLFW_GAMEPAD_BUTTON_LAST + 1] = {};
  78. float LT = 0.f;
  79. float RT = 0.f;
  80. struct
  81. {
  82. float x = 0.f, y = 0.f;
  83. }LStick, RStick;
  84. void setAllToZero()
  85. {
  86. *this = ControllerButtons();
  87. }
  88. };
  89. //Button::key
  90. int isKeyHeld(int key);
  91. int isKeyPressedOn(int key);
  92. int isKeyReleased(int key);
  93. int isKeyTyped(int key);
  94. int isLMousePressed();
  95. int isRMousePressed();
  96. int isLMouseReleased();
  97. int isRMouseReleased();
  98. int isLMouseHeld();
  99. int isRMouseHeld();
  100. ControllerButtons getControllerButtons();
  101. std::string getTypedInput();
  102. namespace internal
  103. {
  104. void setButtonState(int button, int newState);
  105. void setLeftMouseState(int newState);
  106. void setRightMouseState(int newState);
  107. inline void processEventButton(Button &b, bool newState)
  108. {
  109. b.newState = newState;
  110. }
  111. inline void updateButton(Button &b, float deltaTime)
  112. {
  113. if (b.newState == 1)
  114. {
  115. if (b.held)
  116. {
  117. b.pressed = false;
  118. }
  119. else
  120. {
  121. b.pressed = true;
  122. }
  123. b.held = true;
  124. b.released = false;
  125. }
  126. else if(b.newState == 0)
  127. {
  128. b.held = false;
  129. b.pressed = false;
  130. b.released = true;
  131. }else
  132. {
  133. b.pressed = false;
  134. b.released = false;
  135. }
  136. //processing typed
  137. if (b.pressed)
  138. {
  139. b.typed = true;
  140. b.typedTime = 0.48f;
  141. }
  142. else if(b.held)
  143. {
  144. b.typedTime -= deltaTime;
  145. if (b.typedTime < 0.f)
  146. {
  147. b.typedTime += 0.07f;
  148. b.typed = true;
  149. }
  150. else
  151. {
  152. b.typed = false;
  153. }
  154. }
  155. else
  156. {
  157. b.typedTime = 0;
  158. b.typed = false;
  159. }
  160. b.newState = -1;
  161. }
  162. void updateAllButtons(float deltaTime);
  163. void resetInputsToZero();
  164. void addToTypedInput(char c);
  165. void resetTypedInput();
  166. };
  167. };