gwnavruntime/queries/utils/dynamicnavmeshcontext.h Source File

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