mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Skip non-water water region patches in neigbor search
parent
360fe8b0b6
commit
8a1cea2ab6
|
@ -22,7 +22,6 @@
|
||||||
|
|
||||||
using TWaterRegionTraversabilityBits = uint16_t;
|
using TWaterRegionTraversabilityBits = uint16_t;
|
||||||
constexpr TWaterRegionPatchLabel FIRST_REGION_LABEL = 1;
|
constexpr TWaterRegionPatchLabel FIRST_REGION_LABEL = 1;
|
||||||
constexpr TWaterRegionPatchLabel INVALID_WATER_REGION_PATCH = 0;
|
|
||||||
|
|
||||||
static_assert(sizeof(TWaterRegionTraversabilityBits) * 8 == WATER_REGION_EDGE_LENGTH);
|
static_assert(sizeof(TWaterRegionTraversabilityBits) * 8 == WATER_REGION_EDGE_LENGTH);
|
||||||
static_assert(sizeof(TWaterRegionPatchLabel) == sizeof(byte)); // Important for the hash calculation.
|
static_assert(sizeof(TWaterRegionPatchLabel) == sizeof(byte)); // Important for the hash calculation.
|
||||||
|
@ -321,6 +320,8 @@ void InvalidateWaterRegion(TileIndex tile)
|
||||||
*/
|
*/
|
||||||
static inline void VisitAdjacentWaterRegionPatchNeighbors(const WaterRegionPatchDesc &water_region_patch, DiagDirection side, TVisitWaterRegionPatchCallBack &func)
|
static inline void VisitAdjacentWaterRegionPatchNeighbors(const WaterRegionPatchDesc &water_region_patch, DiagDirection side, TVisitWaterRegionPatchCallBack &func)
|
||||||
{
|
{
|
||||||
|
if (water_region_patch.label == INVALID_WATER_REGION_PATCH) return;
|
||||||
|
|
||||||
const WaterRegion ¤t_region = GetUpdatedWaterRegion(water_region_patch.x, water_region_patch.y);
|
const WaterRegion ¤t_region = GetUpdatedWaterRegion(water_region_patch.x, water_region_patch.y);
|
||||||
|
|
||||||
const TileIndexDiffC offset = TileIndexDiffCByDiagDir(side);
|
const TileIndexDiffC offset = TileIndexDiffCByDiagDir(side);
|
||||||
|
@ -354,6 +355,7 @@ static inline void VisitAdjacentWaterRegionPatchNeighbors(const WaterRegionPatch
|
||||||
|
|
||||||
const TileIndex neighbor_edge_tile = GetEdgeTileCoordinate(nx, ny, opposite_side, x_or_y);
|
const TileIndex neighbor_edge_tile = GetEdgeTileCoordinate(nx, ny, opposite_side, x_or_y);
|
||||||
const TWaterRegionPatchLabel neighbor_label = neighboring_region.GetLabel(neighbor_edge_tile);
|
const TWaterRegionPatchLabel neighbor_label = neighboring_region.GetLabel(neighbor_edge_tile);
|
||||||
|
assert(neighbor_label != INVALID_WATER_REGION_PATCH);
|
||||||
if (std::find(unique_labels.begin(), unique_labels.end(), neighbor_label) == unique_labels.end()) unique_labels.push_back(neighbor_label);
|
if (std::find(unique_labels.begin(), unique_labels.end(), neighbor_label) == unique_labels.end()) unique_labels.push_back(neighbor_label);
|
||||||
}
|
}
|
||||||
for (TWaterRegionPatchLabel unique_label : unique_labels) func(WaterRegionPatchDesc{ nx, ny, unique_label });
|
for (TWaterRegionPatchLabel unique_label : unique_labels) func(WaterRegionPatchDesc{ nx, ny, unique_label });
|
||||||
|
@ -367,6 +369,8 @@ static inline void VisitAdjacentWaterRegionPatchNeighbors(const WaterRegionPatch
|
||||||
*/
|
*/
|
||||||
void VisitWaterRegionPatchNeighbors(const WaterRegionPatchDesc &water_region_patch, TVisitWaterRegionPatchCallBack &callback)
|
void VisitWaterRegionPatchNeighbors(const WaterRegionPatchDesc &water_region_patch, TVisitWaterRegionPatchCallBack &callback)
|
||||||
{
|
{
|
||||||
|
if (water_region_patch.label == INVALID_WATER_REGION_PATCH) return;
|
||||||
|
|
||||||
const WaterRegion ¤t_region = GetUpdatedWaterRegion(water_region_patch.x, water_region_patch.y);
|
const WaterRegion ¤t_region = GetUpdatedWaterRegion(water_region_patch.x, water_region_patch.y);
|
||||||
|
|
||||||
/* Visit adjacent water region patches in each cardinal direction */
|
/* Visit adjacent water region patches in each cardinal direction */
|
||||||
|
|
|
@ -18,6 +18,7 @@ using TWaterRegionIndex = uint;
|
||||||
|
|
||||||
constexpr int WATER_REGION_EDGE_LENGTH = 16;
|
constexpr int WATER_REGION_EDGE_LENGTH = 16;
|
||||||
constexpr int WATER_REGION_NUMBER_OF_TILES = WATER_REGION_EDGE_LENGTH * WATER_REGION_EDGE_LENGTH;
|
constexpr int WATER_REGION_NUMBER_OF_TILES = WATER_REGION_EDGE_LENGTH * WATER_REGION_EDGE_LENGTH;
|
||||||
|
constexpr TWaterRegionPatchLabel INVALID_WATER_REGION_PATCH = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Describes a single interconnected patch of water within a particular water region.
|
* Describes a single interconnected patch of water within a particular water region.
|
||||||
|
|
|
@ -102,6 +102,7 @@ private:
|
||||||
public:
|
public:
|
||||||
void AddOrigin(const WaterRegionPatchDesc &water_region_patch)
|
void AddOrigin(const WaterRegionPatchDesc &water_region_patch)
|
||||||
{
|
{
|
||||||
|
if (water_region_patch.label == INVALID_WATER_REGION_PATCH) return;
|
||||||
if (!HasOrigin(water_region_patch)) m_origin_keys.push_back(CYapfRegionPatchNodeKey{ water_region_patch });
|
if (!HasOrigin(water_region_patch)) m_origin_keys.push_back(CYapfRegionPatchNodeKey{ water_region_patch });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue