You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

169 line
3.5 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://sam.zoy.org/projects/COPYING.WTFPL for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <SDL.h>
  14. #include <cstdio>
  15. #include <cstdlib>
  16. #include <cmath>
  17. #include "core.h"
  18. /*
  19. * Input implementation class
  20. */
  21. static class InputData
  22. {
  23. friend class Input;
  24. public:
  25. InputData()
  26. : mouse(-1),
  27. buttons(0),
  28. nentities(0),
  29. lastfocus(0)
  30. { }
  31. private:
  32. int2 mouse;
  33. int3 buttons;
  34. static int const MAX_ENTITIES = 100;
  35. WorldEntity *entities[MAX_ENTITIES];
  36. int nentities;
  37. WorldEntity *lastfocus;
  38. }
  39. inputdata;
  40. static InputData * const data = &inputdata;
  41. /*
  42. * Public Input class
  43. */
  44. float2 Input::GetAxis(int axis)
  45. {
  46. float invsqrt2 = sqrtf(0.5f);
  47. float2 f;
  48. /* Simulate a joystick using the keyboard. This SDL call is free. */
  49. Uint8 *keystate = SDL_GetKeyState(NULL);
  50. int left = keystate[SDLK_d] - (keystate[SDLK_a] | keystate[SDLK_q]);
  51. int up = (keystate[SDLK_w] | keystate[SDLK_z]) - keystate[SDLK_s] ;
  52. f.x += left;
  53. f.y += up;
  54. if (left && up)
  55. f = f * invsqrt2;
  56. return f;
  57. }
  58. int2 Input::GetMousePos()
  59. {
  60. return data->mouse;
  61. }
  62. int3 Input::GetMouseButtons()
  63. {
  64. return data->buttons;
  65. }
  66. void Input::TrackMouse(WorldEntity *e)
  67. {
  68. if (data->nentities >= InputData::MAX_ENTITIES)
  69. return;
  70. data->entities[data->nentities] = e;
  71. data->nentities++;
  72. }
  73. void Input::UntrackMouse(WorldEntity *e)
  74. {
  75. for (int n = 0; n < data->nentities; n++)
  76. {
  77. if (data->entities[n] != e)
  78. continue;
  79. data->entities[n] = data->entities[data->nentities - 1];
  80. data->nentities--;
  81. n--;
  82. }
  83. }
  84. void Input::SetMousePos(int2 coord)
  85. {
  86. data->mouse = coord;
  87. WorldEntity *best = NULL;
  88. for (int n = 0; n < data->nentities; n++)
  89. {
  90. if (coord.x < data->entities[n]->bbox[0].x
  91. || coord.x >= data->entities[n]->bbox[1].x
  92. || coord.y < data->entities[n]->bbox[0].y
  93. || coord.y >= data->entities[n]->bbox[1].y)
  94. continue;
  95. if (!best || best->bbox[1].z < data->entities[n]->bbox[1].z)
  96. best = data->entities[n];
  97. }
  98. for (int n = 0; n < data->nentities; n++)
  99. {
  100. if (data->entities[n] == best)
  101. {
  102. data->entities[n]->mousepos = (int2)((int3)coord - best->bbox[0]);
  103. if (best != data->lastfocus)
  104. data->entities[n]->pressed = data->buttons;
  105. }
  106. else
  107. {
  108. data->entities[n]->mousepos = int2(-1);
  109. /* FIXME */
  110. data->entities[n]->released = 0;
  111. data->entities[n]->pressed = 0;
  112. data->entities[n]->clicked = 0;
  113. }
  114. }
  115. data->lastfocus = best;
  116. }
  117. void Input::SetMouseButton(int index)
  118. {
  119. data->buttons[index] = 1;
  120. if (data->lastfocus)
  121. {
  122. if (!data->lastfocus->pressed[index])
  123. data->lastfocus->clicked[index] = 1;
  124. data->lastfocus->pressed[index] = 1;
  125. data->lastfocus->released[index] = 0;
  126. }
  127. }
  128. void Input::UnsetMouseButton(int index)
  129. {
  130. data->buttons[index] = 0;
  131. if (data->lastfocus)
  132. {
  133. if (data->lastfocus->pressed[index])
  134. data->lastfocus->released[index] = 1;
  135. data->lastfocus->pressed[index] = 0;
  136. data->lastfocus->clicked[index] = 0;
  137. }
  138. }