21 class NavMeshElementBlob;
24 class GeneratorConnectComponentTraversal
29 GeneratorConnectComponentTraversal() :
30 m_openNodesPool(Memory::pGlobalHeap, MemStat_NavDataGen, PoolChunkSize::SlotCount, 64),
31 m_openNodes(&m_openNodesPool),
35 typedef NavTagPtr ConnexPtr;
37 void Clear() { m_openNodes.Clear(); }
41 KY_INLINE
void AddStartNavConnex(
const ConnexPtr& navConnextPtr)
43 SetConnectedComponentId(navConnextPtr, m_currentComponentId);
44 m_openNodes.PushBack(navConnextPtr);
47 KY_INLINE
void SetCurrentComponentId(ConnectedComponentId currentComponentId)
49 m_currentComponentId = currentComponentId;
52 ConnectedComponentId GetConnectedComponentId(
const ConnexPtr& navConnextPtr)
54 return navConnextPtr.m_navFloorPtr->GetConnexConnectedComponentId(navConnextPtr.m_navTagIdx);
57 void SetConnectedComponentId(
const ConnexPtr& navConnextPtr, ConnectedComponentId currentComponentId)
59 navConnextPtr.m_navFloorPtr->SetConnexConnectedComponentId(navConnextPtr.m_navTagIdx, currentComponentId);
63 KY_INLINE
void OpenNodeIfNew(
const ConnexPtr& navConnextPtr)
65 ConnectedComponentId connectedComponentId = GetConnectedComponentId(navConnextPtr);
67 if (connectedComponentId == ConnectedComponent_UNDEFINED)
69 SetConnectedComponentId(navConnextPtr, m_currentComponentId);
70 m_openNodes.PushBack(navConnextPtr);
75 SharedPoolList<ConnexPtr>::NodePool m_openNodesPool;
76 SharedPoolList<ConnexPtr> m_openNodes;
77 ConnectedComponentId m_currentComponentId;
81 inline void GeneratorConnectComponentTraversal::Search()
83 ConnexPtr currentConnexPtr;
84 SharedPoolList<ConnexPtr>::Iterator firstIterator = m_openNodes.GetFirst();
85 while (m_openNodes.IsEmpty() ==
false)
87 currentConnexPtr = *firstIterator;
88 m_openNodes.Erase(firstIterator);
90 NavFloor* navFloor = currentConnexPtr.m_navFloorPtr;
91 const NavFloorBlob* navFloorBlob = navFloor->GetNavFloorBlob();
92 const KyUInt32 triangleCount = navFloorBlob->GetNavTriangleCount();
93 const CompactNavConnexIdx* connexIdxBuffer = navFloorBlob->m_triangleConnexIndices.GetValues();
94 for(
NavTriangleIdx triangleIdx = 0; triangleIdx < triangleCount; ++triangleIdx)
96 if (connexIdxBuffer[triangleIdx] != currentConnexPtr.m_navTagIdx)
103 NavHalfEdgeRawPtr edge(navFloor, firstEdgeIdx + i);
104 NavHalfEdgeRawPtr pairEdge;
105 if (edge.IsHalfEdgeCrossable(pairEdge) ==
false)
109 OpenNodeIfNew(ConnexPtr(pairTriangle));
113 firstIterator = m_openNodes.GetFirst();
KyUInt32 NavTriangleIdx
An index that uniquely identifies a single triangle within the set of triangles owned by a NavFloor...
Definition: navmeshtypes.h:97
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
KyUInt32 NavHalfEdgeIdx
An index that uniquely identifies a single edge of a triangle within the set of edges owned by a NavF...
Definition: navmeshtypes.h:84
#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
static NavTriangleIdx NavHalfEdgeIdxToTriangleIdx(NavHalfEdgeIdx idx)
Retrieves the index of the triangle that contains the edge specified the input NavHalfEdgeIdx.
Definition: navfloorblob.inl:22
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68