gwnavgeneration/generator/generatorconnectcomponenttraversal.h Source File

generatorconnectcomponenttraversal.h
Go to the documentation of this file.
1 /*
2 * Copyright 2015 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 
8 // ---------- Primary contact: JUBA - secondary contact: NOBODY
9 #ifndef Navigation_GeneratorConnectComponentTraversal_H
10 #define Navigation_GeneratorConnectComponentTraversal_H
11 
13 
16 
20 
21 namespace Kaim
22 {
23 
24 class NavMeshElementBlob;
25 
26 // Implementation detail of PdgNavDataFilter
27 class GeneratorConnectComponentTraversal
28 {
29  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
30 
31 public :
32  GeneratorConnectComponentTraversal() :
33  m_openNodesPool(Memory::pGlobalHeap, MemStat_NavDataGen, PoolChunkSize::SlotCount, 64),
34  m_openNodes(&m_openNodesPool),
35  m_currentComponentId(KyUInt32MAXVAL)
36  {}
37 
38  typedef NavTagPtr ConnexPtr;
39 public :
40  void Clear() { m_openNodes.Clear(); }
41 
42  void Search();
43 
44  KY_INLINE void AddStartNavConnex(const ConnexPtr& navConnextPtr)
45  {
46  SetConnectedComponentId(navConnextPtr, m_currentComponentId);
47  m_openNodes.PushBack(navConnextPtr);
48  }
49 
50  KY_INLINE void SetCurrentComponentId(ConnectedComponentId currentComponentId)
51  {
52  m_currentComponentId = currentComponentId;
53  }
54 
55  ConnectedComponentId GetConnectedComponentId(const ConnexPtr& navConnextPtr)
56  {
57  return navConnextPtr.m_navFloorPtr->GetConnexConnectedComponentId(navConnextPtr.m_navTagIdx);
58  }
59 
60  void SetConnectedComponentId(const ConnexPtr& navConnextPtr, ConnectedComponentId currentComponentId)
61  {
62  navConnextPtr.m_navFloorPtr->SetConnexConnectedComponentId(navConnextPtr.m_navTagIdx, currentComponentId);
63  }
64 private:
65 
66  KY_INLINE void OpenNodeIfNew(const ConnexPtr& navConnextPtr)
67  {
68  ConnectedComponentId connectedComponentId = GetConnectedComponentId(navConnextPtr);
69 
70  if (connectedComponentId == ConnectedComponent_UNDEFINED)
71  {
72  SetConnectedComponentId(navConnextPtr, m_currentComponentId);
73  m_openNodes.PushBack(navConnextPtr);
74  }
75  }
76 
77 protected:
78  SharedPoolList<ConnexPtr>::NodePool m_openNodesPool;
79  SharedPoolList<ConnexPtr> m_openNodes;
80  ConnectedComponentId m_currentComponentId;
81 };
82 
83 
84 inline void GeneratorConnectComponentTraversal::Search()
85 {
86  ConnexPtr currentConnexPtr;
87  SharedPoolList<ConnexPtr>::Iterator firstIterator = m_openNodes.GetFirst();
88  while (m_openNodes.IsEmpty() == false)
89  {
90  currentConnexPtr = *firstIterator;
91  m_openNodes.Erase(firstIterator);
92 
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)
98  {
99  if (connexIdxBuffer[triangleIdx] != currentConnexPtr.m_navTagIdx)
100  continue;
101 
102  NavHalfEdgeIdx firstEdgeIdx = 3*triangleIdx;
103 
104  for(KyUInt32 i = 0; i < 3; ++i)
105  {
106  NavHalfEdgeRawPtr edge(navFloor, firstEdgeIdx + i);
107  NavHalfEdgeRawPtr pairEdge;
108  if (edge.IsHalfEdgeCrossable(pairEdge) == false)
109  continue;
110  NavTrianglePtr pairTriangle(pairEdge.GetNavFloor(), NavFloorBlob::NavHalfEdgeIdxToTriangleIdx(pairEdge.GetHalfEdgeIdx()));
111 
112  OpenNodeIfNew(ConnexPtr(pairTriangle));
113  }
114  }
115 
116  firstIterator = m_openNodes.GetFirst();
117  }
118 }
119 
120 
121 
122 }
123 
124 #endif // Navigation_GeneratorConnectComponentTraversal_H
125 
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