19 class DynamicNavRasterCell;
21 class NavRasterWorkingPixel;
22 class DynamicNavRasterFinalColumn;
24 class NavRasterCellScanlinePainter
33 ScanPixel(NavRasterPixel* navPixel,
const PixelPos& pos,
KyUInt32 floor) : m_navPixel(navPixel), m_pos(pos), m_floorIdx(floor) {}
42 PixelColor GetFloorColor()
const {
return m_navPixel->m_floorColor; }
43 void SetFloorColor(PixelColor color) { m_navPixel->m_floorColor = color; }
45 PixelColor GetConnectedComponentIdx()
const {
return m_navPixel->m_connectedComponentIdx; }
46 void SetConnectedComponentIdx(
KyUInt32 idx) { m_navPixel->m_connectedComponentIdx = idx; }
49 bool IsConnectedWith(
CardinalDir dir,
const ScanPixel& neighbor) {
return m_navPixel->GetNeighborFloorIndex(dir) == neighbor.m_floorIdx; }
52 NavRasterPixel* m_navPixel;
61 : m_color(color), m_pixelCount(0), m_connectedComponentIdx(connectedComponentIdx), m_boundaryPixelBorderCount(0), m_indexInBinaryHeap(BinaryHeapInvalidReference)
64 void UpdateColorDataFromNewPixel(NavRasterPixel* pixel,
const PixelPos& pos);
73 FloorAltitudeRange m_altRange;
77 NavRasterCellScanlinePainter() : m_navRaster(nullptr), m_paintingMs(nullptr) {}
82 void SetNavRasterCell(DynamicNavRasterCell* cell) { m_navRaster = cell; }
83 void SetConnexIdxToNavTagIdxArray(KyArrayTLS_POD<KyUInt32>* connexIdxToNavTagIdxArray) { m_connexIdxToNavTagIdxArray = connexIdxToNavTagIdxArray; }
84 void SetPaintingMs(
KyFloat32* paintingMs) { m_paintingMs = paintingMs; }
86 KyUInt32 GetNbColorsUsed()
const {
return m_colorCount; }
90 void RemoveSmallNavTagArea();
91 void ComputeConnectedComponents();
92 void ComputeFloorColors();
93 void MergeFloorColors();
94 void ComputeConnexes();
97 void PropagateInSouthWestBox();
98 void PropagateInSouthEastBox();
99 void PropagateInNorthWestBox();
100 void PropagateInNorthEastBox();
102 void PropagateFromCornerColumn(
const PixelBox& paintBox,
const PixelPos& cornerPos,
CardinalDir expandLineDir,
CardinalDir lineMoveDir);
103 void PropagateFromCornerPixel(
const PixelBox& paintBox,
const ScanPixel& seedPixel,
CardinalDir expandLineDir,
CardinalDir lineMoveDir);
104 PixelBox ComputeLocalPaintBoxForCorner(
const PixelBox& paintBox,
const ScanPixel& corner,
CardinalDir expandLineDir,
CardinalDir lineMoveDir);
106 void PropagateFromBoxBorder(
const PixelBox& paintBox,
const PixelPos& startPos,
CardinalDir expandLineDir,
CardinalDir lineMoveDir);
107 void PropagateFromBorderPixel(
const PixelBox& paintBox,
const ScanPixel& seedPixel,
CardinalDir expandLineDir,
CardinalDir lineMoveDir);
108 PixelBox ComputeLocalPaintBoxForBorder(
const PixelBox& paintBox,
const ScanPixel& seedPixel,
CardinalDir expandLineDir,
CardinalDir lineMoveDir);
110 void DisconnectOutsidePixelsAtBoxBounds(
const PixelBox& paintBox,
const ScanPixel& corner,
CardinalDir dirAlongBorder,
CardinalDir dirToOutside, PixelColor color);
112 void PropagateFromAllRemainingUncoloredPixels();
113 void PropagateFromUncoloredNonBorderPixel(
const ScanPixel& startPixel);
115 void ColorCellBoundaryPixelLineInBox(
const PixelBox& localPaintBox,
const ScanPixel& startPixel, PixelColor color,
CardinalDir expandDir,
CardinalDir borderDir,
116 ScanPixel& lastPixelOnLine);
118 bool TwoNeighborPixelHaveSameColor(
const ScanPixel& pixel1,
const ScanPixel& pixel2,
CardinalDir dir, PixelColor currentColor);
119 bool CanPropagateToPixel(PixelPos& pixelPos,
KyUInt32 currentFloorIdx,
KyUInt32 propagationIdx);
121 void FindLowerConnectedPixel(
const ScanPixel& startPixel, ScanPixel& lowerPixel);
122 void CastPixelUntillBoundary(
const ScanPixel& startScanPixel,
CardinalDir castDir);
124 PixelPos CastCellBoundaryPixel(
const PixelBox& bbox,
const ScanPixel& borderPixel,
CardinalDir borderDir,
CardinalDir outsideDir);
125 void CastPixelCheckingColor(
const ScanPixel& scanLine, PixelColor color,
const PixelBox& bbox,
CardinalDir castdir);
126 void PaintLastPixelCastResultAndOutsideNeighbors(PixelColor color,
CardinalDir borderDir);
128 bool GetNeighbor_InsideNavPixelBox(
const ScanPixel& pixel,
CardinalDir dir, ScanPixel& neighborPixel);
129 bool GetNeighbor(
const PixelBox& box,
const ScanPixel& pixel,
CardinalDir dir, ScanPixel& neighborPixel);
131 PixelColor GetNewFloorColor(
KyUInt32 connectedComponentIdx);
132 void SetFloorColor(
const ScanPixel& pixel, PixelColor color);
133 void SetOutsideFloorColor(
const ScanPixel& pixel, PixelColor color);
135 bool CanSetColorToPixel(
const PixelPos& pixelPos,
KyUInt32 floorIdx, PixelColor newColor);
137 bool CanPaintNeighborLine(
const ScanPixel& startScanPixel,
const ScanPixel& endScanPixel, PixelColor color,
const PixelBox& bbox,
CardinalDir lineDir,
CardinalDir expandDir,
138 ScanPixel& borderLineStartScanPixel, ScanPixel& borderLineEndScanPixel,
KyUInt32& neighborLineCount,
KyFloat32& altRangeDiffWithNeighborLine);
140 void DetectForbiddenColorMergeAndConnectedColors();
141 void ComputeMergedColors();
142 void ApplyFinalColorToPixels();
144 struct ScanPixelSorterByAlt
146 bool operator()(
const ScanPixel& pixel1,
const ScanPixel& pixel2)
const {
return pixel1.m_navPixel->m_altitude < pixel2.m_navPixel->m_altitude; }
149 void ChangeNavTagOfSmallNavTagConnectedComponent(
const PixelBox& safenavTagRemovalBox,
const ScanPixel& startPixel,
KyUInt32 connectedComponentIdx,
KyUInt32 minPixelCount);
150 void PropagateConnectedComponent(
const ScanPixel& startPixel,
KyUInt32 connectedComponentIdx);
152 void PropagateConnex_FromColumn(
const Box2i& box,
const PixelPos& pos,
KyUInt32& connexIdx);
153 void PropagateConnex_FromPixel(
const Box2i& box,
const ScanPixel& startPixel,
KyUInt32 connexIdx);
155 bool IsOutsideBorder(
const ScanPixel& pixel);
158 DynamicNavRasterCell* m_navRaster;
159 PixelBox m_navPixelBox;
160 PixelBox m_exclusivePixelBox;
163 KyArrayTLS<ScanPixel> m_propagationStack;
164 KyArrayTLS_POD<ScanPixel> m_navTagArea;
165 KyArrayTLS_POD<ScanPixel> m_navTagAreaNeighbors;
166 KyArrayTLS<ColorData> m_colorData;
168 BitFieldTLS m_forbiddenColorMerge;
169 BitFieldTLS m_connectedColors;
170 KyArrayTLS_POD<PixelColor> m_finalColor;
172 KyArrayTLS<ScanPixel> m_castForwardResult;
173 KyArrayTLS<ScanPixel> m_castBackwardResult;
174 KyArrayTLS<ScanPixel> m_onePixelPerFinalColor;
176 BinaryHeapTls<ScanPixel, ScanPixelSorterByAlt> m_orderedPixels;
177 KyArrayTLS_POD<KyUInt32>* m_connexIdxToNavTagIdxArray;
183 inline PixelColor NavRasterCellScanlinePainter::GetNewFloorColor(
KyUInt32 connectedComponentIdx)
185 PixelColor color = m_colorData.GetCount();
186 m_colorData.PushBack(ColorData(color, connectedComponentIdx));
190 inline void NavRasterCellScanlinePainter::SetFloorColor(
const ScanPixel& pixel, PixelColor color)
192 KY_ASSERT(pixel.m_navPixel !=
nullptr);
193 KY_ASSERT(pixel.m_navPixel->m_floorColor == PixelColor_Unset);
194 KY_ASSERT(color < m_colorData.GetCount());
195 KY_ASSERT(m_navPixelBox.DoesContain(pixel.m_pos));
197 pixel.m_navPixel->m_floorColor = color;
198 m_colorData[color].UpdateColorDataFromNewPixel(pixel.m_navPixel, pixel.m_pos);
201 inline void NavRasterCellScanlinePainter::SetOutsideFloorColor(
const ScanPixel& pixel, PixelColor color)
203 KY_ASSERT(pixel.m_navPixel !=
nullptr);
204 KY_ASSERT(IsOutsideBorder(pixel));
206 pixel.m_navPixel->m_floorColor = color;
211 inline void NavRasterCellScanlinePainter::ColorData::UpdateColorDataFromNewPixel(NavRasterPixel* currentPixel,
const PixelPos& pos)
213 KY_LOG_ERROR_IF(currentPixel->m_floorColor != m_color, (
"Wrong color data for this pixel"));
215 m_altRange.Update(currentPixel->m_altitude);
216 m_box.ExpandByPos(pos);
219 if (currentPixel->m_neighborFloorIdx[i] == NavRasterFloorIdx_Invalid)
220 ++m_boundaryPixelBorderCount;
224 inline bool NavRasterCellScanlinePainter::IsOutsideBorder(
const ScanPixel& pixel)
226 return !m_exclusivePixelBox.DoesContain(pixel.m_pos) && m_navPixelBox.DoesContain(pixel.m_pos);
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 KyInt32MAXVAL
KyInt32 max value
Definition: types.h:60
Navigation return code class.
Definition: types.h:108
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68
float KyFloat32
float
Definition: types.h:32