9 #ifndef Navigation_AStarQueryContext_H
10 #define Navigation_AStarQueryContext_H
20 class AstarBinHeapIndexTracker
23 AstarBinHeapIndexTracker() : m_astarNodes(
KY_NULL) {}
24 void SetAstarNodeArray(WorkingMemArray<AStarNode>& astarNodeArray);
26 void OnAdd(AStarNodeIndex& aStarNodeIndex,
KyUInt32 indexInBinaryHeap);
27 void OnRemove(AStarNodeIndex& aStarNodeIndex);
28 void OnSwap(AStarNodeIndex& lhs, AStarNodeIndex& rhs);
30 WorkingMemArray<AStarNode>* m_astarNodes;
33 class AStarNodeComparator
36 AStarNodeComparator() : m_astarNodes(
KY_NULL) {}
37 void SetAstarNodeArray(WorkingMemArray<AStarNode>& astarNodeArray);
39 bool operator () (
const AStarNodeIndex lhsIdx,
const AStarNodeIndex rhsIdx)
const;
41 WorkingMemArray<AStarNode>* m_astarNodes;
45 typedef WorkingMemBinaryHeap<AStarNodeIndex, AStarNodeComparator, AstarBinHeapIndexTracker> AstarTraversalBinHeap;
48 class AStarTraversalContext
52 AStarTraversalContext() {}
54 KyResult Init(QueryUtils& queryUtils,
const AStarContextConfig& astarContextconfig);
55 void ReleaseWorkingMemory();
57 KyResult CheckTraversalBinaryHeapMemory();
58 KyResult CheckAstarNodeArrayMemory();
59 KyResult CheckNavHalfEdgeRawPtrArrayMemory();
60 KyResult CheckNavGraphVertexRawPtrArrayMemory();
61 KyResult CheckAbstractGraphNodeRawPtrArrayMemory();
63 KyResult InsertOrUpdateInBinHeapTraversal(AStarNode& neighborNode, AStarNodeIndex neighborNodeIndex);
65 AstarNodeIndexInGrid m_edgeIndexGrid;
66 AstarTraversalBinHeap m_traversalBinHeap;
67 WorkingMemArray<AStarNode> m_aStarNodes;
68 WorkingMemArray<NavHalfEdgeRawPtr> m_edgeRawPtrNodes;
69 WorkingMemArray<NavGraphVertexRawPtr> m_vertexRawPtrNodes;
70 WorkingMemArray<AbstractGraphNodeRawPtr> m_abstractRawPtrNodes;
71 AStarNodeIndex m_nodeIdx;
76 KY_INLINE
void AstarBinHeapIndexTracker::SetAstarNodeArray(WorkingMemArray<AStarNode>& astarNodeArray) { m_astarNodes = &astarNodeArray; }
77 KY_INLINE
void AstarBinHeapIndexTracker::OnAdd(AStarNodeIndex& aStarNodeIndex,
KyUInt32 indexInBinaryHeap)
79 AStarNode& aStarNode = (*m_astarNodes)[aStarNodeIndex];
80 aStarNode.m_indexInBinaryHeap = (IndexInBinHeap)indexInBinaryHeap;
83 KY_INLINE
void AstarBinHeapIndexTracker::OnRemove(AStarNodeIndex& aStarNodeIndex)
85 AStarNode& aStarNode = (*m_astarNodes)[aStarNodeIndex];
86 aStarNode.m_indexInBinaryHeap = IndexInBinHeap_Removed;
89 KY_INLINE
void AstarBinHeapIndexTracker::OnSwap(AStarNodeIndex& lhs, AStarNodeIndex& rhs)
91 AStarNode& aStarNode1 = (*m_astarNodes)[lhs];
92 AStarNode& aStarNode2 = (*m_astarNodes)[rhs];
93 Alg::Swap(aStarNode1.m_indexInBinaryHeap, aStarNode2.m_indexInBinaryHeap);
96 KY_INLINE
void AStarNodeComparator::SetAstarNodeArray(WorkingMemArray<AStarNode>& astarNodeArray) { m_astarNodes = &astarNodeArray; }
97 KY_INLINE
bool AStarNodeComparator::operator () (
const AStarNodeIndex lhsIdx,
const AStarNodeIndex rhsIdx)
const
99 AStarNode& lhs = (*m_astarNodes)[lhsIdx];
100 AStarNode& rhs = (*m_astarNodes)[rhsIdx];
101 return lhs.m_costFromStart + lhs.m_estimatedCostToDest < rhs.m_costFromStart + rhs.m_estimatedCostToDest;
105 KY_INLINE
KyResult AStarTraversalContext::CheckTraversalBinaryHeapMemory()
107 if (m_traversalBinHeap.IsFull() ==
false)
110 KY_LOG_WARNING( (
"This traversal has reached its maximum working memory size for its BinaryHeap"));
114 KY_INLINE
KyResult AStarTraversalContext::CheckAstarNodeArrayMemory()
116 if (m_aStarNodes.IsFull() ==
false)
119 KY_LOG_WARNING((
"This traversal has reached its maximum working memory size for storing astarNodes"));
123 KY_INLINE
KyResult AStarTraversalContext::CheckNavHalfEdgeRawPtrArrayMemory()
125 if (m_edgeRawPtrNodes.IsFull() ==
false)
128 KY_LOG_WARNING((
"This traversal has reached its maximum working memory size for storing astarNodes and corresponding NavHalfEdgeRawPtr"));
132 KY_INLINE
KyResult AStarTraversalContext::CheckNavGraphVertexRawPtrArrayMemory()
134 if (m_vertexRawPtrNodes.IsFull() ==
false)
137 KY_LOG_WARNING((
"This traversal has reached its maximum working memory size for storing astarNodes and corresponding NavGraphVertexRawPtr"));
141 KY_INLINE
KyResult AStarTraversalContext::CheckAbstractGraphNodeRawPtrArrayMemory()
143 if (m_abstractRawPtrNodes.IsFull() ==
false)
146 KY_LOG_WARNING((
"This traversal has reached its maximum working memory size for storing astarNodes and corresponding AbstractGraphNodeRawPtr"));
151 KY_INLINE
KyResult AStarTraversalContext::InsertOrUpdateInBinHeapTraversal(AStarNode& neighborNode, AStarNodeIndex neighborNodeIndex)
153 if (neighborNode.m_indexInBinaryHeap < IndexInBinHeap_Removed)
156 m_traversalBinHeap.UpdateAt(neighborNode.m_indexInBinaryHeap);
163 KY_FORWARD_ERROR_NO_LOG(CheckTraversalBinaryHeapMemory());
165 m_traversalBinHeap.Insert(neighborNodeIndex);
173 #endif //Navigation_AStarTypes_H
KyInt32 KyResult
Defines a type that can be returned by methods or functions in the Gameware Navigation SDK to indicat...
Definition: types.h:254
#define KY_NULL
Null value.
Definition: types.h:247
Definition: gamekitcrowddispersion.h:20
#define KY_SUCCESS
Shorthand for Kaim::Result::Success.
Definition: types.h:273
#define KY_ERROR
Shorthand for Kaim::Result::Failure.
Definition: types.h:272
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:137
unsigned int KyUInt32
Type used internally to represent an unsigned 32-bit integer.
Definition: types.h:36