23 class GeneratorSystem;
25 class NavRasterWorkingPixel;
28 class NavRasterNeighbor
31 NavRasterNeighbor() { Clear(); }
35 m_neighborFloorIndex = NavRasterFloorIdx_Invalid;
36 m_neighborType = NavRasterNeighborType_CONNECT;
37 m_neighborPtr =
nullptr;
41 NavRasterFloorIdx m_neighborFloorIndex;
42 NavRasterNeighborType m_neighborType;
43 NavRasterWorkingPixel* m_neighborPtr;
47 class NavRasterWorkingPixel
51 NavRasterWorkingPixel() { Clear(); }
56 void DisconnectFromNeighbors();
58 void TagNeighborsFeatureMask(NavRasterFeatureMask feature);
60 NavRasterWorkingPixel* GetNeighborPixel(
CardinalDir dir)
const {
return m_neighbors[dir].m_neighborPtr; }
61 NavRasterNeighborType GetNeighborType(
CardinalDir dir)
const {
return m_neighbors[dir].m_neighborType; }
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; }
66 bool HasAtLeastOneValidNeighborLink()
const;
68 bool IsWalkable()
const {
return m_navTagIdx != NavTagIdx_Invalid; }
74 NavRasterFloorIdx m_floorIdx;
89 NavRasterNeighbor m_neighbors[4];
93 class DynamicNavRasterWorkingColumn
96 DynamicNavRasterWorkingColumn() : m_floorCount(0), m_pixels(nullptr), m_hasNonWalkablePixels(false) {}
98 void Init(
KyUInt32 floorCount, NavRasterWorkingPixel* pixels)
100 m_floorCount = floorCount;
104 void SetHasNonWalkablePixels(
bool hasNonWalkablePixels) { m_hasNonWalkablePixels = hasNonWalkablePixels; }
105 bool GetHasNonWalkablePixels()
const {
return m_hasNonWalkablePixels; }
107 KyUInt32 GetFloorCount()
const {
return m_floorCount; }
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]; }
114 NavRasterWorkingPixel* m_pixels;
115 bool m_hasNonWalkablePixels;
119 class DynamicNavRasterFinalColumn
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]; }
126 bool HasPixelColor(PixelColor color,
KyUInt32 ignored)
const
128 for (
KyUInt32 i = 0; i < m_floorCount; ++i)
130 if (i != ignored && m_pixels[i].m_floorColor == color)
136 bool HasPixelColor(PixelColor color,
KyUInt32 ignored1,
KyUInt32 ignored2)
const
138 for (
KyUInt32 i = 0; i < m_floorCount; ++i)
140 if (i != ignored1 && i != ignored2 && m_pixels[i].m_floorColor == color)
148 for (
KyUInt32 i = 0; i < m_floorCount; ++i)
150 if (i != ignored && m_pixels[i].m_propagationId == propagationId)
156 bool HasPropagationId(PixelColor color,
KyUInt32 ignored1,
KyUInt32 ignored2)
const
158 for (
KyUInt32 i = 0; i < m_floorCount; ++i)
160 if (i != ignored1 && i != ignored2 && m_pixels[i].m_propagationId == color)
168 NavRasterPixel* m_pixels;
172 class DynamicNavRasterCell
176 DynamicNavRasterCell(GeneratorSystem* sys, const DynamicRasterCell* inputRasterCell, const CellDesc& cellDesc, KyArrayTLS_POD<
KyUInt32>* connexIdxToNavTagIdxArray);
177 ~DynamicNavRasterCell() {}
179 void CreateNavRaster();
181 DynamicNavRasterFinalColumn GetFinalColumnFromLocalPixelPos(
const PixelPos& localPixelPos)
const
183 const KyInt32 idx = m_navPixelBox.GetRowMajorIndexFromLocalPos(localPixelPos);
184 return m_finalColumns[idx];
187 DynamicNavRasterFinalColumn GetFinalColumn(
const PixelPos& pixelPos)
const
189 const KyInt32 idx = m_navPixelBox.GetRowMajorIndex(pixelPos);
190 return m_finalColumns[idx];
194 KyResult WriteIntermediateNavRasterFile();
196 bool IsEmpty()
const {
return m_isEmpty; }
197 bool HasMultipleNavTags()
const {
return m_hasMultipleNavTags; }
199 DynamicNavRasterWorkingColumn* GetWorkingNeighborColumn(
const PixelPos& pos,
CardinalDir dir);
201 NavRasterWorkingPixel* GetWorkingNeighborPixel(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const;
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();
213 void MakeFinalColumns();
215 void ComputeManhattanDistanceMap();
216 void InitBorderPixelDistance();
218 void UpdateChessBoardDistForPixelsOnDir(
const PixelPos& posInRaster,
const NavRasterCardinalDir* navRasterDirs);
220 void ComputeChessboardDistanceMap();
222 void ReleaseWorkingColumns();
224 NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const;
225 NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pixel,
CardinalDir dir1,
CardinalDir dir2)
const;
228 GeneratorSystem* m_sys;
233 const DynamicRasterCell* m_rasterCell;
235 PixelBox m_enlargedPixelBox;
236 PixelBox m_navPixelBox;
238 NavRasterCellScanlinePainter m_painter;
241 KyArrayTLS<DynamicNavRasterFinalColumn> m_finalColumns;
242 GrowingSmallBufferPool m_finalColumnsPool;
244 KyArrayTLS<DynamicNavRasterWorkingColumn> m_workingColumns;
245 GrowingSmallBufferPool m_workingColumnsPool;
248 bool m_hasMultipleNavTags;
249 bool m_hasNonWalkablePixels;
254 friend class DynamicNavRasterCellBlobBuilder;
258 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingNeighborPixel(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const
260 return dir < 4 ? pixel.GetNeighborPixel(dir) : GetWorkingDiagonalNeighbor(pixel, dir);
263 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pos, NavRasterCardinalDir dir)
const
265 KY_ASSERT(dir >= 4 && dir < 8);
269 case NavRasterCardinalDir_NORTH_EAST:
271 case NavRasterCardinalDir_NORTH_WEST:
273 case NavRasterCardinalDir_SOUTH_WEST:
275 case NavRasterCardinalDir_SOUTH_EAST:
277 default:
return nullptr;
281 KY_INLINE
void DynamicNavRasterCell::ReleaseWorkingColumns()
283 m_workingColumns.ClearAndRelease();
284 m_workingColumnsPool.Release();
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