19 class NavMeshElementBlob;
36 template <
class Visitor>
37 class BestFirstSearchTraversal
42 BestFirstSearchTraversal(QueryUtils& queryUtils, const
CellBox& cellBox, Visitor& visitor) :
43 m_activeData(queryUtils.m_database->GetActiveData()),
45 m_openNodes(queryUtils.GetWorkingMemory()),
46 m_triangleStatus(queryUtils.GetWorkingMemory(), cellBox),
47 m_visitedNodes(
nullptr) {}
52 m_triangleStatus.MakeEmpty();
55 bool IsInitialized()
const {
return m_openNodes.IsInitialized() && m_triangleStatus.IsInitialized(); }
57 TraversalResult SetStartTriangle(
const NavTriangleRawPtr& trianglePtr);
58 TraversalResult Search();
60 void SetVisitedNodeContainer(WorkingMemArray<NavTriangleRawPtr>* visitedNodes) { m_visitedNodes = visitedNodes; }
63 TraversalResult AddTriangleIfNeverEncountered(
const NavTriangleRawPtr& node);
64 PropagationNode createNode(
const NavTriangleRawPtr& node);
67 ActiveData* m_activeData;
71 WorkingMemBinaryHeap<PropagationNode> m_openNodes;
73 TriangleStatusInGrid m_triangleStatus;
74 WorkingMemArray<NavTriangleRawPtr>* m_visitedNodes;
78 template <
class Visitor>
79 TraversalResult BestFirstSearchTraversal<Visitor>::SetStartTriangle(
const NavTriangleRawPtr& triangleRawPtr)
81 if (m_visitor->ShouldVisitTriangle(triangleRawPtr) ==
false)
82 return TraversalResult_DONE;
84 if (m_openNodes.IsFull() ==
false)
86 m_openNodes.Insert(PropagationNode(triangleRawPtr));
89 if (m_triangleStatus.IsInitialized() ==
false)
90 return TraversalResult_LACK_OF_MEMORY_FOR_CLOSED_NODES;
92 return m_triangleStatus.OpenNodeIfNew(*m_activeData, triangleRawPtr, unused);
95 return TraversalResult_LACK_OF_MEMORY_FOR_OPEN_NODES;
98 template <
class Visitor>
99 TraversalResult BestFirstSearchTraversal<Visitor>::Search()
101 bool doesStoreVisited = m_visitedNodes !=
nullptr;
105 PropagationNode currentNode;
107 while (!m_openNodes.IsEmpty())
109 m_openNodes.ExtractFirst(currentNode);
111 m_visitor->Visit(currentNode.m_triangleRawPtr, currentNode.m_cost, m_triangleStatus);
113 if (doesStoreVisited)
115 if (m_visitedNodes->PushBack(currentNode.m_triangleRawPtr) ==
KY_ERROR)
116 return TraversalResult_LACK_OF_MEMORY_FOR_VISITED_NODES;
119 if (m_visitor->IsSearchFinished())
120 return TraversalResult_DONE;
122 if (m_visitor->ShouldVisitNeighborTriangle(currentNode.m_triangleRawPtr, 0))
124 const TraversalResult rc = AddTriangleIfNeverEncountered(m_visitor->GetNeighborTriangle(currentNode.m_triangleRawPtr, 0));
125 if (rc != TraversalResult_DONE)
129 if (m_visitor->ShouldVisitNeighborTriangle(currentNode.m_triangleRawPtr, 1))
131 const TraversalResult rc = AddTriangleIfNeverEncountered(m_visitor->GetNeighborTriangle(currentNode.m_triangleRawPtr, 1));
132 if (rc != TraversalResult_DONE)
136 if (m_visitor->ShouldVisitNeighborTriangle(currentNode.m_triangleRawPtr, 2))
138 const TraversalResult rc = AddTriangleIfNeverEncountered(m_visitor->GetNeighborTriangle(currentNode.m_triangleRawPtr, 2));
139 if (rc != TraversalResult_DONE)
144 return TraversalResult_DONE;
147 template <
class Visitor>
148 TraversalResult BestFirstSearchTraversal<Visitor>::AddTriangleIfNeverEncountered(
const NavTriangleRawPtr& triangleRawPtr)
151 TraversalResult result = m_triangleStatus.OpenNodeIfNew(*m_activeData, triangleRawPtr, nodeIsNew);
152 if (result != TraversalResult_DONE)
157 if (m_openNodes.IsFull())
158 return TraversalResult_LACK_OF_MEMORY_FOR_OPEN_NODES;
160 m_openNodes.Insert(createNode(triangleRawPtr));
163 return TraversalResult_DONE;
166 template <
class Visitor>
167 PropagationNode BestFirstSearchTraversal<Visitor>::createNode(
const NavTriangleRawPtr& triangleRawPtr)
169 PropagationNode node(triangleRawPtr);
170 m_visitor->ComputeTriangleCost(triangleRawPtr, node.m_cost);
Box2i CellBox
A type that represents a bounding box around cells in a 2D grid.
Definition: navmeshtypes.h:31
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
#define KY_ERROR
use result == KY_ERROR to test for error
Definition: types.h:132