MouseMgr.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. ///////////////////////////////////////////////////////////////////////////////////////
  19. //
  20. // MouseMgr.H
  21. //
  22. // Class declarations for managing different mouse modes;
  23. //
  24. #ifndef __MOUSEMGR_H
  25. #define __MOUSEMGR_H
  26. #include "refcount.h"
  27. #include "utils.h"
  28. #include "rendobj.h"
  29. #include "assetmgr.h"
  30. #include "cameramgr.h"
  31. class WaypathNodeClass;
  32. class ZoneInstanceClass;
  33. class TransitionInstanceClass;
  34. ///////////////////////////////////////////////////////////////
  35. //
  36. // MouseModeClass
  37. //
  38. ///////////////////////////////////////////////////////////////
  39. class MouseModeClass
  40. {
  41. public:
  42. ///////////////////////////////////////////////////
  43. // Public constructors/destructors
  44. ///////////////////////////////////////////////////
  45. MouseModeClass (void)
  46. : m_bUpdate (false) { }
  47. virtual ~MouseModeClass (void) { }
  48. ///////////////////////////////////////////////////
  49. // Public methods
  50. ///////////////////////////////////////////////////
  51. //
  52. // Mouse message handlers
  53. //
  54. virtual void Handle_LButton_Dblclk (UINT flags, CPoint point) { }
  55. virtual void Handle_LButton_Down (UINT flags, CPoint point);
  56. virtual void Handle_LButton_Up (UINT flags, CPoint point);
  57. virtual void Handle_RButton_Down (UINT flags, CPoint point);
  58. virtual void Handle_RButton_Up (UINT flags, CPoint point);
  59. virtual void Handle_Mouse_Move (UINT flags, CPoint point);
  60. //
  61. // Misc virtuals
  62. //
  63. virtual void On_Mode_Set (void) {}
  64. virtual void On_Mode_Exit (void) {}
  65. protected:
  66. friend class MouseMgrClass;
  67. ///////////////////////////////////////////////////
  68. // Protected member data
  69. ///////////////////////////////////////////////////
  70. CPoint m_LastMousePoint;
  71. CPoint m_MousePoint;
  72. bool m_bUpdate;
  73. CameraMgr::CAMERA_MODE m_LButtonMode;
  74. CameraMgr::CAMERA_MODE m_RButtonMode;
  75. CameraMgr::CAMERA_MODE m_BothButtonMode;
  76. };
  77. ///////////////////////////////////////////////////////////////
  78. //
  79. // MMCameraDefaultClass
  80. //
  81. ///////////////////////////////////////////////////////////////
  82. class MMCameraDefaultClass : public MouseModeClass
  83. {
  84. public:
  85. /////////////////////////////////////////////////////
  86. // Public constructors/destructors
  87. /////////////////////////////////////////////////////
  88. MMCameraDefaultClass (void)
  89. {
  90. m_LButtonMode = CameraMgr::MODE_ROTATE_FREE;
  91. m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
  92. m_BothButtonMode = CameraMgr::MODE_MOVE_UPDOWN;
  93. }
  94. virtual ~MMCameraDefaultClass (void) { }
  95. };
  96. ///////////////////////////////////////////////////////////////
  97. //
  98. // MMCameraWalkClass
  99. //
  100. ///////////////////////////////////////////////////////////////
  101. class MMCameraWalkClass : public MouseModeClass
  102. {
  103. public:
  104. ///////////////////////////////////////////////////
  105. // Public constructors/destructors
  106. ///////////////////////////////////////////////////
  107. MMCameraWalkClass (void)
  108. {
  109. m_LButtonMode = CameraMgr::MODE_WALK_THROUGH;
  110. m_RButtonMode = CameraMgr::MODE_WALK_THROUGH;
  111. m_BothButtonMode = CameraMgr::MODE_WALK_THROUGH;
  112. }
  113. virtual ~MMCameraWalkClass (void) { }
  114. ///////////////////////////////////////////////////
  115. // Public methods
  116. ///////////////////////////////////////////////////
  117. virtual void On_Mode_Set (void) { } //::Get_Camera_Mgr ()->Set_Camera_Mode (CameraMgr::MODE_WALK_THROUGH); }
  118. };
  119. ///////////////////////////////////////////////////////////////
  120. //
  121. // MMCameraFlyClass
  122. //
  123. //
  124. class MMCameraFlyClass : public MouseModeClass
  125. {
  126. public:
  127. ///////////////////////////////////////////////////
  128. // Public constructors/destructors
  129. ///////////////////////////////////////////////////
  130. MMCameraFlyClass (void)
  131. {
  132. m_LButtonMode = CameraMgr::MODE_FLY_THROUGH;
  133. m_RButtonMode = CameraMgr::MODE_FLY_THROUGH;
  134. m_BothButtonMode = CameraMgr::MODE_FLY_THROUGH;
  135. }
  136. virtual ~MMCameraFlyClass (void) {}
  137. };
  138. ///////////////////////////////////////////////////////////////
  139. //
  140. // MMCameraOrbitClass
  141. //
  142. ///////////////////////////////////////////////////////////////
  143. class MMCameraOrbitClass : public MouseModeClass
  144. {
  145. public:
  146. ///////////////////////////////////////////////////
  147. // Public constructors/destructors
  148. ///////////////////////////////////////////////////
  149. MMCameraOrbitClass (void)
  150. {
  151. m_LButtonMode = CameraMgr::MODE_ORBIT;
  152. m_RButtonMode = CameraMgr::MODE_ORBIT;
  153. m_BothButtonMode = CameraMgr::MODE_ORBIT;
  154. }
  155. virtual ~MMCameraOrbitClass (void) {}
  156. };
  157. ///////////////////////////////////////////////////////////////
  158. //
  159. // MMHeightfieldEditClass
  160. //
  161. ///////////////////////////////////////////////////////////////
  162. class MMHeightfieldEditClass : public MouseModeClass
  163. {
  164. public:
  165. ///////////////////////////////////////////////////
  166. // Public constructors/destructors
  167. ///////////////////////////////////////////////////
  168. MMHeightfieldEditClass (void)
  169. {
  170. m_LButtonMode = CameraMgr::MODE_MOVE_PLANE;
  171. m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
  172. m_BothButtonMode = CameraMgr::MODE_MOVE_PLANE;
  173. }
  174. virtual ~MMHeightfieldEditClass (void) {}
  175. ///////////////////////////////////////////////////
  176. // Public methods
  177. ///////////////////////////////////////////////////
  178. //
  179. // Mouse message handlers
  180. //
  181. virtual void Handle_LButton_Down (UINT flags, CPoint point);
  182. virtual void Handle_LButton_Up (UINT flags, CPoint point);
  183. virtual void Handle_RButton_Down (UINT flags, CPoint point);
  184. virtual void Handle_RButton_Up (UINT flags, CPoint point);
  185. virtual void On_Mode_Set (void);
  186. virtual void On_Mode_Exit (void);
  187. };
  188. ///////////////////////////////////////////////////////////////
  189. //
  190. // MMObjectDropClass
  191. //
  192. /////////////////////////////////////////////////////////////////
  193. class MMObjectDropClass : public MouseModeClass
  194. {
  195. public:
  196. ///////////////////////////////////////////////////
  197. // Public constructors/destructors
  198. ///////////////////////////////////////////////////
  199. MMObjectDropClass (void) { }
  200. virtual ~MMObjectDropClass (void) { }
  201. ///////////////////////////////////////////////////
  202. // Public methods
  203. ///////////////////////////////////////////////////
  204. //
  205. // Mouse message handlers
  206. //
  207. virtual void Handle_LButton_Down (UINT flags, CPoint point) { }
  208. virtual void Handle_LButton_Up (UINT flags, CPoint point) { }
  209. virtual void Handle_RButton_Down (UINT flags, CPoint point) { }
  210. virtual void Handle_RButton_Up (UINT flags, CPoint point) { }
  211. };
  212. ///////////////////////////////////////////////////////////////
  213. //
  214. // MMObjectManipulateClass
  215. //
  216. //
  217. ///////////////////////////////////////////////////////////////
  218. class MMObjectManipulateClass : public MouseModeClass
  219. {
  220. public:
  221. ///////////////////////////////////////////////////
  222. // Public constructors/destructors
  223. ///////////////////////////////////////////////////
  224. MMObjectManipulateClass (void)
  225. : m_ObjectMode (MODE_NONE),
  226. m_ForceDropToGround (false),
  227. m_CurrentMovePos (0, 0, 0),
  228. m_IntersectPoint (0, 0, 0)
  229. {
  230. m_LButtonMode = CameraMgr::MODE_MOVE_PLANE;
  231. m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
  232. m_BothButtonMode = CameraMgr::MODE_MOVE_PLANE;
  233. }
  234. virtual ~MMObjectManipulateClass (void) { }
  235. ///////////////////////////////////////////////////
  236. // Public methods
  237. ///////////////////////////////////////////////////
  238. //
  239. // Mouse message handlers
  240. //
  241. virtual void Handle_LButton_Dblclk (UINT flags, CPoint point);
  242. virtual void Handle_LButton_Down (UINT flags, CPoint point);
  243. virtual void Handle_LButton_Up (UINT flags, CPoint point);
  244. virtual void Handle_RButton_Down (UINT flags, CPoint point);
  245. virtual void Handle_RButton_Up (UINT flags, CPoint point);
  246. virtual void Handle_Mouse_Move (UINT flags, CPoint point);
  247. virtual void On_Mode_Set (void);
  248. void Set_Move_Nodes_Mode (void);
  249. protected:
  250. ///////////////////////////////////////////////////
  251. // Public data types
  252. ///////////////////////////////////////////////////
  253. typedef enum
  254. {
  255. MODE_NONE = -1,
  256. MODE_SELECT = 0,
  257. MODE_LINK,
  258. MODE_MOVE,
  259. MODE_ROTATE,
  260. MODE_COUNT
  261. } OBJECT_MODE;
  262. ///////////////////////////////////////////////////
  263. // Protected methods
  264. ///////////////////////////////////////////////////
  265. void Move_Selection (CPoint point);
  266. void Rotate_Selection (CPoint point);
  267. void Link_Item_Hit_Test (CPoint point);
  268. void On_Link_Begin (CPoint point);
  269. void On_Link_End (CPoint point, bool cancelled = false);
  270. void Change_Operation (OBJECT_MODE type);
  271. private:
  272. ///////////////////////////////////////////////////
  273. // Private member data
  274. ///////////////////////////////////////////////////
  275. OBJECT_MODE m_ObjectMode;
  276. Vector3 m_CurrentMovePos;
  277. Vector3 m_IntersectPoint;
  278. bool m_ForceDropToGround;
  279. //class LinkLineClass ** m_pLinkLines;
  280. //int m_iLinkLineCount;
  281. //BOOL m_bValidLink;
  282. };
  283. ///////////////////////////////////////////////////////////////
  284. //
  285. // MMObjectSelectClass
  286. //
  287. ///////////////////////////////////////////////////////////////
  288. class MMObjectSelectClass : public MouseModeClass
  289. {
  290. public:
  291. ///////////////////////////////////////////////////
  292. // Public constructors/destructors
  293. ///////////////////////////////////////////////////
  294. MMObjectSelectClass (void) {}
  295. virtual ~MMObjectSelectClass (void) {}
  296. ///////////////////////////////////////////////////
  297. // Public methods
  298. ///////////////////////////////////////////////////
  299. //
  300. // Mouse message handlers
  301. //
  302. virtual void Handle_LButton_Down (UINT flags, CPoint point) { }
  303. virtual void Handle_LButton_Up (UINT flags, CPoint point) { }
  304. virtual void Handle_RButton_Down (UINT flags, CPoint point) { }
  305. virtual void Handle_RButton_Up (UINT flags, CPoint point) { }
  306. };
  307. ///////////////////////////////////////////////////////////////
  308. //
  309. // MMWaypathEditClass
  310. //
  311. ///////////////////////////////////////////////////////////////
  312. class MMWaypathEditClass : public MouseModeClass
  313. {
  314. public:
  315. ///////////////////////////////////////////////////
  316. // Public constructors/destructors
  317. ///////////////////////////////////////////////////
  318. MMWaypathEditClass (void)
  319. : m_CurrentPoint (-1),
  320. m_Waypath (NULL)
  321. {
  322. m_LButtonMode = CameraMgr::MODE_MOVE_PLANE;
  323. m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
  324. m_BothButtonMode = CameraMgr::MODE_MOVE_PLANE;
  325. }
  326. virtual ~MMWaypathEditClass (void) { }
  327. ///////////////////////////////////////////////////
  328. // Public methods
  329. ///////////////////////////////////////////////////
  330. //
  331. // Mouse message handlers
  332. //
  333. virtual void Handle_LButton_Down (UINT flags, CPoint point);
  334. virtual void Handle_LButton_Up (UINT flags, CPoint point);
  335. virtual void Handle_RButton_Down (UINT flags, CPoint point);
  336. virtual void Handle_RButton_Up (UINT flags, CPoint point);
  337. virtual void Handle_Mouse_Move (UINT flags, CPoint point);
  338. virtual void On_Mode_Set (void);
  339. virtual void On_Mode_Exit (void);
  340. virtual void Set_Waypath (WaypathNodeClass *waypath, int index = 0) { m_Waypath = waypath; m_CurrentPoint = index; }
  341. protected:
  342. ///////////////////////////////////////////////////
  343. // Protected methods
  344. ///////////////////////////////////////////////////
  345. void Exit_Mode (void);
  346. private:
  347. ///////////////////////////////////////////////////
  348. // Private member data
  349. ///////////////////////////////////////////////////
  350. WaypathNodeClass * m_Waypath;
  351. int m_CurrentPoint;
  352. };
  353. ///////////////////////////////////////////////////////////////
  354. //
  355. // MMGrabHandleDragClass
  356. //
  357. ///////////////////////////////////////////////////////////////
  358. class MMGrabHandleDragClass : public MouseModeClass
  359. {
  360. public:
  361. ///////////////////////////////////////////////////
  362. // Public constructors/destructors
  363. ///////////////////////////////////////////////////
  364. MMGrabHandleDragClass (void)
  365. : m_Node (NULL),
  366. m_Vertex (0)
  367. {
  368. m_LButtonMode = CameraMgr::MODE_MOVE_PLANE;
  369. m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
  370. m_BothButtonMode = CameraMgr::MODE_MOVE_PLANE;
  371. }
  372. virtual ~MMGrabHandleDragClass (void) {}
  373. ///////////////////////////////////////////////////
  374. // Public methods
  375. ///////////////////////////////////////////////////
  376. //
  377. // Mouse message handlers
  378. //
  379. virtual void Handle_LButton_Dblclk (UINT flags, CPoint point) {}
  380. virtual void Handle_LButton_Down (UINT flags, CPoint point) {}
  381. virtual void Handle_LButton_Up (UINT flags, CPoint point);
  382. virtual void Handle_RButton_Down (UINT flags, CPoint point) {}
  383. virtual void Handle_RButton_Up (UINT flags, CPoint point) {}
  384. virtual void Handle_Mouse_Move (UINT flags, CPoint point);
  385. virtual void On_Mode_Set (void) { m_Node = NULL; }
  386. //
  387. // Specific methods
  388. //
  389. void Set_Node_Info (NodeClass *node, int vertex_index);
  390. private:
  391. ///////////////////////////////////////////////////
  392. // Private member data
  393. ///////////////////////////////////////////////////
  394. NodeClass * m_Node;
  395. int m_Vertex;
  396. };
  397. ///////////////////////////////////////////////////////////////
  398. //
  399. // MouseMgrClass
  400. //
  401. ///////////////////////////////////////////////////////////////
  402. class MouseMgrClass
  403. {
  404. public:
  405. ///////////////////////////////////////////////////
  406. // Public constructors/destructors
  407. ///////////////////////////////////////////////////
  408. MouseMgrClass (void);
  409. virtual ~MouseMgrClass (void);
  410. ///////////////////////////////////////////////////
  411. // Public data types
  412. ///////////////////////////////////////////////////
  413. typedef enum
  414. {
  415. MODE_CAMERA_DEFAULT = 0,
  416. MODE_CAMERA_WALK,
  417. MODE_CAMERA_FLY,
  418. MODE_CAMERA_ORBIT,
  419. MODE_OBJECT_DROP,
  420. MODE_OBJECT_MANIPULATE,
  421. MODE_OBJECT_SELECT,
  422. MODE_GRABHANDLE_DRAG,
  423. MODE_WAYPATH_EDIT,
  424. MODE_HEIGHTFIELD_EDIT,
  425. MODE_COUNT
  426. } MOUSE_MODE;
  427. ///////////////////////////////////////////////////
  428. // Public methods
  429. ///////////////////////////////////////////////////
  430. MouseMgrClass::MOUSE_MODE Get_Mouse_Mode (void) const { return m_MouseMode; }
  431. void Set_Mouse_Mode (MOUSE_MODE new_mode);
  432. MouseModeClass * Get_Mode_Mgr (void) { return m_pModeObjects[m_MouseMode]; }
  433. //
  434. // Mouse message handlers
  435. //
  436. void Handle_LButton_Dblclk (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_LButton_Dblclk (flags, point); }
  437. void Handle_LButton_Down (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_LButton_Down (flags, point); IsLButtonDown = true; }
  438. void Handle_LButton_Up (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_LButton_Up (flags, point); IsLButtonDown = false; }
  439. void Handle_RButton_Down (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_RButton_Down (flags, point); IsRButtonDown = true; }
  440. void Handle_RButton_Up (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_RButton_Up (flags, point); IsRButtonDown = false; }
  441. void Handle_Mouse_Move (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_Mouse_Move (flags, point); }
  442. //
  443. // Mouse point methods
  444. //
  445. CPoint Get_Mouse_Point (void) const { return m_pModeObjects[m_MouseMode]->m_MousePoint; }
  446. CPoint Get_Last_Mouse_Point (void) const { return m_pModeObjects[m_MouseMode]->m_LastMousePoint; }
  447. //
  448. // Object manipulation methods
  449. //
  450. void Move_Node (NodeClass *node);
  451. //
  452. // Button access
  453. //
  454. bool Is_LButton_Down (void) const { return IsLButtonDown; }
  455. bool Is_RButton_Down (void) const { return IsRButtonDown; }
  456. private:
  457. ///////////////////////////////////////////////////
  458. // Private member data
  459. ///////////////////////////////////////////////////
  460. class MouseModeClass * m_pModeObjects[MOUSE_MODE::MODE_COUNT];
  461. MOUSE_MODE m_MouseMode;
  462. bool IsLButtonDown;
  463. bool IsRButtonDown;
  464. };
  465. #endif //__MOUSEMGR_H