18 #include "precompiled.h"
28 std::vector<STerritoryBoundary> boundaries;
42 const u8 TILE_BOTTOM = 0;
43 const u8 TILE_RIGHT = 1;
44 const u8 TILE_TOP = 2;
45 const u8 TILE_LEFT = 3;
47 const int CURVE_CW = -1;
48 const int CURVE_CCW = 1;
88 for (
u16 j = 0; j < grid.
m_H; ++j)
90 for (
u16 i = 0; i < grid.
m_W; ++i)
94 u8 tileState = grid.
get(i, j);
95 u8 tileDiscr = (tileState & TERRITORY_DISCR_MASK);
102 bool tileEligible = (j == 0 || tileDiscr != (grid.
get(i, j-1) & TERRITORY_DISCR_MASK));
104 if (tileProcessed || !tileEligible)
116 std::vector<CVector2D>& points = boundaries.back().points;
118 u8 dir = TILE_BOTTOM;
141 if (ci < maxi && cj > 0 && (grid.
get(ci+1, cj-1) & TERRITORY_DISCR_MASK) == tileDiscr)
146 curvature += CURVE_CW;
148 else if (ci < maxi && (grid.
get(ci+1, cj) & TERRITORY_DISCR_MASK) == tileDiscr)
153 curvature += CURVE_CCW;
158 if (ci < maxi && cj < maxj && (grid.
get(ci+1, cj+1) & TERRITORY_DISCR_MASK) == tileDiscr)
163 curvature += CURVE_CW;
165 else if (cj < maxj && (grid.
get(ci, cj+1) & TERRITORY_DISCR_MASK) == tileDiscr)
170 curvature += CURVE_CCW;
175 if (ci > 0 && cj < maxj && (grid.
get(ci-1, cj+1) & TERRITORY_DISCR_MASK) == tileDiscr)
180 curvature += CURVE_CW;
182 else if (ci > 0 && (grid.
get(ci-1, cj) & TERRITORY_DISCR_MASK) == tileDiscr)
187 curvature += CURVE_CCW;
192 if (ci > 0 && cj > 0 && (grid.
get(ci-1, cj-1) & TERRITORY_DISCR_MASK) == tileDiscr)
197 curvature += CURVE_CW;
199 else if (cj > 0 && (grid.
get(ci, cj-1) & TERRITORY_DISCR_MASK) == tileDiscr)
204 curvature += CURVE_CCW;
210 if (ci == i && cj == j && cdir == dir)
214 ENSURE(curvature != 0 && abs(curvature) % 4 == 0);
const ssize_t TERRAIN_TILE_SIZE
metres [world space units] per tile in x and z
#define ENSURE(expr)
ensure the expression <expr> evaluates to non-zero.
static const int TERRITORY_CONNECTED_MASK
static const int TERRITORY_PLAYER_MASK
Describes an outline of a territory, where the latter are understood to mean the largest sets of mutu...
T & get(int i, int j) const
static const int TERRITORY_PROCESSED_MASK
static std::vector< STerritoryBoundary > ComputeBoundaries(const Grid< u8 > *territories)
Computes and returns all territory boundaries on the provided territory map (see STerritoryBoundary f...
void set(int i, int j, const T &value)