272 lines
8.8 KiB
C
272 lines
8.8 KiB
C
|
/*
|
||
|
** 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 : wwphys *
|
||
|
* *
|
||
|
* $Archive:: /Commando/Code/wwphys/pathsolve.h $*
|
||
|
* *
|
||
|
* Author:: Patrick Smith *
|
||
|
* *
|
||
|
* $Modtime:: 9/20/01 1:22p $*
|
||
|
* *
|
||
|
* $Revision:: 10 $*
|
||
|
* *
|
||
|
*---------------------------------------------------------------------------------------------*
|
||
|
* Functions: *
|
||
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||
|
|
||
|
#if defined(_MSC_VER)
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#ifndef __PATH_SOLVE_H
|
||
|
#define __PATH_SOLVE_H
|
||
|
|
||
|
|
||
|
#include "vector.h"
|
||
|
#include "vector3.h"
|
||
|
#include "hermitespline.h"
|
||
|
#include "PathObject.h"
|
||
|
#include "binheap.h"
|
||
|
#include "refcount.h"
|
||
|
#include "postloadable.h"
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Forward declarations
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
class PathfindPortalClass;
|
||
|
class PathfindSectorClass;
|
||
|
class PathNodeClass;
|
||
|
class AABoxClass;
|
||
|
class WayPathClass;
|
||
|
class ChunkSaveClass;
|
||
|
class ChunkLoadClass;
|
||
|
|
||
|
|
||
|
typedef DynamicVectorClass<AABoxClass *> BOX_LIST;
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// PathSolveClass
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
class PathSolveClass : public RefCountClass, public PostLoadableClass
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Public friends
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
friend class PathMgrClass;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Public data types
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
typedef enum
|
||
|
{
|
||
|
THINKING = 0,
|
||
|
SOLVED_PATH,
|
||
|
ERROR_INVALID_START_POS,
|
||
|
ERROR_INVALID_DEST_POS,
|
||
|
ERROR_NO_PATH,
|
||
|
} STATE_DESC;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Public constructors/destructors
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
PathSolveClass (void);
|
||
|
PathSolveClass (const Vector3 &start, const Vector3 &end);
|
||
|
~PathSolveClass (void);
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Public methods
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
//
|
||
|
// Path evaluation
|
||
|
//
|
||
|
STATE_DESC Timestep (unsigned int milliseconds = 2);
|
||
|
|
||
|
//
|
||
|
// Position methods
|
||
|
//
|
||
|
STATE_DESC Reset (const Vector3 &start, const Vector3 &end, float sector_fudge = 0);
|
||
|
const Vector3 & Get_Start_Pos (void) const;
|
||
|
const Vector3 & Get_Dest_Pos (void) const;
|
||
|
STATE_DESC Get_State (void) const;
|
||
|
|
||
|
//
|
||
|
// Traversing object
|
||
|
//
|
||
|
void Set_Path_Object (PathObjectClass &path_object);
|
||
|
void Get_Path_Object (PathObjectClass &path_object) const;
|
||
|
|
||
|
//
|
||
|
// Priority access
|
||
|
//
|
||
|
void Set_Priority (float priority) { m_Priority = priority; }
|
||
|
float Get_Priority (void) const { return m_Priority; }
|
||
|
|
||
|
//
|
||
|
// Birth-time access
|
||
|
//
|
||
|
uint32 Get_Birth_Time (void) const { return m_BirthTime; }
|
||
|
|
||
|
//
|
||
|
// Volume access
|
||
|
//
|
||
|
void Get_Volumes (BOX_LIST §or_list, BOX_LIST &portal_list);
|
||
|
|
||
|
//
|
||
|
// Save/load stuff
|
||
|
//
|
||
|
void Save (ChunkSaveClass &csave);
|
||
|
void Load (ChunkLoadClass &cload);
|
||
|
void On_Post_Load (void);
|
||
|
|
||
|
//
|
||
|
// Distributed (multi-frame solve) methods
|
||
|
//
|
||
|
void Process_Initial_Sector (void);
|
||
|
void Unlink_Pathfind_Hooks (void);
|
||
|
|
||
|
|
||
|
protected:
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Public data types
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
typedef struct PathDataStruct
|
||
|
{
|
||
|
PathDataStruct (void)
|
||
|
: m_Portal (NULL), m_Point (0, 0, 0) { }
|
||
|
|
||
|
PathDataStruct (PathfindPortalClass *portal, const Vector3 &point)
|
||
|
: m_Portal (portal), m_Point (point) { }
|
||
|
|
||
|
bool operator== (const PathDataStruct &src) { return false; }
|
||
|
bool operator!= (const PathDataStruct &src) { return true; }
|
||
|
|
||
|
PathfindPortalClass * m_Portal;
|
||
|
Vector3 m_Point;
|
||
|
Vector3 m_SectorCenter;
|
||
|
Vector3 m_SectorExtent;
|
||
|
};
|
||
|
|
||
|
typedef DynamicVectorClass<PathNodeClass *> PATHNODE_LIST;
|
||
|
typedef DynamicVectorClass<PathDataStruct> PATHPOINT_LIST;
|
||
|
|
||
|
//
|
||
|
// Raw path access
|
||
|
//
|
||
|
PATHPOINT_LIST & Get_Raw_Path (void) { return m_Path; }
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Protected methods
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
void Initialize (float sector_fudge = 0);
|
||
|
|
||
|
void Resolve_Path (unsigned int milliseconds);
|
||
|
void Process_Portals (PathNodeClass *node);
|
||
|
void Submit_Node (float traversal_cost, PathNodeClass *current_node, PathfindPortalClass *portal, PathfindSectorClass *dest_sector, const Matrix3D ¤t_tm, const Matrix3D &ending_tm);
|
||
|
|
||
|
void Reset_Lists (void);
|
||
|
|
||
|
//
|
||
|
// Post process methods
|
||
|
//
|
||
|
void Post_Process_Path (void);
|
||
|
bool Does_Line_Go_Through_Portal (const Vector3 &start, const Vector3 &end, const AABoxClass &box);
|
||
|
Vector3 Relax_Line (const Vector3 &start, const Vector3 &end, const AABoxClass &box);
|
||
|
void Keep_Unit_Inside_Sectors (void);
|
||
|
|
||
|
//
|
||
|
// Portal access
|
||
|
//
|
||
|
bool Does_Object_Have_Access_To_Portal (PathfindPortalClass *portal);
|
||
|
bool Can_Object_Go_Through_Portal (const Matrix3D ¤t_tm, PathfindSectorClass *sector, PathfindPortalClass *portal, Matrix3D *ending_tm);
|
||
|
|
||
|
//
|
||
|
// Distributed (multi-frame solve) methods
|
||
|
//
|
||
|
//void Begin_Distributed_Solve (void);
|
||
|
//void End_Distributed_Solve (void);
|
||
|
|
||
|
//
|
||
|
// Save/load methods
|
||
|
//
|
||
|
void Load_Variables (ChunkLoadClass &cload);
|
||
|
|
||
|
private:
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Static members
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
static __int64 _TicksPerMilliSec;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Private member data
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
Vector3 m_StartPos;
|
||
|
Vector3 m_DestPos;
|
||
|
STATE_DESC m_State;
|
||
|
float m_Priority;
|
||
|
uint32 m_BirthTime;
|
||
|
|
||
|
PathfindSectorClass * m_StartSector;
|
||
|
PathfindSectorClass * m_DestSector;
|
||
|
|
||
|
DynamicVectorClass<PathNodeClass *> m_NodeList;
|
||
|
BinaryHeapClass<float> m_BinaryHeap;
|
||
|
|
||
|
PathNodeClass * m_CompletedNode;
|
||
|
PATHPOINT_LIST m_Path;
|
||
|
|
||
|
PathObjectClass m_PathObject;
|
||
|
|
||
|
static PATHNODE_LIST temp_node_list;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Friends
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
friend class PathClass;
|
||
|
};
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Inlines
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
inline PathSolveClass::STATE_DESC
|
||
|
PathSolveClass::Get_State (void) const { return m_State; }
|
||
|
|
||
|
inline const Vector3 &
|
||
|
PathSolveClass::Get_Start_Pos (void) const { return m_StartPos; }
|
||
|
|
||
|
inline const Vector3 &
|
||
|
PathSolveClass::Get_Dest_Pos (void) const { return m_DestPos; }
|
||
|
|
||
|
|
||
|
#endif //__PATH_SOLVE_H
|