9 #ifndef Navigation_GeneratorConnectComponentTraversal_H
10 #define Navigation_GeneratorConnectComponentTraversal_H
24 class NavMeshElementBlob;
27 class GeneratorConnectComponentTraversal
32 GeneratorConnectComponentTraversal() :
33 m_openNodesPool(Memory::pGlobalHeap, MemStat_NavDataGen, PoolChunkSize::SlotCount, 64),
34 m_openNodes(&m_openNodesPool),
38 typedef NavTagPtr ConnexPtr;
40 void Clear() { m_openNodes.Clear(); }
44 KY_INLINE
void AddStartNavConnex(
const ConnexPtr& navConnextPtr)
46 SetConnectedComponentId(navConnextPtr, m_currentComponentId);
47 m_openNodes.PushBack(navConnextPtr);
50 KY_INLINE
void SetCurrentComponentId(ConnectedComponentId currentComponentId)
52 m_currentComponentId = currentComponentId;
55 ConnectedComponentId GetConnectedComponentId(
const ConnexPtr& navConnextPtr)
57 return navConnextPtr.m_navFloorPtr->GetConnexConnectedComponentId(navConnextPtr.m_navTagIdx);
60 void SetConnectedComponentId(
const ConnexPtr& navConnextPtr, ConnectedComponentId currentComponentId)
62 navConnextPtr.m_navFloorPtr->SetConnexConnectedComponentId(navConnextPtr.m_navTagIdx, currentComponentId);
66 KY_INLINE
void OpenNodeIfNew(
const ConnexPtr& navConnextPtr)
68 ConnectedComponentId connectedComponentId = GetConnectedComponentId(navConnextPtr);
70 if (connectedComponentId == ConnectedComponent_UNDEFINED)
72 SetConnectedComponentId(navConnextPtr, m_currentComponentId);
73 m_openNodes.PushBack(navConnextPtr);
78 SharedPoolList<ConnexPtr>::NodePool m_openNodesPool;
79 SharedPoolList<ConnexPtr> m_openNodes;
80 ConnectedComponentId m_currentComponentId;
84 inline void GeneratorConnectComponentTraversal::Search()
86 ConnexPtr currentConnexPtr;
87 SharedPoolList<ConnexPtr>::Iterator firstIterator = m_openNodes.GetFirst();
88 while (m_openNodes.IsEmpty() ==
false)
90 currentConnexPtr = *firstIterator;
91 m_openNodes.Erase(firstIterator);
93 NavFloor* navFloor = currentConnexPtr.m_navFloorPtr;
94 const NavFloorBlob* navFloorBlob = navFloor->GetNavFloorBlob();
95 const KyUInt32 triangleCount = navFloorBlob->GetNavTriangleCount();
96 const CompactNavConnexIdx* connexIdxBuffer = navFloorBlob->m_triangleConnexIndices.GetValues();
97 for(
NavTriangleIdx triangleIdx = 0; triangleIdx < triangleCount; ++triangleIdx)
99 if (connexIdxBuffer[triangleIdx] != currentConnexPtr.m_navTagIdx)
106 NavHalfEdgeRawPtr edge(navFloor, firstEdgeIdx + i);
107 NavHalfEdgeRawPtr pairEdge;
108 if (edge.IsHalfEdgeCrossable(pairEdge) ==
false)
112 OpenNodeIfNew(ConnexPtr(pairTriangle));
116 firstIterator = m_openNodes.GetFirst();
124 #endif // Navigation_GeneratorConnectComponentTraversal_H
KyUInt32 NavTriangleIdx
An index that uniquely identifies a single triangle within the set of triangles owned by a NavFloor...
Definition: navmeshtypes.h:100
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:87
Definition: gamekitcrowddispersion.h:20
static NavTriangleIdx NavHalfEdgeIdxToTriangleIdx(NavHalfEdgeIdx idx)
Retrieves the index of the triangle that contains the edge specified the input NavHalfEdgeIdx.
Definition: navfloorblob.inl:25
#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
#define KyUInt32MAXVAL
The maximum value that can be stored in the KyUInt32 variable type.
Definition: types.h:226