mirror of
https://github.com/electronicarts/CnC_Renegade.git
synced 2025-12-15 23:21:40 -05:00
Initial commit of Command & Conquer Renegade source code.
This commit is contained in:
351
Code/wwphys/Path.h
Normal file
351
Code/wwphys/Path.h
Normal file
@@ -0,0 +1,351 @@
|
||||
/*
|
||||
** 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/Path.h $*
|
||||
* *
|
||||
* Author:: Patrick Smith *
|
||||
* *
|
||||
* $Modtime:: 9/06/01 11:01a $*
|
||||
* *
|
||||
* $Revision:: 27 $*
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#ifndef __COMMANDO_PATH_H
|
||||
#define __COMMANDO_PATH_H
|
||||
|
||||
#include "vector.h"
|
||||
#include "vector3.h"
|
||||
#include "hermitespline.h"
|
||||
#include "PathObject.h"
|
||||
#include "binheap.h"
|
||||
#include "refcount.h"
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Forward declarations
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
class WaypathClass;
|
||||
class WaypointClass;
|
||||
class PathSolveClass;
|
||||
class ChunkSaveClass;
|
||||
class ChunkLoadClass;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PathClass
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
class PathClass : public RefCountClass
|
||||
{
|
||||
public:
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Public data types
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
typedef enum
|
||||
{
|
||||
STATE_TRAVERSING_PATH = 1,
|
||||
STATE_ACTION_REQUIRED,
|
||||
STATE_PATH_COMPLETE,
|
||||
|
||||
FIRST_ERROR = 100,
|
||||
ERROR_DRIFTED_FROM_PATH,
|
||||
ERROR_GENERAL,
|
||||
ERROR_NOT_INITIALIZED,
|
||||
|
||||
} STATE_DESC;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
LINEAR = 0,
|
||||
SPLINE
|
||||
} TRAVERSAL_TYPE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MOVE_X = 1,
|
||||
MOVE_Y = 2,
|
||||
MOVE_Z = 4,
|
||||
} MOVEMENT_DIRECTIONS;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ACTION_NONE = 0,
|
||||
ACTION_JUMP,
|
||||
ACTION_LEAP,
|
||||
ACTION_LADDER,
|
||||
ACTION_MECHANISM
|
||||
|
||||
} ACTION_ID;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Public constructors/destructors
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
PathClass (void);
|
||||
~PathClass (void);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Public methods
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
// Path evaluation
|
||||
//
|
||||
bool Evaluate_Next_Point (const Vector3 &curr_pos, Vector3 &new_pos);
|
||||
|
||||
const Vector3 & Get_Start_Pos (void) const { return m_StartPos; }
|
||||
const Vector3 & Get_Dest_Pos (void) const { return m_DestPos; }
|
||||
const Vector3 & Get_Next_Pos (void) const { return m_ExpectedPos; }
|
||||
|
||||
void Set_Movement_Radius (float radius) { m_MovementRadius = radius; }
|
||||
float Get_Movement_Radius (void) const { return m_MovementRadius; }
|
||||
|
||||
float Get_Curve_Sharpness (Vector3 *position) const;
|
||||
float Get_Last_Eval_Time (void) const;
|
||||
|
||||
float Get_Remaining_Path_Length (void);
|
||||
|
||||
ACTION_ID Get_Action_Type (void);
|
||||
void Get_Action_Destination (Vector3 &dest);
|
||||
void Get_Action_Entrance (Vector3 &position);
|
||||
uint32 Get_Action_Mechanism (void);
|
||||
|
||||
//
|
||||
// Velocity methods
|
||||
//
|
||||
float Get_Velocity (void) const { return m_Velocity; }
|
||||
void Set_Velocity (float velocity) { m_Velocity = velocity; }
|
||||
|
||||
|
||||
//
|
||||
// Traversal type methods
|
||||
//
|
||||
TRAVERSAL_TYPE Get_Traversal_Type (void) const;
|
||||
void Set_Traversal_Type (TRAVERSAL_TYPE type);
|
||||
|
||||
//
|
||||
// Movement direction control
|
||||
//
|
||||
void Set_Movement_Directions (int directions) { m_MovementDirections = directions; }
|
||||
int Get_Movement_Directions (void) const { return m_MovementDirections; }
|
||||
|
||||
//
|
||||
// Initialization methods
|
||||
//
|
||||
void Initialize (WaypathClass *waypath, int start_pt_id, int end_pt_id);
|
||||
void Initialize (PathSolveClass &path_solve);
|
||||
void Initialize (const Vector3 &start, const Vector3 &end);
|
||||
|
||||
//
|
||||
// Initialization methods
|
||||
//
|
||||
STATE_DESC Get_State (void) const { return m_State; }
|
||||
|
||||
//
|
||||
// Traversing object
|
||||
//
|
||||
void Set_Path_Object (PathObjectClass &path_object);
|
||||
void Get_Path_Object (PathObjectClass &path_object) const;
|
||||
|
||||
//
|
||||
// Debug methods
|
||||
//
|
||||
void Display_Path (bool onoff = true);
|
||||
|
||||
//
|
||||
// Save/load stuff
|
||||
//
|
||||
void Save (ChunkSaveClass &csave);
|
||||
void Load (ChunkLoadClass &cload);
|
||||
|
||||
//
|
||||
// Debug support
|
||||
//
|
||||
static bool Are_Move_Vectors_Displayed (void) { return m_DisplayMoveVectors; }
|
||||
static void Display_Move_Vectors (bool onoff) { m_DisplayMoveVectors = onoff; }
|
||||
|
||||
#ifdef WWDEBUG
|
||||
int Get_Path_Vector_Length(void) {return(m_PathActions.Length());};
|
||||
int Get_Path_Vector_Count(void) {return(m_PathActions.Count());};
|
||||
#endif //WWDEBUG
|
||||
|
||||
protected:
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Protected data types
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
typedef struct _PATH_NODE
|
||||
{
|
||||
float time;
|
||||
float next_time;
|
||||
bool tighten_spline;
|
||||
ACTION_ID action_id;
|
||||
uint32 mechanism_id;
|
||||
Vector3 dest_pos;
|
||||
Vector3 pos;
|
||||
|
||||
_PATH_NODE (void) :
|
||||
time (0),
|
||||
next_time (0),
|
||||
tighten_spline (false),
|
||||
action_id (ACTION_NONE),
|
||||
mechanism_id (0),
|
||||
dest_pos (0, 0, 0),
|
||||
pos (0, 0, 0) {}
|
||||
|
||||
bool operator== (const _PATH_NODE &src) { return true; }
|
||||
bool operator!= (const _PATH_NODE &src) { return false; }
|
||||
|
||||
} PATH_NODE;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Protected methods
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
void Initialize_Spline (DynamicVectorClass<PATH_NODE> &node_list);
|
||||
void Initialize_Vehicle_Spline (DynamicVectorClass<PATH_NODE> &node_list);
|
||||
void Initialize_Human_Spline (DynamicVectorClass<PATH_NODE> &node_list);
|
||||
void Clip_Spline_To_Pathfind_Data (DynamicVectorClass<PATH_NODE> &node_list, PathSolveClass &path_solve);
|
||||
|
||||
void Add_Waypath_Data (DynamicVectorClass<PATH_NODE> &node_list, WaypathClass *waypath, int start_index, int end_index);
|
||||
void Add_Waypoint_Info_To_Node_List (DynamicVectorClass<PATH_NODE> &node_list, WaypointClass *waypoint, WaypointClass *next_point);
|
||||
|
||||
|
||||
typedef DynamicVectorClass<AABoxClass *> BOX_LIST;
|
||||
bool Is_Point_In_Boxes (const Vector3 &point, BOX_LIST &box_list);
|
||||
|
||||
void Clip_Control_Point (const Vector3 &start_point, Vector3 *point, BOX_LIST §or_list, BOX_LIST &portal_list);
|
||||
|
||||
//
|
||||
// Save/load methods
|
||||
//
|
||||
void Load_Variables (ChunkLoadClass &cload);
|
||||
|
||||
private:
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Private member data
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
STATE_DESC m_State;
|
||||
TRAVERSAL_TYPE m_TraversalType;
|
||||
|
||||
Vector3 m_StartPos;
|
||||
Vector3 m_DestPos;
|
||||
Vector3 m_ExpectedPos;
|
||||
float m_LookAheadDist;
|
||||
float m_LookAheadTime;
|
||||
float m_MovementRadius;
|
||||
float m_SplineTime;
|
||||
float m_Velocity;
|
||||
float m_TotalDist;
|
||||
|
||||
DynamicVectorClass<PATH_NODE> m_PathActions;
|
||||
int m_CurrentAction;
|
||||
int m_MovementDirections;
|
||||
|
||||
Curve3DClass * m_Spline;
|
||||
|
||||
PathObjectClass m_PathObject;
|
||||
|
||||
float m_StartTime;
|
||||
float m_EndTime;
|
||||
bool m_IsLooping;
|
||||
|
||||
static bool m_DisplayMoveVectors;
|
||||
};
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Inlines
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Get_Action_Type
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
inline PathClass::ACTION_ID
|
||||
PathClass::Get_Action_Type (void)
|
||||
{
|
||||
ACTION_ID retval = ACTION_NONE;
|
||||
if (m_CurrentAction >= 0 && m_CurrentAction < m_PathActions.Count ()) {
|
||||
retval = m_PathActions[m_CurrentAction].action_id;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Get_Action_Destination
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
inline void
|
||||
PathClass::Get_Action_Destination (Vector3 &dest)
|
||||
{
|
||||
if (m_CurrentAction >= 0 && m_CurrentAction < m_PathActions.Count ()) {
|
||||
dest = m_PathActions[m_CurrentAction].dest_pos;
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Get_Action_Entrance
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
inline void
|
||||
PathClass::Get_Action_Entrance (Vector3 &position)
|
||||
{
|
||||
if (m_CurrentAction >= 0 && m_CurrentAction < m_PathActions.Count ()) {
|
||||
position = m_PathActions[m_CurrentAction].pos;
|
||||
}
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// Get_Action_Mechanism
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
inline uint32
|
||||
PathClass::Get_Action_Mechanism (void)
|
||||
{
|
||||
uint32 mechanism_id = 0;
|
||||
|
||||
if (m_CurrentAction >= 0 && m_CurrentAction < m_PathActions.Count ()) {
|
||||
mechanism_id = m_PathActions[m_CurrentAction].mechanism_id;
|
||||
}
|
||||
|
||||
return mechanism_id;
|
||||
}
|
||||
|
||||
|
||||
#endif //__COMMANDO_PATH_H
|
||||
Reference in New Issue
Block a user