/* ** 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 . */ /*********************************************************************************************** *** 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 &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 &list) { list = m_SectorList; } // // Intersection methods // void Find_Portals (const Vector3 &p0, const Vector3 &p1, DynamicVectorClass &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 &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 SectorCullingSystem; typedef DynamicVectorClass SECTOR_LIST; typedef DynamicVectorClass PORTAL_LIST; typedef DynamicVectorClass DISPLAY_LIST; typedef DynamicVectorClass 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