16 static const RefinerNodeIndex RefinerNodeIndex_Invalid =
KyUInt16MAXVAL;
22 RefinerNode(
const Vec3f& pos, NodeTypeAndRawPtrDataIdx nodeTypeAndRawPtrDataIdx, RefinerNodeIndex predecessorIdx, RefinerNodeIndex nextNodeIdx);
24 PathNodeType GetNodeType()
const;
27 void SetNodeType(PathNodeType nodeType);
28 void SetIdxOfRawPtrData(
KyUInt32 indexOfRawPtrData);
31 WorldIntegerPos m_nodeIntegerPos;
35 NodeTypeAndRawPtrDataIdx m_nodeTypeAndRawPtrDataIdx;
36 RefinerNodeIndex m_predecessorNodeIdx;
37 RefinerNodeIndex m_nextNodeIdx;
38 IndexInBinHeap m_indexInBinaryHeap;
41 class RefinerBinHeapIndexTracker
44 RefinerBinHeapIndexTracker() : m_refinerNodes(nullptr) {}
46 void SetRefinerNodeArray(WorkingMemArray<RefinerNode>& refinerNodes);
48 void OnAdd(RefinerNodeIndex refinerNodeIndex,
KyUInt32 indexInBinaryHeap);
50 void OnRemove(RefinerNodeIndex refinerNodeIndex);
52 void OnSwap(RefinerNodeIndex lhs, RefinerNodeIndex rhs);
54 WorkingMemArray<RefinerNode>* m_refinerNodes;
57 class RefinerNodeComparator
60 RefinerNodeComparator() : m_refinerNodes(nullptr) {}
61 void SetRefinerNodeArray(WorkingMemArray<RefinerNode>& refinerNodes);
62 bool operator () (
const RefinerNodeIndex lhsIdx,
const RefinerNodeIndex rhsIdx)
const;
64 WorkingMemArray<RefinerNode>* m_refinerNodes;
67 typedef WorkingMemBinaryHeap<RefinerNodeIndex, RefinerNodeComparator, RefinerBinHeapIndexTracker> RefinerBinHeap;
69 class AStarTraversalContext;
70 class PathRefinerContext
74 PathRefinerContext() : m_currentNodeIdx(RefinerNodeIndex_Invalid) {}
75 ~PathRefinerContext() { ReleaseWorkingMemory(); }
77 KyResult InitFromAstarTraversalContext(WorkingMemory* workingMemory, AStarTraversalContext* astarContext,
78 AStarNodeIndex destinationNodeIdx,
bool doClearAStarTraversalContext =
true);
80 void ReleaseWorkingMemory();
83 RefinerBinHeap m_refinerBinHeap;
84 WorkingMemArray<RefinerNode> m_refinerNodes;
85 WorkingMemArray<NavTriangleRawPtr> m_triangleRawPtrNodes;
86 WorkingMemArray<NavGraphVertexRawPtr> m_vertexRawPtrNodes;
88 RefinerNodeIndex m_currentNodeIdx;
92 KY_INLINE RefinerNode::RefinerNode() :
96 m_predecessorNodeIdx(RefinerNodeIndex_Invalid),
97 m_nextNodeIdx(RefinerNodeIndex_Invalid),
98 m_indexInBinaryHeap(IndexInBinHeap_UnSet)
101 KY_INLINE RefinerNode::RefinerNode(
const Vec3f& pos, NodeTypeAndRawPtrDataIdx nodeTypeAndRawPtrDataIdx, RefinerNodeIndex predecessorIdx, RefinerNodeIndex nextNodeIdx) :
106 m_nodeTypeAndRawPtrDataIdx(nodeTypeAndRawPtrDataIdx),
107 m_predecessorNodeIdx(predecessorIdx),
108 m_nextNodeIdx(nextNodeIdx),
109 m_indexInBinaryHeap(IndexInBinHeap_UnSet)
112 KY_INLINE PathNodeType RefinerNode:: GetNodeType()
const {
return m_nodeTypeAndRawPtrDataIdx.GetNodeType(); }
113 KY_INLINE
KyUInt32 RefinerNode::GetIdxOfRawPtrData()
const {
return m_nodeTypeAndRawPtrDataIdx.GetIdxOfRawPtrData(); }
114 KY_INLINE
void RefinerNode::SetNodeType(PathNodeType nodeType) { m_nodeTypeAndRawPtrDataIdx.SetNodeType(nodeType); }
115 KY_INLINE
void RefinerNode::SetIdxOfRawPtrData(
KyUInt32 indexOfRawPtrData) { m_nodeTypeAndRawPtrDataIdx.SetIdxOfRawPtrData(indexOfRawPtrData); }
118 KY_INLINE
void RefinerBinHeapIndexTracker::SetRefinerNodeArray(WorkingMemArray<RefinerNode>& refinerNodes) { m_refinerNodes = &refinerNodes; }
119 KY_INLINE
void RefinerBinHeapIndexTracker::OnAdd(RefinerNodeIndex refinerNodeIndex,
KyUInt32 indexInBinaryHeap)
121 RefinerNode& node = (*m_refinerNodes)[refinerNodeIndex];
122 node.m_indexInBinaryHeap = (IndexInBinHeap)indexInBinaryHeap;
124 KY_INLINE
void RefinerBinHeapIndexTracker::OnRemove(RefinerNodeIndex refinerNodeIndex)
126 RefinerNode& node = (*m_refinerNodes)[refinerNodeIndex];
127 node.m_indexInBinaryHeap = IndexInBinHeap_UnSet;
129 KY_INLINE
void RefinerBinHeapIndexTracker::OnSwap(RefinerNodeIndex lhs, RefinerNodeIndex rhs)
131 RefinerNode& node1 = (*m_refinerNodes)[lhs];
132 RefinerNode& node2 = (*m_refinerNodes)[rhs];
133 Alg::Swap(node1.m_indexInBinaryHeap, node2.m_indexInBinaryHeap);
136 KY_INLINE
void RefinerNodeComparator::SetRefinerNodeArray(WorkingMemArray<RefinerNode>& refinerNodes) { m_refinerNodes = &refinerNodes; }
137 KY_INLINE
bool RefinerNodeComparator::operator() (
const RefinerNodeIndex lhsIdx,
const RefinerNodeIndex rhsIdx)
const
139 RefinerNode& lhs = (*m_refinerNodes)[lhsIdx];
140 RefinerNode& rhs = (*m_refinerNodes)[rhsIdx];
141 return lhs.m_refinerCost < rhs.m_refinerCost;
144 KY_INLINE
void PathRefinerContext::ReleaseWorkingMemory()
146 m_triangleRawPtrNodes.ReleaseWorkingMemoryBuffer();
147 m_vertexRawPtrNodes.ReleaseWorkingMemoryBuffer();
148 m_refinerBinHeap.ReleaseWorkingMemoryBuffer();
149 m_refinerNodes.ReleaseWorkingMemoryBuffer();
#define KyFloat32MAXVAL
KyFloat32 max value
Definition: types.h:71
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
std::uint16_t KyUInt16
uint16_t
Definition: types.h:28
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
#define KyUInt16MAXVAL
KyUInt16 max value
Definition: types.h:67
float KyFloat32
float
Definition: types.h:32