gwnavgeneration/generator/generatorconnectcomponenttraversal.h Source File

generatorconnectcomponenttraversal.h
Go to the documentation of this file.
1 /*
2 * Copyright 2016 Autodesk, Inc. All rights reserved.
3 * Use of this software is subject to the terms of the Autodesk license agreement and any attachments or Appendices thereto provided at the time of installation or download,
4 * or which otherwise accompanies this software in either electronic or hard copy form, or which is signed by you and accepted by Autodesk.
5 */
6 
7 #pragma once
8 
10 
13 
17 
18 namespace Kaim
19 {
20 
21 class NavMeshElementBlob;
22 
23 // Implementation detail of PdgNavDataFilter
24 class GeneratorConnectComponentTraversal
25 {
26  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
27 
28 public:
29  GeneratorConnectComponentTraversal() :
30  m_openNodesPool(Memory::pGlobalHeap, MemStat_NavDataGen, PoolChunkSize::SlotCount, 64),
31  m_openNodes(&m_openNodesPool),
32  m_currentComponentId(KyUInt32MAXVAL)
33  {}
34 
35  typedef NavTagPtr ConnexPtr;
36 public:
37  void Clear() { m_openNodes.Clear(); }
38 
39  void Search();
40 
41  KY_INLINE void AddStartNavConnex(const ConnexPtr& navConnextPtr)
42  {
43  SetConnectedComponentId(navConnextPtr, m_currentComponentId);
44  m_openNodes.PushBack(navConnextPtr);
45  }
46 
47  KY_INLINE void SetCurrentComponentId(ConnectedComponentId currentComponentId)
48  {
49  m_currentComponentId = currentComponentId;
50  }
51 
52  ConnectedComponentId GetConnectedComponentId(const ConnexPtr& navConnextPtr)
53  {
54  return navConnextPtr.m_navFloorPtr->GetConnexConnectedComponentId(navConnextPtr.m_navTagIdx);
55  }
56 
57  void SetConnectedComponentId(const ConnexPtr& navConnextPtr, ConnectedComponentId currentComponentId)
58  {
59  navConnextPtr.m_navFloorPtr->SetConnexConnectedComponentId(navConnextPtr.m_navTagIdx, currentComponentId);
60  }
61 private:
62 
63  KY_INLINE void OpenNodeIfNew(const ConnexPtr& navConnextPtr)
64  {
65  ConnectedComponentId connectedComponentId = GetConnectedComponentId(navConnextPtr);
66 
67  if (connectedComponentId == ConnectedComponent_UNDEFINED)
68  {
69  SetConnectedComponentId(navConnextPtr, m_currentComponentId);
70  m_openNodes.PushBack(navConnextPtr);
71  }
72  }
73 
74 protected:
75  SharedPoolList<ConnexPtr>::NodePool m_openNodesPool;
76  SharedPoolList<ConnexPtr> m_openNodes;
77  ConnectedComponentId m_currentComponentId;
78 };
79 
80 
81 inline void GeneratorConnectComponentTraversal::Search()
82 {
83  ConnexPtr currentConnexPtr;
84  SharedPoolList<ConnexPtr>::Iterator firstIterator = m_openNodes.GetFirst();
85  while (m_openNodes.IsEmpty() == false)
86  {
87  currentConnexPtr = *firstIterator;
88  m_openNodes.Erase(firstIterator);
89 
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)
95  {
96  if (connexIdxBuffer[triangleIdx] != currentConnexPtr.m_navTagIdx)
97  continue;
98 
99  NavHalfEdgeIdx firstEdgeIdx = 3*triangleIdx;
100 
101  for(KyUInt32 i = 0; i < 3; ++i)
102  {
103  NavHalfEdgeRawPtr edge(navFloor, firstEdgeIdx + i);
104  NavHalfEdgeRawPtr pairEdge;
105  if (edge.IsHalfEdgeCrossable(pairEdge) == false)
106  continue;
107  NavTrianglePtr pairTriangle(pairEdge.GetNavFloor(), NavFloorBlob::NavHalfEdgeIdxToTriangleIdx(pairEdge.GetHalfEdgeIdx()));
108 
109  OpenNodeIfNew(ConnexPtr(pairTriangle));
110  }
111  }
112 
113  firstIterator = m_openNodes.GetFirst();
114  }
115 }
116 
117 
118 
119 }
120 
121 
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