| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** 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 ***
- ***********************************************************************************************
- * *
- * Project Name : LevelEdit *
- * *
- * $Archive:: /Commando/Code/wwphys/Pathfind.h $*
- * *
- * Author:: Patrick Smith *
- * *
- * $Modtime:: 10/15/01 5:19p $*
- * *
- * $Revision:: 20 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #ifndef __PATHFIND_H
- #define __PATHFIND_H
- #include "aabtreecull.h"
- #include "pathfindsector.h"
- #include "widgetuser.h"
- /////////////////////////////////////////////////////////////////////////
- // Forward declarations
- /////////////////////////////////////////////////////////////////////////
- class Vector3;
- class ChunkSaveClass;
- class ChunkLoadClass;
- class PhysClass;
- class PathDebugPlotterClass;
- class PathfindPortalClass;
- class WaypathClass;
- class PathfindWaypathSectorClass;
- class PathfindWaypathPortalClass;
- /////////////////////////////////////////////////////////////////////////
- //
- // PathfindClass
- //
- /////////////////////////////////////////////////////////////////////////
- class PathfindClass
- {
- public:
- typedef enum
- {
- WAYPATH_PORTAL_ID_START = 64000,
- TEMP_PORTAL_ID_START = 128000
- } PORTAL_ID_RANGES;
- /////////////////////////////////////////////////////////////////////////
- // Public constructors/destructors
- /////////////////////////////////////////////////////////////////////////
- PathfindClass (void);
- ~PathfindClass (void);
- /////////////////////////////////////////////////////////////////////////
- // Public methods
- /////////////////////////////////////////////////////////////////////////
-
- //
- // Database methods
- //
- void Add_Sector (PathfindSectorClass *sector, bool add_to_tree = true);
- int Add_Portal (PathfindPortalClass *portal);
- PathfindPortalClass * Peek_Portal (int portal_index);
- PathfindSectorClass * Peek_Sector (int sector_index);
- int Get_Sector_Index (PathfindSectorClass *sector);
- void Re_Partition_Sector_Tree (void);
- PathfindSectorClass * Find_Sector (const Vector3 &position, float sector_fudge = 0, PathfindSectorClass *exclude_sector = NULL);
- void Collect_Sectors (DynamicVectorClass<PathfindSectorClass *> &list, const AABoxClass &box, PathfindSectorClass *exclude_sector = NULL);
- bool Find_Random_Spot (const Vector3 ¢er, float max_dist, Vector3 *dest);
- bool Save (ChunkSaveClass &csave);
- bool Load (ChunkLoadClass &cload);
- int Add_Temporary_Portal (PathfindSectorClass *sector_from, PathfindSectorClass *sector_to, const Vector3 &start_pos, const Vector3 &dest_pos);
- //
- // Statistics
- //
- const AABoxClass & Get_Bounding_Box (void) { return m_SectorTree.Get_Bounding_Box (); }
- bool Does_Pathfind_Data_Exist (void) { return bool(m_SectorList.Count () > 0); }
- //
- // Waypath methods
- //
- void Add_Waypath (WaypathClass *waypath);
- bool Remove_Waypath (WaypathClass *waypath);
- WaypathClass * Find_Waypath (int id) const;
- int Count_Waypaths_Starting_In_Box (const AABoxClass & box);
- WaypathClass * Get_Waypath_Starting_In_Box (const AABoxClass & box,int i);
- //
- // Waypath integration
- //
- void Generate_Waypath_Sectors_And_Portals (void);
- void Free_Waypath_Sectors_And_Portals (void);
- //
- // Height database lookup
- //
- float Get_Height_Value (const Vector3 &pos);
- //
- // Debug methods
- //
- bool Are_Sectors_Displayed (void) const { return m_SectorsDisplayed; }
- bool Are_Portals_Displayed (void) const { return m_PortalsDisplayed; }
- void Display_Sectors (bool onoff);
- void Display_Portals (bool onoff);
- void Render_Debug_Widgets (RenderInfoClass &rinfo);
- //
- // Cleanup methods
- //
- void Reset_Sectors (void);
- void Reset_Portals (void);
- void Reset_Waypaths (void);
- //
- // Sector list access
- //
- void Get_Sector_List (DynamicVectorClass<PathfindSectorClass *> &list) { list = m_SectorList; }
- //
- // Intersection methods
- //
- void Find_Portals (const Vector3 &p0, const Vector3 &p1, DynamicVectorClass<PathfindPortalClass *> &list, bool action_portals_only = false);
- /////////////////////////////////////////////////////////////////////////
- // Static methods
- /////////////////////////////////////////////////////////////////////////
- static PathfindClass * Get_Instance (void) { return _Pathfinder; }
- static int _MemoryFootprint;
- protected:
- /////////////////////////////////////////////////////////////////////////
- // Protected methods
- /////////////////////////////////////////////////////////////////////////
- bool Save_Portals (ChunkSaveClass &csave);
- bool Save_Waypaths (ChunkSaveClass &csave);
- bool Save_Sector (ChunkSaveClass &csave, PathfindSectorClass *sector);
- bool Load_Sector (ChunkLoadClass &cload);
- bool Load_Portal (ChunkLoadClass &cload, PathfindPortalClass *portal);
- bool Save_Culling_System (ChunkSaveClass &csave);
- bool Load_Culling_System (ChunkLoadClass &cload);
-
- void Generate_Waypath_Sector_And_Portals (WaypathClass *waypath);
- void Add_Intersection_Portals_To_List (DynamicVectorClass<PathfindWaypathPortalClass *> &portal_list, WaypathClass *waypath, PathfindWaypathSectorClass *dest_sector);
- int Add_Waypath_Portal (PathfindWaypathPortalClass *portal);
- private:
- /////////////////////////////////////////////////////////////////////////
- // Static member data
- /////////////////////////////////////////////////////////////////////////
- static PathfindClass * _Pathfinder;
- /////////////////////////////////////////////////////////////////////////
- // Private data types
- /////////////////////////////////////////////////////////////////////////
- typedef TypedAABTreeCullSystemClass<PathfindSectorClass> SectorCullingSystem;
- typedef DynamicVectorClass<PathfindSectorClass *> SECTOR_LIST;
- typedef DynamicVectorClass<PathfindPortalClass *> PORTAL_LIST;
- typedef DynamicVectorClass<PhysClass *> DISPLAY_LIST;
- typedef DynamicVectorClass<WaypathClass *> WAYPATH_LIST;
- /////////////////////////////////////////////////////////////////////////
- // Private member data
- /////////////////////////////////////////////////////////////////////////
- SectorCullingSystem m_SectorTree;
- SECTOR_LIST m_SectorList;
- PORTAL_LIST m_PortalList;
- DISPLAY_LIST m_SectorDisplayList;
- WAYPATH_LIST m_WaypathList;
- bool m_SectorsDisplayed;
- bool m_PortalsDisplayed;
- PathDebugPlotterClass *m_Plotter;
- PORTAL_LIST m_TemporaryPortalList;
- PORTAL_LIST m_WaypathPortalList;
- WidgetUserClass m_SectorDisplayWidgets;
- WidgetUserClass m_PortalDisplayWidgets;
- };
- /////////////////////////////////////////////////////////////////////////
- // Peek_Sector
- /////////////////////////////////////////////////////////////////////////
- inline PathfindSectorClass *
- PathfindClass::Peek_Sector (int sector_index)
- {
- if (sector_index >= 0 && sector_index < m_SectorList.Count ()) {
- return m_SectorList[sector_index];
- } else {
- return NULL;
- }
- }
- #endif //__PATHFIND_H
|