gwnavruntime/queries/utils/dynamicnavmeshcontext.h Source File

dynamicnavmeshcontext.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_DynamicNavMeshContext_H
10 #define Navigation_DynamicNavMeshContext_H
11 
22 
23 namespace Kaim
24 {
25 class TagVolume;
26 
27 class DynamicNavMeshContext
28 {
29  KY_DEFINE_NEW_DELETE_OPERATORS(MemStat_QueryWorkingMem)
30 public:
31 
32  DynamicNavMeshContext()
33  : m_currentNavFloorIdxInProcess(0)
34  , m_polygonVertices(Memory::GetGlobalHeap())
35  , m_dynamicEarTriangulation(Memory::GetGlobalHeap())
36  , m_dynaFloor(Memory::GetGlobalHeap())
37  {}
38  ~DynamicNavMeshContext() { ReleaseWorkingMemory(); }
39 
40  bool InitForQuery(WorkingMemory* workingMemory)
41  {
42  m_rawInputEdges.Init(workingMemory);
43  m_allTagVolumes.Init(workingMemory);
44  m_tagVolumeImpactingCurrentFloor.Init(workingMemory);
45  m_tagVolumeToNavTagIndex.Init(workingMemory);
46 
47  if (m_rawInputEdges.IsInitialized() == false ||
48  m_allTagVolumes.IsInitialized() == false ||
49  m_tagVolumeImpactingCurrentFloor.IsInitialized() == false ||
50  m_tagVolumeToNavTagIndex.IsInitialized() == false)
51  return false;
52 
53  m_currentNavFloorIdxInProcess = 0;
54  return true;
55  }
56 
57  bool InitForNewFloorInQuery(WorkingMemory* /*workingMemory*/)
58  {
59  m_tagVolumeImpactingCurrentFloor.MakeEmpty();
60  m_tagVolumeToNavTagIndex.MakeEmpty();
61  m_rawInputEdges.MakeEmpty();
62 
63  m_navTags.Clear();
64  m_navTagIdxOfConnex.Clear();
65  m_intersectedInputEdges.Clear();
66  m_extractedPolygons.Clear();
67  m_mergedPolygons.Clear();
68  m_sweepResult.Clear();
69  m_triangulationOutputs.Clear();
70  m_dynaFloor.Clear();
71 
72  return true;
73  }
74 
75  void ReleaseWorkingMemory()
76  {
77  m_allTagVolumes.ReleaseWorkingMemoryBuffer();
78  m_tagVolumeImpactingCurrentFloor.ReleaseWorkingMemoryBuffer();
79  m_tagVolumeToNavTagIndex.ReleaseWorkingMemoryBuffer();
80  m_rawInputEdges.ReleaseWorkingMemoryBuffer();
81  m_edgesToTreat.ReleaseWorkingMemoryBuffer();
82  m_rightMostPoints.ReleaseWorkingMemoryBuffer();
83  m_extractedPolygonWinding.ReleaseWorkingMemoryBuffer();
84  m_holeTable.ReleaseWorkingMemoryBuffer();
85  m_treatedEdges.ReleaseWorkingMemoryBuffer();
86  m_successorCandidates.ReleaseWorkingMemoryBuffer();
87  }
88 
89 public:
90  NavFloorIdx m_currentNavFloorIdxInProcess;
91  PixelPos m_cellOriginPixel;
92 
93  // Extract tag volume contour
94  KyUInt16 m_currentTagVolumeIdx;
95  KyUInt16 m_tagVolumeContourCount;
96 
97  // Polygon Building
98  KyUInt16 m_currentNavTagIdx;
99  KyUInt16 m_currentEdgeStart;
100  const SweepLineOutputEdgePiece* m_currentPreviousEdge;
101  bool m_polygonBuildAlreadyInProcess;
102 
103  // Polygon Triangulation
104  KyUInt16 m_currentPolygonIdx;
105  KyUInt16 m_innerPolygonIdx;
106  KyUInt16 m_triangulatorOutputIdx;
107  KyUInt16 m_currentVertexCountInPolygon;
108  KyUInt16 m_firstValidVertexIdxInPolygon;
109 
110  WorkingMemArray<TagVolume*> m_allTagVolumes;
111 
112  WorkingMemArray<TagVolume*> m_tagVolumeImpactingCurrentFloor;
113  WorkingMemArray<KyUInt32> m_tagVolumeToNavTagIndex;
114  WorkingMemArray<InputEdge> m_rawInputEdges;
115 
116  WorkingMemArray<const SweepLineOutputEdgePiece*> m_edgesToTreat;
117 
118  KyArray<InputEdgePiece> m_intersectedInputEdges;
119 
123  KyArray<DynamicNavTag> m_navTags;
124  KyArrayPOD<KyUInt32> m_navTagIdxOfConnex;
125  SweepLineOutput m_sweepResult;
126  KyArray<KyArray<MergedPolygonWithHoles> > m_mergedPolygons;
127  KyArray<TriangulatorOutput> m_triangulationOutputs;
128 
129  KyArrayDH<EarClippingTriangulator::PolygonVertex> m_polygonVertices; // the "linked" polygon structure
130  EarClippingTriangulatorInputPolygonWithHoles m_earPolygon;
131  DynamicTriangulation m_dynamicEarTriangulation;
132  DynamicNavFloor m_dynaFloor;
133 
134 
135  // Polygon builder
136  KyArray<MergedPolygon> m_extractedPolygons;
137 
138  WorkingMemArray<Vec2i> m_rightMostPoints; //GetCount() == m_extractedPolygons.GetCount()
139  WorkingMemArray<PolygonWinding> m_extractedPolygonWinding; //GetCount() == m_extractedPolygons.GetCount()
140  WorkingMemArray<KyUInt32> m_holeTable; //GetCount() == m_extractedPolygons.GetCount()
141  WorkingMemBitField m_treatedEdges;
142  WorkingMemArray<KyUInt32> m_successorCandidates;
143 };
144 
145 
146 
147 
148 }
149 
150 
151 #endif //Navigation_DynamicNavMeshContext_H
152 
KyUInt32 NavFloorIdx
An index that uniquely identifies a single NavFloor within the set of NavFloors owned by a NavCell...
Definition: navmeshtypes.h:115
Definition: gamekitcrowddispersion.h:20
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:137
unsigned short KyUInt16
Type used internally to represent an unsigned 16-bit integer.
Definition: types.h:40