| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- /*
- ** 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
|