1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef PATHMANAGER_H
#define PATHMANAGER_H
#include <map>
#include <boost/cstdint.hpp> /* Replace with <stdint.h> if appropriate */
#include "Sim/Path/IPathManager.h"
#include "IPath.h"
#include "PathFinderDef.h"
class CSolidObject;
class CPathFinder;
class CPathEstimator;
class PathFlowMap;
class PathHeatMap;
class CPathFinderDef;
struct MoveDef;
class CPathManager: public IPathManager {
public:
CPathManager();
~CPathManager();
unsigned int GetPathFinderType() const { return PFS_TYPE_DEFAULT; }
boost::uint32_t GetPathCheckSum() const;
boost::int64_t Finalize();
void Update();
void UpdatePath(const CSolidObject*, unsigned int);
void DeletePath(unsigned int pathID);
float3 NextWayPoint(
const CSolidObject* owner,
unsigned int pathID,
unsigned int numRetries,
float3 callerPos,
float radius,
bool synced
);
unsigned int RequestPath(
CSolidObject* caller,
const MoveDef* moveDef,
const float3& startPos,
const float3& goalPos,
float goalRadius,
bool synced
);
/**
* Returns waypoints of the max-resolution path segments.
* @param pathID
* The path-id returned by RequestPath.
* @param points
* The list of detail waypoints.
*/
void GetDetailedPath(unsigned pathID, std::vector<float3>& points) const;
/**
* Returns waypoints of the max-resolution path segments as a square list.
*
* @param pathID
* The path-id returned by RequestPath.
* @param points
* The list of detail waypoints.
*/
void GetDetailedPathSquares(unsigned pathID, std::vector<int2>& points) const;
void GetPathWayPoints(unsigned int pathID, std::vector<float3>& points, std::vector<int>& starts) const;
void TerrainChange(unsigned int x1, unsigned int z1, unsigned int x2, unsigned int z2, unsigned int type);
bool SetNodeExtraCost(unsigned int, unsigned int, float, bool);
bool SetNodeExtraCosts(const float*, unsigned int, unsigned int, bool);
float GetNodeExtraCost(unsigned int, unsigned int, bool) const;
const float* GetNodeExtraCosts(bool) const;
int2 GetNumQueuedUpdates() const;
private:
unsigned int RequestPath(
const MoveDef* moveDef,
const float3& startPos,
const float3& goalPos,
CPathFinderDef* peDef,
CSolidObject* caller,
bool synced = true
);
struct MultiPath {
MultiPath(const float3& pos, const CPathFinderDef* def, const MoveDef* moveDef)
: searchResult(IPath::Error)
, start(pos)
, peDef(def)
, moveDef(moveDef)
, finalGoal(ZeroVector)
, caller(NULL)
{}
~MultiPath() { delete peDef; }
// Paths
IPath::Path lowResPath;
IPath::Path medResPath;
IPath::Path maxResPath;
IPath::SearchResult searchResult;
// Request definition
const float3 start;
const CPathFinderDef* peDef;
const MoveDef* moveDef;
// Additional information.
float3 finalGoal;
CSolidObject* caller;
};
inline MultiPath* GetMultiPath(int pathID) const;
unsigned int Store(MultiPath* path);
static void FinalizePath(MultiPath* path, const float3 startPos, const float3 goalPos, const bool cantGetCloser);
void LowRes2MedRes(MultiPath& path, const float3& startPos, const CSolidObject* owner, bool synced) const;
void MedRes2MaxRes(MultiPath& path, const float3& startPos, const CSolidObject* owner, bool synced) const;
bool IsFinalized() const { return (maxResPF != NULL); }
private:
CPathFinder* maxResPF;
CPathEstimator* medResPE;
CPathEstimator* lowResPE;
PathFlowMap* pathFlowMap;
PathHeatMap* pathHeatMap;
std::map<unsigned int, MultiPath*> pathMap;
unsigned int nextPathID;
};
inline CPathManager::MultiPath* CPathManager::GetMultiPath(int pathID) const {
const std::map<unsigned int, MultiPath*>::const_iterator pi = pathMap.find(pathID);
if (pi == pathMap.end())
return NULL;
return pi->second;
}
#endif
|