18 class AstarBinHeapIndexTracker
21 AstarBinHeapIndexTracker() : m_astarNodes(nullptr) {}
22 void SetAstarNodeArray(WorkingMemArray<AStarNode>& astarNodeArray);
24 void OnAdd(AStarNodeIndex& aStarNodeIndex,
KyUInt32 indexInBinaryHeap);
25 void OnRemove(AStarNodeIndex& aStarNodeIndex);
26 void OnSwap(AStarNodeIndex& lhs, AStarNodeIndex& rhs);
28 WorkingMemArray<AStarNode>* m_astarNodes;
31 class AStarNodeComparator
34 AStarNodeComparator() : m_astarNodes(nullptr) {}
35 void SetAstarNodeArray(WorkingMemArray<AStarNode>& astarNodeArray);
37 bool operator () (
const AStarNodeIndex lhsIdx,
const AStarNodeIndex rhsIdx)
const;
39 WorkingMemArray<AStarNode>* m_astarNodes;
43 typedef WorkingMemBinaryHeap<AStarNodeIndex, AStarNodeComparator, AstarBinHeapIndexTracker> AstarTraversalBinHeap;
46 class AStarTraversalContext
50 AStarTraversalContext() {}
52 KyResult Init(QueryUtils& queryUtils,
const AStarContextConfig& astarContextconfig);
53 void ReleaseWorkingMemory();
55 KyResult CheckTraversalBinaryHeapMemory();
56 KyResult CheckAstarNodeArrayMemory();
57 KyResult CheckNavHalfEdgeRawPtrArrayMemory();
58 KyResult CheckNavGraphVertexRawPtrArrayMemory();
59 KyResult CheckAbstractGraphNodeRawPtrArrayMemory();
61 KyResult InsertOrUpdateInBinHeapTraversal(AStarNode& neighborNode, AStarNodeIndex neighborNodeIndex);
63 AstarNodeIndexInGrid m_edgeIndexGrid;
64 AstarTraversalBinHeap m_traversalBinHeap;
65 WorkingMemArray<AStarNode> m_aStarNodes;
66 WorkingMemArray<NavHalfEdgeRawPtr> m_edgeRawPtrNodes;
67 WorkingMemArray<NavGraphVertexRawPtr> m_vertexRawPtrNodes;
68 WorkingMemArray<AbstractGraphNodeRawPtr> m_abstractRawPtrNodes;
69 AStarNodeIndex m_nodeIdx;
74 KY_INLINE
void AstarBinHeapIndexTracker::SetAstarNodeArray(WorkingMemArray<AStarNode>& astarNodeArray) { m_astarNodes = &astarNodeArray; }
75 KY_INLINE
void AstarBinHeapIndexTracker::OnAdd(AStarNodeIndex& aStarNodeIndex,
KyUInt32 indexInBinaryHeap)
77 AStarNode& aStarNode = (*m_astarNodes)[aStarNodeIndex];
78 aStarNode.m_indexInBinaryHeap = (IndexInBinHeap)indexInBinaryHeap;
81 KY_INLINE
void AstarBinHeapIndexTracker::OnRemove(AStarNodeIndex& aStarNodeIndex)
83 AStarNode& aStarNode = (*m_astarNodes)[aStarNodeIndex];
84 aStarNode.m_indexInBinaryHeap = IndexInBinHeap_Removed;
87 KY_INLINE
void AstarBinHeapIndexTracker::OnSwap(AStarNodeIndex& lhs, AStarNodeIndex& rhs)
89 AStarNode& aStarNode1 = (*m_astarNodes)[lhs];
90 AStarNode& aStarNode2 = (*m_astarNodes)[rhs];
91 Alg::Swap(aStarNode1.m_indexInBinaryHeap, aStarNode2.m_indexInBinaryHeap);
94 KY_INLINE
void AStarNodeComparator::SetAstarNodeArray(WorkingMemArray<AStarNode>& astarNodeArray) { m_astarNodes = &astarNodeArray; }
95 KY_INLINE
bool AStarNodeComparator::operator () (
const AStarNodeIndex lhsIdx,
const AStarNodeIndex rhsIdx)
const
97 AStarNode& lhs = (*m_astarNodes)[lhsIdx];
98 AStarNode& rhs = (*m_astarNodes)[rhsIdx];
99 return lhs.m_costFromStart + lhs.m_estimatedCostToDest < rhs.m_costFromStart + rhs.m_estimatedCostToDest;
103 KY_INLINE
KyResult AStarTraversalContext::CheckTraversalBinaryHeapMemory()
105 if (m_traversalBinHeap.IsFull() ==
false)
108 KY_LOG_WARNING( (
"This traversal has reached its maximum working memory size for its BinaryHeap"));
112 KY_INLINE
KyResult AStarTraversalContext::CheckAstarNodeArrayMemory()
114 if (m_aStarNodes.GrowIfNeeded())
117 KY_LOG_WARNING((
"This traversal has reached its maximum working memory size for storing astarNodes"));
121 KY_INLINE
KyResult AStarTraversalContext::CheckNavHalfEdgeRawPtrArrayMemory()
123 if (m_edgeRawPtrNodes.GrowIfNeeded())
126 KY_LOG_WARNING((
"This traversal has reached its maximum working memory size for storing astarNodes and corresponding NavHalfEdgeRawPtr"));
130 KY_INLINE
KyResult AStarTraversalContext::CheckNavGraphVertexRawPtrArrayMemory()
132 if (m_vertexRawPtrNodes.GrowIfNeeded())
135 KY_LOG_WARNING((
"This traversal has reached its maximum working memory size for storing astarNodes and corresponding NavGraphVertexRawPtr"));
139 KY_INLINE
KyResult AStarTraversalContext::CheckAbstractGraphNodeRawPtrArrayMemory()
141 if (m_abstractRawPtrNodes.GrowIfNeeded())
144 KY_LOG_WARNING((
"This traversal has reached its maximum working memory size for storing astarNodes and corresponding AbstractGraphNodeRawPtr"));
149 KY_INLINE
KyResult AStarTraversalContext::InsertOrUpdateInBinHeapTraversal(AStarNode& neighborNode, AStarNodeIndex neighborNodeIndex)
151 if (neighborNode.m_indexInBinaryHeap < IndexInBinHeap_Removed)
154 m_traversalBinHeap.UpdateAt(neighborNode.m_indexInBinaryHeap);
161 KY_TRY(CheckTraversalBinaryHeapMemory());
163 m_traversalBinHeap.Insert(neighborNodeIndex);
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_TRY(expr)
Returns KY_ERROR if expression == KY_ERROR.
Definition: types.h:144
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
#define KY_ERROR
use result == KY_ERROR to test for error
Definition: types.h:132