userInput.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. //---------------------------------------------------------------------------
  2. //
  3. // MechCommander 2
  4. //
  5. // UserInput Class -- Polls the state of keyboard, mouse, joystick
  6. // for this frame and stores values.
  7. //
  8. //---------------------------------------------------------------------------//
  9. // Copyright (C) Microsoft Corporation. All rights reserved. //
  10. //===========================================================================//
  11. #ifndef USERINPUT_H
  12. #define USERINPUT_H
  13. #ifndef DSTD_H
  14. #include "dstd.h"
  15. #endif
  16. #ifndef MATHFUNC_H
  17. #include "mathfunc.h"
  18. #endif
  19. #ifndef UTILITIES_H
  20. #include "Utilities.h"
  21. #endif
  22. #include <string.h>
  23. #include <gameos.hpp>
  24. //---------------------------------------------------------------------------
  25. #define MC2_MOUSE_UP 0
  26. #define MC2_MOUSE_DOWN 1
  27. #define MOUSE_WIDTH 32
  28. #define MAX_MOUSE_STATES 256
  29. #define mState_MOVE 0
  30. #define mState_MOVE_LOS 1
  31. #define mState_RUN 2
  32. #define mState_RUN_LOS 3
  33. #define mState_JUMP 4
  34. #define mState_JUMP_LOS 5
  35. #define mState_WALKWAYPT 6
  36. #define mState_WALKWAYPT_LOS 7
  37. #define mState_RUNWAYPT 8
  38. #define mState_RUNWAYPT_LOS 9
  39. #define mState_JUMPWAYPT 10
  40. #define mState_JUMPWAYPT_LOS 11
  41. #define mState_LINK 12
  42. #define mState_GENERIC_ATTACK 13
  43. #define mState_ATTACK_LOS 14
  44. #define mState_CURPOS_ATTACK 15
  45. #define mState_CURPOS_ATTACK_LOS 16
  46. #define mState_ENERGY_WEAPONS 17
  47. #define mState_ENERGY_WEAPONS_LOS 18
  48. #define mState_AIMED_ATTACK 19
  49. #define mState_AIMED_ATTACK_LOS 20
  50. #define mState_NORMAL 21
  51. #define mState_INFO 22
  52. #define mState_LAYMINES 23
  53. #define mState_ROTATE_CAMERA 24
  54. #define mState_UNCERTAIN_AIRSTRIKE 25
  55. #define mState_AIRSTRIKE 26
  56. #define mState_SENSORSTRIKE 27
  57. #define mState_VEHICLE 28
  58. #define mState_CANTVEHICLE 29
  59. #define mState_DONT 30
  60. #define mState_REPAIR 31
  61. #define mState_XREPAIR 32
  62. #define mState_EJECT 33
  63. #define mState_XEJECT 34
  64. #define mState_CAPTURE 35
  65. #define mState_XCAPTURE 36
  66. #define mState_SALVAGE 37
  67. #define mState_XSALVAGE 38
  68. #define mState_GUARD 39
  69. #define mState_GUARD_LOS 39
  70. #define mState_GUARDTOWER 40
  71. #define mState_GUARDTOWER_LOS 41
  72. #define mState_XMINES 42
  73. #define mState_LOGISTICS 43
  74. #define mState_TUTORIALS 44
  75. #define mState_LONGRNG_ATTACK 45
  76. #define mState_SHRTRNG_ATTACK 46
  77. #define mState_MEDRNG_ATTACK 47
  78. #define mState_WALK1 48
  79. #define mState_WALKLOS1 80
  80. #define mState_RUN1 112
  81. #define mState_RUNLOS1 144
  82. #define mState_JUMP1 176
  83. #define mState_JUMPLOS1 208
  84. #define mState_LONGRNG_LOS 240
  85. #define mState_MEDRNG_LOS 241
  86. #define mState_SHRTRNG_LOS 242
  87. #define mState_NUMMOUSESTATES 243 //Add states BETWEEN this one and above!!!
  88. //Used to keep from setting cursor to STUPID!!
  89. #define mouseFrameRate 0.10
  90. extern volatile char mc2MouseHotSpotX;
  91. extern volatile char mc2MouseHotSpotY;
  92. extern volatile char mc2MouseWidth;
  93. extern volatile char mc2MouseHeight;
  94. extern volatile bool mc2UseAsyncMouse; //Should mouse draw and update in separate thread?
  95. extern volatile bool mc2MouseThreadStarted; //Has the thread starting running yet?
  96. extern volatile MemoryPtr mc2MouseData;
  97. //---------------------------------------------------------------------------
  98. class MouseCursorData
  99. {
  100. protected:
  101. //---------------------------------------------------------------
  102. // Mouse textures are assumed 32x32. Animating mice are stored
  103. // on the smallest texture that will hold their shape. Thus if
  104. // have a mouse with four frames of animation it will be stored
  105. // on a 64x64.
  106. long numCursors;
  107. StaticInfo* cursorInfos; // gotta be pointer, so destructor is called before texmgr quits
  108. char mouseHS[MAX_MOUSE_STATES][2];
  109. unsigned long numFrames[MAX_MOUSE_STATES];
  110. float frameLengths[MAX_MOUSE_STATES];
  111. friend class UserInput;
  112. public:
  113. MouseCursorData (void)
  114. {
  115. init();
  116. }
  117. ~MouseCursorData (void)
  118. {
  119. destroy();
  120. }
  121. void destroy (void);
  122. void init (void)
  123. {
  124. numCursors = 0;
  125. cursorInfos = 0;
  126. memset( mouseHS, 0, sizeof( mouseHS ) );
  127. memset( numFrames, 0, sizeof( numFrames ) );
  128. memset( frameLengths, 0, sizeof( frameLengths ) );
  129. }
  130. long getNumFrames (long state)
  131. {
  132. if ((state >= 0) && (state < numCursors))
  133. return numFrames[state]; // no animating for now
  134. return 0;
  135. }
  136. char getMouseHSX (long state)
  137. {
  138. if ((state >= 0) && (state < numCursors))
  139. return mouseHS[state][0];
  140. return 0;
  141. }
  142. char getMouseHSY (long state)
  143. {
  144. if ((state >= 0) && (state < numCursors))
  145. return mouseHS[state][1];
  146. return 0;
  147. }
  148. void initCursors (char *cursorFile);
  149. };
  150. //---------------------------------------------------------------------------
  151. class UserInput
  152. {
  153. protected:
  154. //--------------------
  155. // Mouse Information
  156. float mouseXPosition; //Current Mouse X Position.
  157. float mouseYPosition; //Current Mouse Y position.
  158. long mouseXDelta; //Amount mouse has moved in x since last poll
  159. long mouseYDelta; //Amount mouse has moved in y since last poll
  160. long mouseWheelDelta; //Amount Mouse wheel has moved since last poll
  161. long leftMouseButtonState; //Mouse Current Left Button State
  162. long rightMouseButtonState; //Mouse Current Right Button State
  163. long middleMouseButtonState; //Mouse Current Middle Button State
  164. bool leftClick; //Mouse has been left clicked
  165. bool rightClick; //Mouse has been right clicked
  166. bool leftDoubleClick; //Mouse has been left double clicked
  167. bool rightDoubleClick; //Mouse has been right double clicked
  168. bool middleClick; //Mouse has been middle clicked
  169. bool middleDoubleClick; //Mouse has been middle Double Clicked
  170. bool leftMouseDrag; //Mouse is left Dragging
  171. bool rightMouseDrag; //Mouse is right Dragging
  172. bool wasLeftMouseDrag; //Mouse is left Dragging
  173. bool wasRightMouseDrag; //Mouse is right Dragging
  174. float mouseDragX; //Where we started Dragging
  175. float mouseDragY; //Where we started Dragging;
  176. float mouseDragThreshold; //Distance mouse MUST move before a drag is assumed.
  177. float mouseDblClickThreshold; //Time between clicks maximum to assume double click.
  178. float mouseLeftUpTime; //Time since last left mouse up.
  179. float mouseRightUpTime; //Time since last right mouse up.
  180. float mouseMiddleUpTime; //Time since last right mouse up.
  181. float mouseLeftHeldTime; //How long the mouse has been down
  182. float mouseRightHeldTime; //How long the mouse has been down
  183. long lastLeftMouseButtonState; //Last Left Mouse Button State
  184. long lastRightMouseButtonState; //Last Right Mouse Button State
  185. long lastMiddleMouseButtonState; //Last Middle Mouse Button State
  186. float lastMouseXPosition; //Last Mouse X Position.
  187. float lastMouseYPosition; //Last Mouse Y Position.
  188. MouseCursorData *cursors; //Stores the actual cursor data and Info
  189. bool drawTerrainPointer; //Draw an inverse project cross
  190. long mouseState; //Which cursor should I draw?
  191. long mouseFrame; //current Mouse Frame
  192. DWORD mouseTextureHandle; //current Mouse Texture handle.
  193. float mouseFrameLength; //Time in Current Mouse Frame
  194. float mouseScale; //Scale factor for cursor for depth cueing.
  195. float viewMulX;
  196. float viewAddX;
  197. float viewMulY;
  198. float viewAddY;
  199. bool leftMouseJustUp; // leftButtonUp message equivalent
  200. bool rightMouseJustUp; // right up equivalent
  201. DWORD attilaIndex; // Set to 0xffffffff if no Attila Present.
  202. public:
  203. //Need to have the mouse draw here
  204. static volatile bool drawMouse; //Should I draw the Mouse Cursor?
  205. UserInput (void)
  206. {
  207. init();
  208. }
  209. ~UserInput (void)
  210. {
  211. destroy();
  212. }
  213. void init (void)
  214. {
  215. mouseScale = 1.0f;
  216. mouseXPosition = mouseYPosition = 0.0;
  217. mouseXDelta = mouseYDelta =
  218. mouseWheelDelta = 0;
  219. leftClick = rightClick = middleClick = false;
  220. leftMouseButtonState = rightMouseButtonState = middleMouseButtonState = MC2_MOUSE_UP;
  221. leftMouseDrag = rightMouseDrag = false;
  222. leftDoubleClick = rightDoubleClick = middleDoubleClick = false;
  223. mouseDragThreshold = 0.0166667f;
  224. mouseDblClickThreshold = 0.2f;
  225. mouseLeftUpTime = mouseRightUpTime = mouseMiddleUpTime = 0.0;
  226. mouseDragX = mouseDragY = 0.0;
  227. lastLeftMouseButtonState = lastRightMouseButtonState = lastMiddleMouseButtonState = MC2_MOUSE_UP;
  228. lastMouseYPosition = lastMouseXPosition = 0.0;
  229. drawTerrainPointer = false;
  230. mouseState = -1;
  231. mouseFrameLength = 0.0;
  232. viewMulX = viewMulY = viewAddX = viewAddY = 0.0f;
  233. leftMouseJustUp = 0;
  234. rightMouseJustUp = 0;
  235. attilaIndex = 0xffffffff;
  236. mouseLeftHeldTime = 0.f;
  237. mouseRightHeldTime = 0.f;
  238. cursors = NULL;
  239. }
  240. void initMouseCursors (char *mouseFile);
  241. void destroy (void)
  242. {
  243. if ( cursors )
  244. {
  245. delete cursors;
  246. cursors = NULL;
  247. }
  248. init();
  249. }
  250. void setViewport(float mulX, float mulY, float addX, float addY)
  251. {
  252. viewMulX = mulX;
  253. viewMulY = mulY;
  254. viewAddX = addX;
  255. viewAddY = addY;
  256. }
  257. //------------------------
  258. // Keyboard Functionality
  259. bool getKeyDown (gosEnum_KeyIndex index)
  260. {
  261. if ((gos_GetKeyStatus(index) == KEY_HELD) || (gos_GetKeyStatus(index) == KEY_PRESSED))
  262. return true;
  263. return(false);
  264. }
  265. bool leftShift (void)
  266. {
  267. return (getKeyDown(KEY_LSHIFT));
  268. }
  269. bool rightShift (void)
  270. {
  271. return (getKeyDown(KEY_RSHIFT));
  272. }
  273. bool shift (void)
  274. {
  275. return (leftShift() || rightShift());
  276. }
  277. bool leftAlt (void)
  278. {
  279. return (getKeyDown(KEY_LMENU));
  280. }
  281. bool rightAlt (void)
  282. {
  283. return (getKeyDown(KEY_RMENU));
  284. }
  285. bool alt (void)
  286. {
  287. return (leftAlt() || rightAlt());
  288. }
  289. bool leftCtrl (void)
  290. {
  291. return (getKeyDown(KEY_LCONTROL));
  292. }
  293. bool rightCtrl (void)
  294. {
  295. return (getKeyDown(KEY_RCONTROL));
  296. }
  297. bool ctrl (void)
  298. {
  299. return (leftCtrl() || rightCtrl());
  300. }
  301. //---------------------------------
  302. // Mouse Functionality
  303. void setMouseDoubleClickThreshold (float time)
  304. {
  305. mouseDblClickThreshold = time;
  306. }
  307. void setMouseDragThreshold (float distance)
  308. {
  309. mouseDragThreshold = distance;
  310. }
  311. long getMouseX (void)
  312. {
  313. return float2long(mouseXPosition * viewMulX);
  314. }
  315. long getMouseY (void)
  316. {
  317. return float2long(mouseYPosition * viewMulY);
  318. }
  319. float realMouseX (void)
  320. {
  321. return (mouseXPosition * viewMulX);
  322. }
  323. float realMouseY (void)
  324. {
  325. return (mouseYPosition * viewMulY);
  326. }
  327. void setMousePos (float x, float y)
  328. {
  329. float xRes = 0.0f;
  330. float yRes = 0.0f;
  331. if ((fabs(viewMulX) > Stuff::SMALL) &&
  332. (fabs(viewMulY) > Stuff::SMALL))
  333. {
  334. xRes = x/viewMulX;
  335. yRes = y/viewMulY;
  336. }
  337. gos_SetMousePosition(xRes,yRes);
  338. }
  339. long getMouseXDelta (void)
  340. {
  341. return mouseXDelta;
  342. }
  343. long getMouseYDelta (void)
  344. {
  345. return mouseYDelta;
  346. }
  347. long getMouseWheelDelta (void)
  348. {
  349. return mouseWheelDelta;
  350. }
  351. long getMouseLeftButtonState (void)
  352. {
  353. return leftMouseButtonState;
  354. }
  355. long getMouseRightButtonState (void)
  356. {
  357. return rightMouseButtonState;
  358. }
  359. bool isLeftDrag (void)
  360. {
  361. return leftMouseDrag;
  362. }
  363. bool isRightDrag (void)
  364. {
  365. return rightMouseDrag;
  366. }
  367. bool wasLeftDrag (void)
  368. {
  369. return wasLeftMouseDrag;
  370. }
  371. bool wasRightDrag (void)
  372. {
  373. return wasRightMouseDrag;
  374. }
  375. float getMouseDragX (void)
  376. {
  377. return mouseDragX * viewMulX;
  378. }
  379. float getMouseDragY (void)
  380. {
  381. return mouseDragY * viewMulY;
  382. }
  383. bool isLeftClick (void) {
  384. return(leftClick);
  385. }
  386. bool isRightClick (void) {
  387. return(rightClick);
  388. }
  389. // bool isLeftHeld() {
  390. // return isLeftClick && lastLeftMouseButtonState == MC2_MOUSE_DOWN;
  391. // }
  392. bool isLeftDoubleClick (void)
  393. {
  394. return leftDoubleClick;
  395. }
  396. bool isRightDoubleClick (void)
  397. {
  398. return rightDoubleClick;
  399. }
  400. bool isMiddleClick (void)
  401. {
  402. return middleClick;
  403. }
  404. bool isMiddleDoubleClick (void)
  405. {
  406. return middleDoubleClick;
  407. }
  408. void setMouseCursor (long state);
  409. long getMouseCursor (void)
  410. {
  411. return (mouseState);
  412. }
  413. void setMouseFrame (long frameNum)
  414. {
  415. mouseFrame = frameNum;
  416. }
  417. long getMouseFrame (void)
  418. {
  419. return (mouseFrame);
  420. }
  421. void mouseOn (void); //Draw Mouse Cursor
  422. void mouseOff (void); //Don't Draw Mouse Cursor
  423. void pointerOn (void)
  424. {
  425. drawTerrainPointer = true;
  426. }
  427. void pointerOff (void)
  428. {
  429. drawTerrainPointer = false;
  430. }
  431. bool leftMouseReleased()
  432. {
  433. return leftMouseJustUp;
  434. }
  435. bool rightMouseReleased()
  436. {
  437. return rightMouseJustUp;
  438. }
  439. //------------------------------------------------------------------------------------
  440. // Used to make mouse move off into distance in perspective to help depth perception
  441. void setMouseScale (float scaleFactor);
  442. //----------------------------------------------------------
  443. // Attila Functionality.
  444. void addAttila (DWORD joyIndex)
  445. {
  446. attilaIndex = joyIndex;
  447. }
  448. float getAttilaXAxis (void) //Left/Right Scroll
  449. {
  450. float result = 0.0f;
  451. if (attilaIndex != 0xffffffff)
  452. result = gosJoystick_GetAxis(attilaIndex, JOY_XAXIS);
  453. return result;
  454. }
  455. float getAttilaYAxis (void) //Up/Down Scroll
  456. {
  457. float result = 0.0f;
  458. if (attilaIndex != 0xffffffff)
  459. result = gosJoystick_GetAxis(attilaIndex, JOY_YAXIS);
  460. return result;
  461. }
  462. float getAttilaRAxis (void) //Camera Rotation
  463. {
  464. float result = 0.0f;
  465. if (attilaIndex != 0xffffffff)
  466. result = gosJoystick_GetAxis(attilaIndex, JOY_RZAXIS);
  467. return result;
  468. }
  469. float getMouseRightHeld()
  470. {
  471. return mouseRightHeldTime;
  472. }
  473. float getMouseLeftHeld()
  474. {
  475. return mouseLeftHeldTime;
  476. }
  477. //------------------------
  478. // Poller
  479. void update (void);
  480. void render (void); //Last thing rendered. Draws Mouse.
  481. };
  482. extern UserInput *userInput;
  483. //---------------------------------------------------------------------------
  484. #endif