/
PathFinderDef.h
104 lines (78 loc) · 2.62 KB
/
PathFinderDef.h
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
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef PATHFINDERDEF_HDR
#define PATHFINDERDEF_HDR
#include "Sim/MoveTypes/MoveMath/MoveMath.h"
#include "System/float3.h"
#include "System/type2.h"
#include "System/Rectangle.h"
struct MoveDef;
class CPathFinderDef {
public:
CPathFinderDef(const float3& goalCenter, float goalRadius, float sqGoalDistance);
virtual ~CPathFinderDef() {}
virtual bool WithinConstraints(unsigned int xSquare, unsigned int zSquare) const = 0;
void DisableConstraint(bool b) { constraintDisabled = b; }
void AllowRawPathSearch(bool b) { allowRawPath = b; }
bool IsGoal(unsigned int xSquare, unsigned int zSquare) const;
float Heuristic(unsigned int xSquare, unsigned int zSquare, unsigned int blockSize) const;
bool IsGoalBlocked(const MoveDef& moveDef, const CMoveMath::BlockType& blockMask, const CSolidObject* owner) const;
int2 GoalSquareOffset(unsigned int blockSize) const;
public:
// world-space goal position
float3 goal;
float sqGoalRadius;
float maxRawPathLen;
float minRawSpeedMod;
// if true, do not need to generate any waypoints
bool startInGoalRadius;
bool constraintDisabled;
bool testMobile;
bool needPath;
bool exactPath;
bool allowRawPath;
bool dirIndependent;
bool synced;
unsigned int goalSquareX;
unsigned int goalSquareZ;
};
class CCircularSearchConstraint: public CPathFinderDef {
public:
CCircularSearchConstraint(
const float3& start = ZeroVector,
const float3& goal = ZeroVector,
float goalRadius = 0.0f,
float searchSize = 0.0f,
unsigned int extraSize = 0
);
// tests if a square is inside is the circular constrained area
// defined by the start and goal positions (note that this only
// saves CPU under certain conditions and destroys admissibility)
bool WithinConstraints(unsigned int xSquare, unsigned int zSquare) const {
const int dx = halfWayX - xSquare;
const int dz = halfWayZ - zSquare;
return (constraintDisabled || ((dx * dx + dz * dz) <= searchRadiusSq));
}
private:
unsigned int halfWayX;
unsigned int halfWayZ;
unsigned int searchRadiusSq;
};
class CRectangularSearchConstraint: public CPathFinderDef {
public:
// note: startPos and goalPos are in world-space
CRectangularSearchConstraint(
const float3 startPos,
const float3 goalPos,
float sqRadius,
unsigned int blockSize
);
bool WithinConstraints(unsigned int xSquare, unsigned int zSquare) const {
if (startBlockRect.Inside(int2(xSquare, zSquare))) return true;
if ( goalBlockRect.Inside(int2(xSquare, zSquare))) return true;
return (constraintDisabled);
}
private:
SRectangle startBlockRect;
SRectangle goalBlockRect;
};
#endif