This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/LevelEdit/PathfindSectorBuilder.h

285 lines
9.9 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 : LevelEdit *
* *
* $Archive:: /Commando/Code/Tools/LevelEdit/PathfindSectorBuilder.h $Modtime:: 5/27/00 4:10p $*
* *
* $Revision:: 25 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#if defined(_MSC_VER)
#pragma once
#endif
#ifndef _PATHFIND_SECTOR_BUILDER_H
#define _PATHFIND_SECTOR_BUILDER_H
#include "vector3.h"
#include "matrix3d.h"
#include "vector.h"
//#include "physcontrol.h"
#include "pathfindsector.h"
#include "floodfillbox.h"
#include "transition.h"
#include "aabtreecull.h"
#include "floodfillgrid.h"
#include "heightwatcher.h"
#include "levelfeature.h"
//////////////////////////////////////////////////////////////////////////
// Forward declarations
//////////////////////////////////////////////////////////////////////////
class Phys3Class;
class SimDirInfoClass;
class ZoneInstanceClass;
class GeneratingPathfindDialogClass;
class TransitionNodeClass;
//////////////////////////////////////////////////////////////////////////
// BOX_PERIMETER
//////////////////////////////////////////////////////////////////////////
typedef struct _BOX_PERIMETER
{
int count_up;
int count_down;
int count_left;
int count_right;
bool stop_up;
bool stop_down;
bool stop_left;
bool stop_right;
} BOX_PERIMETER;
//////////////////////////////////////////////////////////////////////////
// Typedefs
//////////////////////////////////////////////////////////////////////////
typedef DynamicVectorClass<Vector3> START_POINT_LIST;
typedef DynamicVectorClass<LevelFeatureClass *> LEVEL_FEATURE_LIST;
typedef TypedAABTreeCullSystemClass<LevelFeatureClass> LEVEL_FEATURE_CULLING_SYSTEM;
//////////////////////////////////////////////////////////////////////////
//
// PathfindSectorBuilderClass
//
//////////////////////////////////////////////////////////////////////////
class PathfindSectorBuilderClass
{
public:
////////////////////////////////////////////////////////////////////
// Public constructors/destructors
////////////////////////////////////////////////////////////////////
PathfindSectorBuilderClass (void);
~PathfindSectorBuilderClass (void);
////////////////////////////////////////////////////////////////////
// Public methods
////////////////////////////////////////////////////////////////////
//
// Initialization
//
void Initialize (void);
void Shutdown (void);
//
// Generation management
//
void Add_Start_Point (const Vector3 &start_pos);
void Generate_Sectors (void);
void Compress_Sectors_For_Pathfind (void);
void Compress_Sectors_For_Dyna_Culling (void);
//
// Compression control
//
void Set_Max_Sector_Size (float max_dim);
//
// Flags
//
void Allow_Water_Floodfill (bool onoff);
protected:
////////////////////////////////////////////////////////////////////
// Protected methods
////////////////////////////////////////////////////////////////////
void Do_Physics_Sim (const Vector3 &start_pos, PATHFIND_DIR direction);
void Do_Real_Physics_Sim (const Vector3 &start_pos, PATHFIND_DIR direction);
void Floodfill (const Vector3 &start_pos);
bool Try_Standing_Here (const Vector3 &expected_pos, AABoxClass *real_pos);
bool Try_Moving_Here (const Vector3 &start_pos, const Vector3 &expected_pos, AABoxClass *real_pos);
bool Find_Ground (const Vector3 &pos, float *ground_pos);
bool Find_Ceiling (const Vector3 &pos, float *ceiling_pos);
FloodfillBoxClass * Get_Sector_Occupant (const Vector3 &pos);
FloodfillBoxClass * Mark_Sector (const AABoxClass &bounding_box);
void Mark_Sector (FloodfillBoxClass *body_box);
FloodfillBoxClass * Submit_Box (FloodfillBoxClass *from_obj, const AABoxClass &new_box, PATHFIND_DIR direction);
PathfindSectorClass * Build_Sector (FloodfillBoxClass *upper_left_ptr, int cells_right, int cells_down);
void Generate_Portals (void);
void Free_Floodfill_Boxes (void);
void Determine_Height (FloodfillBoxClass *start_box, float *min_z_pos, float *max_z_pos);
int Build_Height_Values (void);
void Compress_Sectors (DynamicVectorClass<AABoxClass> *box_list = NULL);
FloodfillBoxClass * Find_Perimeter (FloodfillBoxClass *start_box, BOX_PERIMETER *perimeter);
bool Check_Edge (FloodfillBoxClass *start_box, int count_left, int count_right, int count_up, int count_down, PATHFIND_DIR move_dir);
FloodfillBoxClass * Move_Dir (FloodfillBoxClass *start_box, PATHFIND_DIR dir, int dir_mask);
//
// Ladder and other transition handling
//
void Post_Process_Floodfill_For_Level_Features (void);
void Apply_Level_Features (void);
void Build_Sector_For_Level_Feature (LevelFeatureClass *level_feature);
void Check_For_Level_Feature (FloodfillBoxClass *body_box);
void Path_Across_Feature (LevelFeatureClass *level_feature);
void Detect_Level_Features (void);
void Detect_Elevators (void);
void Detect_Doors (void);
void Detect_Level_Transitions (void);
void Cleanup_Level_Features (void);
//
// Environment detection methods
//
TransitionInstanceClass * Find_Transition (TransitionDataClass::StyleType type, const Vector3 &start_pos, float z_delta, TransitionNodeClass **transition_node);
PathfindSectorClass * Find_Sector (const Vector3 &point, const AABoxClass &box);
//
// Prepartion methods
//
void Prepare_Level (void);
void Restore_Level (void);
//
// Floodfill box methods
//
AABoxClass Get_Body_Box_Bounds (FloodfillBoxClass *box);
//
// User interface methods
//
void Show_Dialog (void);
void Close_Dialog (void);
bool Is_Valid_Sector (FloodfillBoxClass **upper_left_ptr, int &cells_right, int &cells_down);
private:
////////////////////////////////////////////////////////////////////
// Private member data
////////////////////////////////////////////////////////////////////
FloodfillBoxClass * m_CurrentSector;
Vector3 m_SimBoundingBox;
Vector3 m_SimBoxExtents;
float m_StepHeight;
bool m_AllowWaterFloodfill;
START_POINT_LIST m_StartPointList;
BODY_BOX_LIST m_FloodFillProcessList;
FloodfillGridClass m_BodyBoxCullingSystem;
LEVEL_FEATURE_LIST m_LevelFeatureList;
LEVEL_FEATURE_CULLING_SYSTEM m_LevelFeatureCullingSystem;
SimDirInfoClass * m_DirInfo;
BODY_BOX_LIST m_PossiblePortalList;
BODY_BOX_LIST m_BodyBoxReleaseList;
//
// Compression
//
HeightWatcherClass m_HeightWatcher;
// Simulation data
Vector3 m_SimMovement;
AABoxClass m_SimSweepBox;
// UI
GeneratingPathfindDialogClass *m_pDialog;
int m_TotalBoxCount;
int m_BeforeUpdateCount;
int m_TotalBoxGuess;
float m_MaxSectorDim;
};
////////////////////////////////////////////////////////////////////
// Get_Body_Box_Bounds
////////////////////////////////////////////////////////////////////
inline AABoxClass
PathfindSectorBuilderClass::Get_Body_Box_Bounds (FloodfillBoxClass *box)
{
return AABoxClass (box->Get_Position (), m_SimBoxExtents);
}
////////////////////////////////////////////////////////////////////
// Allow_Water_Floodfill
////////////////////////////////////////////////////////////////////
inline void
PathfindSectorBuilderClass::Allow_Water_Floodfill (bool onoff)
{
m_AllowWaterFloodfill = onoff;
return ;
}
////////////////////////////////////////////////////////////////////
// Add_Start_Point
////////////////////////////////////////////////////////////////////
inline void
PathfindSectorBuilderClass::Add_Start_Point (const Vector3 &start_pos)
{
m_StartPointList.Add (start_pos);
return ;
}
////////////////////////////////////////////////////////////////////
// Set_Max_Sector_Size
////////////////////////////////////////////////////////////////////
inline void
PathfindSectorBuilderClass::Set_Max_Sector_Size (float max_dim)
{
m_MaxSectorDim = max_dim;
return ;
}
#endif //_PATHFIND_SECTOR_BUILDER_H