Node.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  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. *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : LevelEdit *
  23. * *
  24. * $Archive:: /Commando/Code/Tools/LevelEdit/Node.h $*
  25. * *
  26. * Author:: Patrick Smith *
  27. * *
  28. * $Modtime:: 4/20/01 10:37a $*
  29. * *
  30. * $Revision:: 25 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #if defined(_MSC_VER)
  36. #pragma once
  37. #endif
  38. #ifndef __NODE_H
  39. #define __NODE_H
  40. #include "refcount.h"
  41. #include "phys.h"
  42. #include "utils.h"
  43. #include "quat.h"
  44. #include "persist.h"
  45. #include "hittestinfo.h"
  46. #include "preset.h"
  47. #include "wwstring.h"
  48. //////////////////////////////////////////////////////////////////
  49. // Forward declarations
  50. //////////////////////////////////////////////////////////////////
  51. class SelectionBoxClass;
  52. class VisPointGeneratorClass;
  53. class ObjectNodeClass;
  54. class TileNodeClass;
  55. class TerrainNodeClass;
  56. class SoundNodeClass;
  57. class LightNodeClass;
  58. class WaypathNodeClass;
  59. class WaypointNodeClass;
  60. //////////////////////////////////////////////////////////////////
  61. //
  62. // NodeClass
  63. //
  64. //////////////////////////////////////////////////////////////////
  65. class NodeClass : public PersistClass, public RefCountClass
  66. {
  67. public:
  68. //////////////////////////////////////////////////////////////
  69. // Public constructors/destructors
  70. //////////////////////////////////////////////////////////////
  71. NodeClass (PresetClass *preset = NULL);
  72. NodeClass (const NodeClass &src);
  73. virtual ~NodeClass (void);
  74. //////////////////////////////////////////////////////////////
  75. // Public operators
  76. //////////////////////////////////////////////////////////////
  77. const NodeClass &operator= (const NodeClass &src);
  78. //////////////////////////////////////////////////////////////
  79. // Public methods
  80. //////////////////////////////////////////////////////////////
  81. //
  82. // Creation methods
  83. //
  84. virtual void Initialize (void) = 0;
  85. virtual NodeClass * Clone (void) = 0;
  86. //
  87. // Identification methods
  88. //
  89. virtual NODE_TYPE Get_Type (void) const = 0;
  90. virtual const char * Get_Name (void) const;
  91. virtual void Set_Name (const char *name);
  92. virtual uint32 Get_ID (void) const;
  93. virtual void Set_ID (uint32 id);
  94. virtual int Get_Icon_Index (void) const = 0;
  95. virtual const char * Get_Comments (void) const;
  96. virtual void Set_Comments (const char *comments);
  97. //
  98. // RTTI
  99. //
  100. virtual ObjectNodeClass * As_ObjectNodeClass (void) { return NULL; }
  101. virtual TileNodeClass * As_TileNodeClass (void) { return NULL; }
  102. virtual TerrainNodeClass * As_TerrainNodeClass (void) { return NULL; }
  103. virtual SoundNodeClass * As_SoundNodeClass (void) { return NULL; }
  104. virtual LightNodeClass * As_LightNodeClass (void) { return NULL; }
  105. virtual WaypathNodeClass * As_WaypathNodeClass (void) { return NULL; }
  106. virtual WaypointNodeClass * As_WaypointNodeClass (void) { return NULL; }
  107. //
  108. // Scene methods
  109. //
  110. virtual void Add_To_Scene (void);
  111. virtual void Remove_From_Scene (void);
  112. virtual bool In_Scene (void) const;
  113. virtual void Reload (void);
  114. virtual uint32 Get_Cull_Link (void) const { return m_CullLink; }
  115. virtual void Set_Cull_Link (uint32 link) { m_CullLink = link; }
  116. virtual void Update_Cached_Cull_Link (void);
  117. //
  118. // Transformation methods
  119. //
  120. virtual void Set_Transform (const Matrix3D &tm);
  121. virtual Matrix3D Get_Transform (void);
  122. virtual void Set_Position (const Vector3 &pos);
  123. virtual Vector3 Get_Position (void) const;
  124. virtual void Set_Orientation (const Quaternion &quat);
  125. virtual const Quaternion & Get_Orientation (void) const;
  126. virtual void Translate (const Vector3 &vector);
  127. virtual void Rotate (const Matrix3D &rotation_matrix, const Matrix3D &coord_system);
  128. //
  129. // Movement restriction methods
  130. //
  131. virtual bool Can_Be_Rotated_Freely (void) const;
  132. virtual bool Is_Rotation_Restricted (void) const;
  133. virtual void Restrict_Rotation (bool restrict);
  134. virtual bool Is_Locked (void) const;
  135. virtual void Lock (bool lock);
  136. //
  137. // Intrinsic behavior methods
  138. //
  139. virtual bool Is_Static (void) const = 0;
  140. //
  141. // Notifications
  142. //
  143. virtual void On_Rotate (void);
  144. virtual void On_Translate (void);
  145. virtual void On_Transform (void);
  146. virtual void On_Delete (void) { }
  147. virtual void On_Restore (void) { }
  148. //
  149. // Accessors
  150. //
  151. virtual PhysClass * Peek_Physics_Obj (void) const = 0;
  152. virtual RenderObjClass * Peek_Render_Obj (void) const;
  153. virtual PhysClass * Peek_Collision_Obj (void) const;
  154. virtual LPCTSTR Get_Model_Name (void) const;
  155. void Set_Preset (PresetClass *preset);
  156. PresetClass * Get_Preset (void) const;
  157. uint32 Get_Preset_ID (void) const;
  158. //
  159. // Visibility methods
  160. //
  161. virtual void Show_Selection_Box (bool onoff);
  162. virtual void Hide (bool hide);
  163. virtual bool Is_Hidden (void) const;
  164. //
  165. // Attenuation methods
  166. //
  167. virtual bool Is_Attenuation_Sphere_Shown (void) { return false; }
  168. virtual void Show_Attenuation_Spheres (bool onoff) { }
  169. virtual float Get_Attenuation_Radius (void) { return 0.0F; }
  170. virtual void Set_Attenuation_Radius (float radius) { }
  171. //
  172. // Editing methods
  173. //
  174. virtual bool Show_Settings_Dialog (void);
  175. virtual NodeClass * Add_Child_Node (const Matrix3D &tm) { return NULL; }
  176. virtual NodeClass * Get_Parent_Node (void) const { return NULL; }
  177. virtual bool Can_Add_Child_Nodes (void) const { return false; }
  178. virtual bool Is_A_Child_Node (NodeClass *) const { return false; }
  179. virtual bool Is_Proxied (void) const { return m_IsProxied; }
  180. virtual void Set_Is_Proxied (bool onoff) { m_IsProxied = onoff; }
  181. virtual uint32 Get_Container_Preset_ID (void) const { return m_ContainerPresetID; }
  182. virtual void Set_Container_Preset_ID (int id) { m_ContainerPresetID = id; }
  183. //
  184. // Export methods
  185. //
  186. virtual void Pre_Export (void) { }
  187. virtual void Post_Export (void) { }
  188. //
  189. // Vis-related methods
  190. //
  191. virtual void Add_Vis_Points (VisPointGeneratorClass &generator, RenderObjClass *render_obj = NULL);
  192. virtual bool Has_Vis_Sectors (RenderObjClass *render_obj = NULL);
  193. virtual void Update_Cached_Vis_IDs (void) { };
  194. //
  195. // Sub-node Enumeration
  196. //
  197. virtual int Get_Sub_Node_Count (void) const { return 0; }
  198. virtual NodeClass * Get_Sub_Node (int index) { return NULL; }
  199. //
  200. // From PersistClass
  201. //
  202. virtual bool Save (ChunkSaveClass &csave);
  203. virtual bool Load (ChunkLoadClass &cload);
  204. //
  205. // Save filtering
  206. //
  207. virtual bool Needs_Save (void) const { return m_NeedsSave; }
  208. virtual void Set_Needs_Save (bool onoff) { m_NeedsSave = onoff; }
  209. //
  210. // Selection box methods
  211. //
  212. virtual void Update_Selection_Color (void);
  213. virtual void Update_Selection_Box (void);
  214. //
  215. // Zone edit methods
  216. //
  217. virtual void On_Vertex_Drag_Begin (int vertex_index) { }
  218. virtual void On_Vertex_Drag (int vertex_index, POINT point) { }
  219. virtual void On_Vertex_Drag_End (int vertex_index) { }
  220. protected:
  221. //////////////////////////////////////////////////////////////
  222. // Protected methods
  223. //////////////////////////////////////////////////////////////
  224. //
  225. // Save/load methods
  226. //
  227. bool Load_Variables (ChunkLoadClass &cload);
  228. //////////////////////////////////////////////////////////////
  229. // Protected member data
  230. //////////////////////////////////////////////////////////////
  231. StringClass m_Name;
  232. StringClass m_Comments;
  233. uint32 m_ID;
  234. uint32 m_PresetID;
  235. bool m_IsLocked;
  236. bool m_RotationRestricted;
  237. bool m_IsInScene;
  238. bool m_NeedsSave;
  239. bool m_IsProxied;
  240. PresetClass * m_Preset;
  241. uint32 m_ContainerPresetID;
  242. SelectionBoxClass * m_SelectionBox;
  243. Quaternion m_Orientation;
  244. Vector3 m_SelColor;
  245. Matrix3D m_Transform;
  246. uint32 m_CullLink;
  247. // For hit-test feedback
  248. HITTESTINFO m_HitTestInfo;
  249. // For use with NodeMgrClass
  250. NodeClass * m_NextNode;
  251. NodeClass * m_PrevNode;
  252. //////////////////////////////////////////////////////////////
  253. // Friends
  254. //////////////////////////////////////////////////////////////
  255. friend class NodeMgrClass;
  256. };
  257. //////////////////////////////////////////////////////////////////
  258. // Set_Transform
  259. //////////////////////////////////////////////////////////////////
  260. inline void
  261. NodeClass::Set_Transform (const Matrix3D &tm)
  262. {
  263. m_Transform = tm;
  264. PhysClass *phys_obj = Peek_Physics_Obj ();
  265. if (phys_obj != NULL) {
  266. phys_obj->Set_Transform (tm);
  267. On_Transform ();
  268. }
  269. return ;
  270. }
  271. //////////////////////////////////////////////////////////////////
  272. // Get_Transform
  273. //////////////////////////////////////////////////////////////////
  274. inline Matrix3D
  275. NodeClass::Get_Transform (void)
  276. {
  277. Matrix3D tm (1);
  278. PhysClass *phys_obj = Peek_Physics_Obj ();
  279. if (phys_obj != NULL) {
  280. tm = phys_obj->Get_Transform ();
  281. }
  282. return tm;
  283. }
  284. //////////////////////////////////////////////////////////////////
  285. // Set_Position
  286. //////////////////////////////////////////////////////////////////
  287. inline void
  288. NodeClass::Set_Position (const Vector3 &pos)
  289. {
  290. m_Transform.Set_Translation (pos);
  291. PhysClass *phys_obj = Peek_Physics_Obj ();
  292. if (phys_obj != NULL) {
  293. phys_obj->Set_Transform (m_Transform);
  294. On_Translate ();
  295. }
  296. return ;
  297. }
  298. //////////////////////////////////////////////////////////////////
  299. // Get_Position
  300. //////////////////////////////////////////////////////////////////
  301. inline Vector3
  302. NodeClass::Get_Position (void) const
  303. {
  304. return m_Transform.Get_Translation ();
  305. }
  306. //////////////////////////////////////////////////////////////////
  307. // Can_Be_Rotated_Freely
  308. //////////////////////////////////////////////////////////////////
  309. inline bool
  310. NodeClass::Can_Be_Rotated_Freely (void) const
  311. {
  312. return true;
  313. }
  314. //////////////////////////////////////////////////////////////////
  315. // Is_Rotation_Restricted
  316. //////////////////////////////////////////////////////////////////
  317. inline bool
  318. NodeClass::Is_Rotation_Restricted (void) const
  319. {
  320. return m_RotationRestricted;
  321. }
  322. //////////////////////////////////////////////////////////////////
  323. // Restrict_Rotation
  324. //////////////////////////////////////////////////////////////////
  325. inline void
  326. NodeClass::Restrict_Rotation (bool restrict)
  327. {
  328. m_RotationRestricted = restrict;
  329. return ;
  330. }
  331. //////////////////////////////////////////////////////////////////
  332. // Get_Preset_ID
  333. //////////////////////////////////////////////////////////////////
  334. inline uint32
  335. NodeClass::Get_Preset_ID (void) const
  336. {
  337. return m_PresetID;
  338. }
  339. //////////////////////////////////////////////////////////////////
  340. // Get_Preset
  341. //////////////////////////////////////////////////////////////////
  342. inline PresetClass *
  343. NodeClass::Get_Preset (void) const
  344. {
  345. return m_Preset;
  346. }
  347. //////////////////////////////////////////////////////////////////
  348. // Set_Preset
  349. //////////////////////////////////////////////////////////////////
  350. inline void
  351. NodeClass::Set_Preset (PresetClass *preset)
  352. {
  353. m_Preset = preset;
  354. if (m_Preset != NULL) {
  355. m_PresetID = m_Preset->Get_ID ();
  356. }
  357. return ;
  358. }
  359. //////////////////////////////////////////////////////////////////
  360. // In_Scene
  361. //////////////////////////////////////////////////////////////////
  362. inline bool
  363. NodeClass::In_Scene (void) const
  364. {
  365. return m_IsInScene;
  366. }
  367. //////////////////////////////////////////////////////////////////
  368. // Get_ID
  369. //////////////////////////////////////////////////////////////////
  370. inline uint32
  371. NodeClass::Get_ID (void) const
  372. {
  373. return m_ID;
  374. }
  375. //////////////////////////////////////////////////////////////////
  376. // Peek_Collision_Obj
  377. //////////////////////////////////////////////////////////////////
  378. inline PhysClass *
  379. NodeClass::Peek_Collision_Obj (void) const
  380. {
  381. return Peek_Physics_Obj ();
  382. }
  383. INLINE_ACCESSOR_CONST (const Quaternion &, NodeClass, Orientation);
  384. INLINE_ACCESSOR_CONST (const char *, NodeClass, Name);
  385. //INLINE_ACCESSOR_CONST (uint32, NodeClass, ID);
  386. INLINE_ACCESSOR_CONST (const char *, NodeClass, Comments);
  387. #endif //__NODE_H