9 #ifndef GwNavGen_DynamicNavRasterCell_H
10 #define GwNavGen_DynamicNavRasterCell_H
27 class GeneratorSystem;
28 class BlobChunkBuilder;
30 class NavRasterWorkingPixel;
32 class NavRasterNeighborPixel
35 NavRasterNeighborPixel() : m_floorIdxOfNeighbor(NavRasterFloorIdx_Invalid), m_connectionType(NavRasterConnectionType_NO_TAG), m_neighborPtr(
KY_NULL) {}
38 NavRasterFloorIdx m_floorIdxOfNeighbor;
39 NavRasterConnectionType m_connectionType;
40 NavRasterWorkingPixel* m_neighborPtr;
43 class NavRasterWorkingPixel
47 NavRasterWorkingPixel() { Clear(); }
52 void DisconnectFromNeighbors();
57 NavRasterFloorIdx GethNeighborFloorIndex(
CardinalDir dir)
const;
58 NavRasterWorkingPixel* GethNeighborPixelPtr(
CardinalDir dir)
const;
59 bool HasAtLeastOneValidNeighborLink()
const;
64 NavRasterFloorIdx m_floorIdx;
79 NavRasterNeighborPixel m_neighborPixels[4];
82 class DynamicNavRasterFinalColumn
85 DynamicNavRasterFinalColumn() : m_floorCount(0), m_elements(
KY_NULL) {}
87 NavRasterPixel* m_elements;
90 class DynamicNavRasterWorkingColumn
93 DynamicNavRasterWorkingColumn() : m_floorCount(0), m_elements(
KY_NULL) {}
95 NavRasterWorkingPixel* m_elements;
98 class DynamicNavRasterCell
102 DynamicNavRasterCell(GeneratorSystem* sys, const DynamicRasterCell* inputRasterCell, const CellDesc& cellDesc, KyArrayTLS_POD<
KyUInt32>* connexIdxToNavTagIdxArray);
103 ~DynamicNavRasterCell() {}
105 void CreateNavRaster();
107 DynamicNavRasterFinalColumn GetFinalColumnFromLocalPixelPos(
const PixelPos& localPixelPos)
const;
110 KyResult WriteIntermediateNavRasterFile();
112 bool IsEmpty()
const {
return m_isEmpty; }
113 bool HasMultipleNavTags()
const {
return m_hasMultipleNavTags; }
115 DynamicNavRasterWorkingColumn* GetWorkingNeighborColumn(
const PixelPos& pos,
CardinalDir dir);
117 NavRasterWorkingPixel* GetWorkingNeighborPixel(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const;
120 void ResettNeighborhoodInfo(
const PixelPos& posInRaster, PixelPos* neighborPos,
KyUInt32* neighborColumnIndex,
121 bool* isNeighborInside,
KyUInt32* neighborNavTagIdx, NavRasterWorkingPixel** neighbors);
122 void CreateUnpaintNavRaster();
124 void FilterIsolatedSteps();
125 void TagConnections();
128 void MakeFinalColumns();
130 void EnforceSymetry();
132 void ComputeManhattanDistanceMap();
133 void InitBorderPixelDistance();
135 void UpdateChessBoardDistForPixelsOnDir(
const PixelPos& posInRaster, NavRasterCardinalDir* navRasterDirs);
137 void ComputeChessboardDistanceMap();
139 void ReleaseWorkingColumns()
141 m_workingColumns.ClearAndRelease();
142 m_workingColumnsPool.Release();
145 NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const;
146 NavRasterWorkingPixel* GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pixel,
CardinalDir dir1,
CardinalDir dir2)
const;
149 GeneratorSystem* m_sys;
154 const DynamicRasterCell* m_inputRasterCell;
156 PixelBox m_enlargedPixelBox;
157 PixelBox m_navPixelBox;
160 NavRasterCellScanlinePainter m_painter;
163 KyArrayTLS<DynamicNavRasterFinalColumn> m_finalColumns;
164 GrowingSmallBufferPool m_finalColumnsPool;
166 KyArrayTLS<DynamicNavRasterWorkingColumn> m_workingColumns;
167 GrowingSmallBufferPool m_workingColumnsPool;
170 bool m_hasMultipleNavTags;
175 friend class DynamicNavRasterCellBlobBuilder;
178 KY_INLINE
void NavRasterNeighborPixel::Clear()
181 m_connectionType = NavRasterConnectionType_NO_TAG;
182 m_floorIdxOfNeighbor = NavRasterFloorIdx_Invalid;
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; }
189 KY_INLINE DynamicNavRasterFinalColumn DynamicNavRasterCell::GetFinalColumnFromLocalPixelPos(
const PixelPos& localPixelPos)
const
191 const KyInt32 idx = m_navPixelBox.GetRowMajorIndexFromLocalPos(localPixelPos);
192 return m_finalColumns[idx];
195 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingNeighborPixel(
const NavRasterWorkingPixel& pixel, NavRasterCardinalDir dir)
const
197 return dir < 4 ? pixel.GethNeighborPixelPtr(dir) : GetWorkingDiagonalNeighbor(pixel, dir);
200 KY_INLINE NavRasterWorkingPixel* DynamicNavRasterCell::GetWorkingDiagonalNeighbor(
const NavRasterWorkingPixel& pos, NavRasterCardinalDir dir)
const
202 KY_ASSERT(dir >= 4 && dir < 8);
206 case NavRasterCardinalDir_NORTH_EAST:
208 case NavRasterCardinalDir_NORTH_WEST:
210 case NavRasterCardinalDir_SOUTH_WEST:
212 case NavRasterCardinalDir_SOUTH_EAST:
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