gwnavgeneration/navraster/dynamicnavrastercell.h Source File

dynamicnavrastercell.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: LASI - secondary contact: GUAL
9 #ifndef GwNavGen_DynamicNavRasterCell_H
10 #define GwNavGen_DynamicNavRasterCell_H
11 
12 
15 
23 
24 namespace Kaim
25 {
26 
27 class GeneratorSystem;
28 class BlobChunkBuilder;
29 
30 class NavRasterWorkingPixel;
31 
32 class NavRasterNeighborPixel
33 {
34 public:
35  NavRasterNeighborPixel() : m_floorIdxOfNeighbor(NavRasterFloorIdx_Invalid), m_connectionType(NavRasterConnectionType_NO_TAG), m_neighborPtr(KY_NULL) {}
36  void Clear();
37 
38  NavRasterFloorIdx m_floorIdxOfNeighbor;
39  NavRasterConnectionType m_connectionType;
40  NavRasterWorkingPixel* m_neighborPtr;
41 };
42 
43 class NavRasterWorkingPixel
44 {
45  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
46 public:
47  NavRasterWorkingPixel() { Clear(); }
48  void Clear();
49 
50  // remove the pointer to the neighbor pixel and make sure we update
51  // the symmetric neighbor connections as well.
52  void DisconnectFromNeighbors();
53 
54  void TagNeighbors(KyUInt32 tag);
55 
56  KyUInt32 GetFeatureMask(CardinalDir dir) const;
57  NavRasterFloorIdx GethNeighborFloorIndex(CardinalDir dir) const;
58  NavRasterWorkingPixel* GethNeighborPixelPtr(CardinalDir dir) const;
59  bool HasAtLeastOneValidNeighborLink() const;
60 
61  KyFloat32 m_altitude;
62  KyFloat32 m_distanceFromWall;
63  KyFloat32 m_distanceFromHole;
64  NavRasterFloorIdx m_floorIdx;
65  KyUInt32 m_navTagIdx;
66  KyUInt32 m_featureBitField;
67 
68  // connections are indexed as follow:
69  // +-----------+
70  // | 1 |
71  // | |
72  // |2 + 0|
73  // | |
74  // | 3 |
75  // +-----------+
76 
77  //0 corresponds to East (+1;0) and index increases CCW
78  //Stores level index of neighbor position if reachable, 0xFFFFFFFF otherwise
79  NavRasterNeighborPixel m_neighborPixels[4];
80 };
81 
82 class DynamicNavRasterFinalColumn
83 {
84 public:
85  DynamicNavRasterFinalColumn() : m_floorCount(0), m_elements(KY_NULL) {}
86  KyUInt32 m_floorCount;
87  NavRasterPixel* m_elements;
88 };
89 
90 class DynamicNavRasterWorkingColumn
91 {
92 public:
93  DynamicNavRasterWorkingColumn() : m_floorCount(0), m_elements(KY_NULL) {}
94  KyUInt32 m_floorCount;
95  NavRasterWorkingPixel* m_elements;
96 };
97 
98 class DynamicNavRasterCell
99 {
100  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
101 public:
102  DynamicNavRasterCell(GeneratorSystem* sys, const DynamicRasterCell* inputRasterCell, const CellDesc& cellDesc, KyArrayTLS_POD<KyUInt32>* connexIdxToNavTagIdxArray);
103  ~DynamicNavRasterCell() {}
104 
105  void CreateNavRaster();
106 
107  DynamicNavRasterFinalColumn GetFinalColumnFromLocalPixelPos(const PixelPos& localPixelPos) const;
108 
109  /* Write NavRaster file file if specified in the Generator RunOptions, for debug purpose. */
110  KyResult WriteIntermediateNavRasterFile();
111 
112  bool IsEmpty() const { return m_isEmpty; }
113  bool HasMultipleNavTags() const { return m_hasMultipleNavTags; }
114 
115  DynamicNavRasterWorkingColumn* GetWorkingNeighborColumn(const PixelPos& pos, CardinalDir dir);
116 
117  NavRasterWorkingPixel* GetWorkingNeighborPixel(const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir) const;
118 
119 private:
120  void ResettNeighborhoodInfo(const PixelPos& posInRaster, PixelPos* neighborPos, KyUInt32* neighborColumnIndex,
121  bool* isNeighborInside, KyUInt32* neighborNavTagIdx, NavRasterWorkingPixel** neighbors);
122  void CreateUnpaintNavRaster();
123  void BuildRaster();
124  void FilterIsolatedSteps();
125  void TagConnections();
126  void ErodePixels();
127 
128  void MakeFinalColumns();
129 
130  void EnforceSymetry();
131 
132  void ComputeManhattanDistanceMap();
133  void InitBorderPixelDistance();
134  void UpdateManhattanDistForPixelsOnDir(const PixelPos& posInRaster, CardinalDir dir1, CardinalDir dir2);
135  void UpdateChessBoardDistForPixelsOnDir(const PixelPos& posInRaster, NavRasterCardinalDir* navRasterDirs);
136 
137  void ComputeChessboardDistanceMap();
138 
139  void ReleaseWorkingColumns()
140  {
141  m_workingColumns.ClearAndRelease();
142  m_workingColumnsPool.Release();
143  }
144 
145  NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir) const;
146  NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(const NavRasterWorkingPixel& pixel, CardinalDir dir1, CardinalDir dir2) const;
147 
148 public:
149  GeneratorSystem* m_sys;
150  CellDesc m_cellDesc;
151  KyUInt32 m_highestFloorCount;
152 
153 public:
154  const DynamicRasterCell* m_inputRasterCell;
155 
156  PixelBox m_enlargedPixelBox;
157  PixelBox m_navPixelBox;
158 
159  //coloring
160  NavRasterCellScanlinePainter m_painter;
161 
162  // final columns
163  KyArrayTLS<DynamicNavRasterFinalColumn> m_finalColumns;
164  GrowingSmallBufferPool m_finalColumnsPool;
165 
166  KyArrayTLS<DynamicNavRasterWorkingColumn> m_workingColumns;
167  GrowingSmallBufferPool m_workingColumnsPool;
168 
169  bool m_isEmpty;
170  bool m_hasMultipleNavTags; //extracted from the rasterCell
171 
172  KyFloat32* m_navRasterMs;
173  KyFloat32* m_paintingMs;
174 
175  friend class DynamicNavRasterCellBlobBuilder;
176 };
177 
178 KY_INLINE void NavRasterNeighborPixel::Clear()
179 {
180  m_neighborPtr = KY_NULL;
181  m_connectionType = NavRasterConnectionType_NO_TAG;
182  m_floorIdxOfNeighbor = NavRasterFloorIdx_Invalid;
183 }
184 
185 KY_INLINE KyUInt32 NavRasterWorkingPixel::GetFeatureMask(CardinalDir dir) const { return (0xFF << dir) && m_featureBitField; }
186 KY_INLINE NavRasterFloorIdx NavRasterWorkingPixel::GethNeighborFloorIndex(CardinalDir dir) const { return m_neighborPixels[dir].m_floorIdxOfNeighbor; }
187 KY_INLINE NavRasterWorkingPixel* NavRasterWorkingPixel::GethNeighborPixelPtr(CardinalDir dir) const { return m_neighborPixels[dir].m_neighborPtr; }
188 
189 KY_INLINE DynamicNavRasterFinalColumn DynamicNavRasterCell::GetFinalColumnFromLocalPixelPos(const PixelPos& localPixelPos) const
190 {
191  const KyInt32 idx = m_navPixelBox.GetRowMajorIndexFromLocalPos(localPixelPos);
192  return m_finalColumns[idx];
193 }
194 
195 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingNeighborPixel(const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir) const
196 {
197  return dir < 4 ? pixel.GethNeighborPixelPtr(dir) : GetWorkingDiagonalNeighbor(pixel, dir);
198 }
199 
200 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingDiagonalNeighbor(const NavRasterWorkingPixel& pos, NavRasterCardinalDir dir) const
201 {
202  KY_ASSERT(dir >= 4 && dir < 8);
203 
204  switch(dir)
205  {
206  case NavRasterCardinalDir_NORTH_EAST:
207  return GetWorkingDiagonalNeighbor(pos, CardinalDir_NORTH, CardinalDir_EAST);
208  case NavRasterCardinalDir_NORTH_WEST:
209  return GetWorkingDiagonalNeighbor(pos, CardinalDir_NORTH, CardinalDir_WEST);
210  case NavRasterCardinalDir_SOUTH_WEST:
211  return GetWorkingDiagonalNeighbor(pos, CardinalDir_SOUTH, CardinalDir_WEST);
212  case NavRasterCardinalDir_SOUTH_EAST:
213  return GetWorkingDiagonalNeighbor(pos, CardinalDir_SOUTH, CardinalDir_EAST);
214  default: return KY_NULL;
215  }
216 }
217 }
218 
219 #endif
static const CardinalDir CardinalDir_NORTH
Identifies North, defined as the positive direction of the Y axis.
Definition: cardinaldir.h:26
KyInt32 KyResult
Defines a type that can be returned by methods or functions in the Gameware Navigation SDK to indicat...
Definition: types.h:254
int KyInt32
Type used internally to represent a 32-bit integer.
Definition: types.h:35
#define KY_NULL
Null value.
Definition: types.h:247
KyUInt32 CardinalDir
Defines a type that refers to one of the cardinal points on the compass:
Definition: cardinaldir.h:23
static const CardinalDir CardinalDir_SOUTH
Identifies South, defined as the negative direction of the Y axis.
Definition: cardinaldir.h:28
static const CardinalDir CardinalDir_EAST
Identifies East, defined as the positive direction of the X axis.
Definition: cardinaldir.h:25
static const CardinalDir CardinalDir_WEST
Identifies West, defined as the negative direction of the X axis.
Definition: cardinaldir.h:27
Definition: gamekitcrowddispersion.h:20
#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
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43