gwnavgeneration/navraster/dynamicnavrastercell.h Source File

dynamicnavrastercell.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 
11 
19 
20 namespace Kaim
21 {
22 
23 class GeneratorSystem;
24 
25 class NavRasterWorkingPixel;
26 
27 // used in NavRasterWorkingPixel and NavRasterPixelNeighborhood
28 class NavRasterNeighbor
29 {
30 public:
31  NavRasterNeighbor() { Clear(); }
32 
33  void Clear()
34  {
35  m_neighborFloorIndex = NavRasterFloorIdx_Invalid;
36  m_neighborType = NavRasterNeighborType_CONNECT;
37  m_neighborPtr = nullptr;
38  }
39 
40 public:
41  NavRasterFloorIdx m_neighborFloorIndex;
42  NavRasterNeighborType m_neighborType;
43  NavRasterWorkingPixel* m_neighborPtr;
44 };
45 
46 // Dynamic version (non blob) of NavRasterPixel
47 class NavRasterWorkingPixel
48 {
49  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
50 public:
51  NavRasterWorkingPixel() { Clear(); }
52  void Clear();
53 
54  // remove the pointer to the neighbor pixel and make sure we update
55  // the symmetric neighbor connections as well.
56  void DisconnectFromNeighbors();
57 
58  void TagNeighborsFeatureMask(NavRasterFeatureMask feature);
59 
60  NavRasterWorkingPixel* GetNeighborPixel(CardinalDir dir) const { return m_neighbors[dir].m_neighborPtr; }
61  NavRasterNeighborType GetNeighborType(CardinalDir dir) const { return m_neighbors[dir].m_neighborType; }
62 
63  void SetNeighborPixel(CardinalDir dir, NavRasterWorkingPixel* neighborPtr) { m_neighbors[dir].m_neighborPtr = neighborPtr; }
64  void SetNeighborType(CardinalDir dir, NavRasterNeighborType neighborType) { m_neighbors[dir].m_neighborType = neighborType; }
65 
66  bool HasAtLeastOneValidNeighborLink() const;
67 
68  bool IsWalkable() const { return m_navTagIdx != NavTagIdx_Invalid; }
69 
70 public:
71  KyFloat32 m_altitude;
72  KyUInt32 m_wallDist;
73  KyUInt32 m_holeDist;
74  NavRasterFloorIdx m_floorIdx;
75  KyUInt32 m_navTagIdx;
76  KyUInt32 m_featureBitField;
77 
78  // connections are indexed as follow:
79  // +-----------+
80  // | 1 |
81  // | |
82  // |2 + 0|
83  // | |
84  // | 3 |
85  // +-----------+
86 
87  // 0 corresponds to East (+1;0) and index increases CCW
88  // Stores index of neighbor position if reachable, 0xFFFFFFFF otherwise
89  NavRasterNeighbor m_neighbors[4];
90 };
91 
92 // Working: Contains non-walkable pixels
93 class DynamicNavRasterWorkingColumn
94 {
95 public:
96  DynamicNavRasterWorkingColumn() : m_floorCount(0), m_pixels(nullptr), m_hasNonWalkablePixels(false) {}
97 
98  void Init(KyUInt32 floorCount, NavRasterWorkingPixel* pixels)
99  {
100  m_floorCount = floorCount;
101  m_pixels = pixels;
102  }
103 
104  void SetHasNonWalkablePixels(bool hasNonWalkablePixels) { m_hasNonWalkablePixels = hasNonWalkablePixels; }
105  bool GetHasNonWalkablePixels() const { return m_hasNonWalkablePixels; }
106 
107  KyUInt32 GetFloorCount() const { return m_floorCount; }
108 
109  NavRasterWorkingPixel& GetPixelAtFloor(KyUInt32 index) { KY_ASSERT(index < m_floorCount); return m_pixels[index]; }
110  const NavRasterWorkingPixel& GetPixelAtFloor(KyUInt32 index) const { KY_ASSERT(index < m_floorCount); return m_pixels[index]; }
111 
112 private:
113  KyUInt32 m_floorCount;
114  NavRasterWorkingPixel* m_pixels;
115  bool m_hasNonWalkablePixels;
116 };
117 
118 // Final: Does not contain any non-walkable pixels
119 class DynamicNavRasterFinalColumn
120 {
121 public:
122  DynamicNavRasterFinalColumn() : m_floorCount(0), m_pixels(nullptr) {}
123  const NavRasterPixel& GetPixel(KyUInt32 index) const { KY_ASSERT(index < m_floorCount); return m_pixels[index]; }
124  NavRasterPixel& GetPixel(KyUInt32 index) { KY_ASSERT(index < m_floorCount); return m_pixels[index]; }
125 
126  bool HasPixelColor(PixelColor color, KyUInt32 ignored) const
127  {
128  for (KyUInt32 i = 0; i < m_floorCount; ++i)
129  {
130  if (i != ignored && m_pixels[i].m_floorColor == color)
131  return true;
132  }
133  return false;
134  }
135 
136  bool HasPixelColor(PixelColor color, KyUInt32 ignored1, KyUInt32 ignored2) const
137  {
138  for (KyUInt32 i = 0; i < m_floorCount; ++i)
139  {
140  if (i != ignored1 && i != ignored2 && m_pixels[i].m_floorColor == color)
141  return true;
142  }
143  return false;
144  }
145 
146  bool HasPropagationId(KyUInt32 propagationId, KyUInt32 ignored) const
147  {
148  for (KyUInt32 i = 0; i < m_floorCount; ++i)
149  {
150  if (i != ignored && m_pixels[i].m_propagationId == propagationId)
151  return true;
152  }
153  return false;
154  }
155 
156  bool HasPropagationId(PixelColor color, KyUInt32 ignored1, KyUInt32 ignored2) const
157  {
158  for (KyUInt32 i = 0; i < m_floorCount; ++i)
159  {
160  if (i != ignored1 && i != ignored2 && m_pixels[i].m_propagationId == color)
161  return true;
162  }
163  return false;
164  }
165 
166 
167  KyUInt32 m_floorCount;
168  NavRasterPixel* m_pixels;
169 };
170 
171 
172 class DynamicNavRasterCell
173 {
174  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
175 public:
176  DynamicNavRasterCell(GeneratorSystem* sys, const DynamicRasterCell* inputRasterCell, const CellDesc& cellDesc, KyArrayTLS_POD<KyUInt32>* connexIdxToNavTagIdxArray);
177  ~DynamicNavRasterCell() {}
178 
179  void CreateNavRaster();
180 
181  DynamicNavRasterFinalColumn GetFinalColumnFromLocalPixelPos(const PixelPos& localPixelPos) const
182  {
183  const KyInt32 idx = m_navPixelBox.GetRowMajorIndexFromLocalPos(localPixelPos);
184  return m_finalColumns[idx];
185  }
186 
187  DynamicNavRasterFinalColumn GetFinalColumn(const PixelPos& pixelPos) const
188  {
189  const KyInt32 idx = m_navPixelBox.GetRowMajorIndex(pixelPos);
190  return m_finalColumns[idx];
191  }
192 
193  // Write NavRaster file file if specified in the Generator RunOptions, for debug purpose.
194  KyResult WriteIntermediateNavRasterFile();
195 
196  bool IsEmpty() const { return m_isEmpty; }
197  bool HasMultipleNavTags() const { return m_hasMultipleNavTags; }
198 
199  DynamicNavRasterWorkingColumn* GetWorkingNeighborColumn(const PixelPos& pos, CardinalDir dir);
200 
201  NavRasterWorkingPixel* GetWorkingNeighborPixel(const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir) const;
202 
203 private:
204  void CreateUnpaintNavRaster();
205  void InitFromInputRasterCell();
206  void RemoveIsolatedNonWalkablePixels();
207  void ComputeConnectedNeighbors();
208  void EnforceSymetry();
209  void EnforcePixelSymetry(NavRasterWorkingPixel* pixel, CardinalDir dir);
210  void ComputeDistanceMap();
211  void ErodePixels();
212 
213  void MakeFinalColumns();
214 
215  void ComputeManhattanDistanceMap();
216  void InitBorderPixelDistance();
217  void UpdateManhattanDistForPixelsOnDir(const PixelPos& posInRaster, CardinalDir dir1, CardinalDir dir2);
218  void UpdateChessBoardDistForPixelsOnDir(const PixelPos& posInRaster, const NavRasterCardinalDir* navRasterDirs);
219 
220  void ComputeChessboardDistanceMap();
221 
222  void ReleaseWorkingColumns();
223 
224  NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir) const;
225  NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(const NavRasterWorkingPixel& pixel, CardinalDir dir1, CardinalDir dir2) const;
226 
227 public:
228  GeneratorSystem* m_sys;
229  CellDesc m_cellDesc;
230  KyUInt32 m_highestFloorCount;
231 
232 public:
233  const DynamicRasterCell* m_rasterCell;
234 
235  PixelBox m_enlargedPixelBox;
236  PixelBox m_navPixelBox;
237 
238  NavRasterCellScanlinePainter m_painter;
239 
240  // final columns
241  KyArrayTLS<DynamicNavRasterFinalColumn> m_finalColumns;
242  GrowingSmallBufferPool m_finalColumnsPool;
243 
244  KyArrayTLS<DynamicNavRasterWorkingColumn> m_workingColumns;
245  GrowingSmallBufferPool m_workingColumnsPool;
246 
247  bool m_isEmpty;
248  bool m_hasMultipleNavTags; // extracted from the rasterCell
249  bool m_hasNonWalkablePixels;
250 
251  KyFloat32* m_navRasterMs; // profiling
252  KyFloat32* m_paintingMs; // profiling
253 
254  friend class DynamicNavRasterCellBlobBuilder;
255 };
256 
257 
258 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingNeighborPixel(const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir) const
259 {
260  return dir < 4 ? pixel.GetNeighborPixel(dir) : GetWorkingDiagonalNeighbor(pixel, dir);
261 }
262 
263 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingDiagonalNeighbor(const NavRasterWorkingPixel& pos, NavRasterCardinalDir dir) const
264 {
265  KY_ASSERT(dir >= 4 && dir < 8);
266 
267  switch(dir)
268  {
269  case NavRasterCardinalDir_NORTH_EAST:
270  return GetWorkingDiagonalNeighbor(pos, CardinalDir_NORTH, CardinalDir_EAST);
271  case NavRasterCardinalDir_NORTH_WEST:
272  return GetWorkingDiagonalNeighbor(pos, CardinalDir_NORTH, CardinalDir_WEST);
273  case NavRasterCardinalDir_SOUTH_WEST:
274  return GetWorkingDiagonalNeighbor(pos, CardinalDir_SOUTH, CardinalDir_WEST);
275  case NavRasterCardinalDir_SOUTH_EAST:
276  return GetWorkingDiagonalNeighbor(pos, CardinalDir_SOUTH, CardinalDir_EAST);
277  default: return nullptr;
278  }
279 }
280 
281 KY_INLINE void DynamicNavRasterCell::ReleaseWorkingColumns()
282 {
283  m_workingColumns.ClearAndRelease();
284  m_workingColumnsPool.Release();
285 }
286 
287 }
288 
static const CardinalDir CardinalDir_NORTH
Y positive axis.
Definition: cardinaldir.h:17
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
KyUInt32 CardinalDir
Defines a type that refers to one of the cardinal points on the compass:
Definition: cardinaldir.h:15
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
static const CardinalDir CardinalDir_SOUTH
Y negative axis.
Definition: cardinaldir.h:19
static const CardinalDir CardinalDir_EAST
X positive axis.
Definition: cardinaldir.h:16
static const CardinalDir CardinalDir_WEST
X negative axis.
Definition: cardinaldir.h:18
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::int32_t KyInt32
int32_t
Definition: types.h:24
float KyFloat32
float
Definition: types.h:32