9 #ifndef GwNavGen_DynamicNavRasterCell_H
10 #define GwNavGen_DynamicNavRasterCell_H
27 class GeneratorSystem;
29 class NavRasterWorkingPixel;
32 class NavRasterNeighbor
35 NavRasterNeighbor() { Clear(); }
39 m_neighborFloorIndex = NavRasterFloorIdx_Invalid;
40 m_connectionType = NavRasterConnectionType_NO_TAG;
45 NavRasterFloorIdx m_neighborFloorIndex;
46 NavRasterConnectionType m_connectionType;
47 NavRasterWorkingPixel* m_neighborPtr;
51 class NavRasterWorkingPixel
55 NavRasterWorkingPixel() { Clear(); }
60 void DisconnectFromNeighbors();
64 NavRasterWorkingPixel* GetNeighborPixel(
CardinalDir dir)
const {
return m_neighbors[dir].m_neighborPtr; }
65 bool HasAtLeastOneValidNeighborLink()
const;
73 NavRasterFloorIdx m_floorIdx;
88 NavRasterNeighbor m_neighbors[4];
92 class DynamicNavRasterWorkingColumn
95 DynamicNavRasterWorkingColumn() : m_floorCount(0), m_pixels(
KY_NULL) {}
97 void Init(
KyUInt32 floorCount, NavRasterWorkingPixel* pixels)
99 m_floorCount = floorCount;
103 KyUInt32 GetFloorCount()
const {
return m_floorCount; }
105 NavRasterWorkingPixel& GetPixelAtFloor(
KyUInt32 index) { KY_ASSERT(index < m_floorCount);
return m_pixels[index]; }
106 const NavRasterWorkingPixel& GetPixelAtFloor(
KyUInt32 index)
const { KY_ASSERT(index < m_floorCount);
return m_pixels[index]; }
110 NavRasterWorkingPixel* m_pixels;
114 class DynamicNavRasterFinalColumn
117 DynamicNavRasterFinalColumn() : m_floorCount(0), m_pixels(
KY_NULL) {}
119 NavRasterPixel* m_pixels;
122 class DynamicNavRasterCell
126 DynamicNavRasterCell(GeneratorSystem* sys, const DynamicRasterCell* inputRasterCell, const CellDesc& cellDesc, KyArrayTLS_POD<
KyUInt32>* connexIdxToNavTagIdxArray);
127 ~DynamicNavRasterCell() {}
129 void CreateNavRaster();
131 DynamicNavRasterFinalColumn GetFinalColumnFromLocalPixelPos(
const PixelPos& localPixelPos)
const;
134 KyResult WriteIntermediateNavRasterFile();
136 bool IsEmpty()
const {
return m_isEmpty; }
137 bool HasMultipleNavTags()
const {
return m_hasMultipleNavTags; }
139 DynamicNavRasterWorkingColumn* GetWorkingNeighborColumn(
const PixelPos& pos,
CardinalDir dir);
141 NavRasterWorkingPixel* GetWorkingNeighborPixel(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const;
144 void CreateUnpaintNavRaster();
145 void InitFromInputRasterCell();
146 void RemoveIsolatedNonWalkablePixels();
147 void ComputeConnectedNeighbors();
148 void EnforceSymetry();
149 void ComputeDistanceMap();
152 void MakeFinalColumns();
154 void ComputeManhattanDistanceMap();
155 void InitBorderPixelDistance();
157 void UpdateChessBoardDistForPixelsOnDir(
const PixelPos& posInRaster, NavRasterCardinalDir* navRasterDirs);
159 void ComputeChessboardDistanceMap();
161 void ReleaseWorkingColumns();
163 NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const;
164 NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pixel,
CardinalDir dir1,
CardinalDir dir2)
const;
167 GeneratorSystem* m_sys;
172 const DynamicRasterCell* m_rasterCell;
174 PixelBox m_enlargedPixelBox;
175 PixelBox m_navPixelBox;
178 NavRasterCellScanlinePainter m_painter;
181 KyArrayTLS<DynamicNavRasterFinalColumn> m_finalColumns;
182 GrowingSmallBufferPool m_finalColumnsPool;
184 KyArrayTLS<DynamicNavRasterWorkingColumn> m_workingColumns;
185 GrowingSmallBufferPool m_workingColumnsPool;
188 bool m_hasMultipleNavTags;
193 friend class DynamicNavRasterCellBlobBuilder;
197 KY_INLINE DynamicNavRasterFinalColumn DynamicNavRasterCell::GetFinalColumnFromLocalPixelPos(
const PixelPos& localPixelPos)
const
199 const KyInt32 idx = m_navPixelBox.GetRowMajorIndexFromLocalPos(localPixelPos);
200 return m_finalColumns[idx];
203 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingNeighborPixel(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const
205 return dir < 4 ? pixel.GetNeighborPixel(dir) : GetWorkingDiagonalNeighbor(pixel, dir);
208 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pos, NavRasterCardinalDir dir)
const
210 KY_ASSERT(dir >= 4 && dir < 8);
214 case NavRasterCardinalDir_NORTH_EAST:
216 case NavRasterCardinalDir_NORTH_WEST:
218 case NavRasterCardinalDir_SOUTH_WEST:
220 case NavRasterCardinalDir_SOUTH_EAST:
226 KY_INLINE
void DynamicNavRasterCell::ReleaseWorkingColumns()
228 m_workingColumns.ClearAndRelease();
229 m_workingColumnsPool.Release();
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
#define KyUInt32MAXVAL
The maximum value that can be stored in the KyUInt32 variable type.
Definition: types.h:226
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43