|
|
|
@ -2419,27 +2419,57 @@ void ViewportDrawPlans(const Viewport *vp)
|
|
|
|
|
DrawPixelInfo *old_dpi = _cur_dpi;
|
|
|
|
|
_cur_dpi = &_dpi_for_text;
|
|
|
|
|
|
|
|
|
|
for (Plan *p : Plan::Iterate()) {
|
|
|
|
|
if (!p->IsVisible()) continue;
|
|
|
|
|
for (PlanLineVector::iterator it = p->lines.begin(); it != p->lines.end(); it++) {
|
|
|
|
|
PlanLine *pl = *it;
|
|
|
|
|
if (!pl->visible) continue;
|
|
|
|
|
for (uint i = 1; i < pl->tiles.size(); i++) {
|
|
|
|
|
const TileIndex from_tile = pl->tiles[i-1];
|
|
|
|
|
const Point from_pt = RemapCoords2(TileX(from_tile) * TILE_SIZE + TILE_SIZE / 2, TileY(from_tile) * TILE_SIZE + TILE_SIZE / 2);
|
|
|
|
|
const int from_x = UnScaleByZoom(from_pt.x, vp->zoom);
|
|
|
|
|
const int from_y = UnScaleByZoom(from_pt.y, vp->zoom);
|
|
|
|
|
if (Plan::GetNumItems() != 0) {
|
|
|
|
|
const Rect bounds = {
|
|
|
|
|
ScaleByZoom(_dpi_for_text.left - 2, vp->zoom),
|
|
|
|
|
ScaleByZoom(_dpi_for_text.top - 2, vp->zoom),
|
|
|
|
|
ScaleByZoom(_dpi_for_text.left + _dpi_for_text.width + 2, vp->zoom),
|
|
|
|
|
ScaleByZoom(_dpi_for_text.top + _dpi_for_text.height + 2, vp->zoom) + (int)(ZOOM_LVL_BASE * TILE_HEIGHT * _settings_game.construction.max_heightlevel)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const TileIndex to_tile = pl->tiles[i];
|
|
|
|
|
const Point to_pt = RemapCoords2(TileX(to_tile) * TILE_SIZE + TILE_SIZE / 2, TileY(to_tile) * TILE_SIZE + TILE_SIZE / 2);
|
|
|
|
|
const int to_x = UnScaleByZoom(to_pt.x, vp->zoom);
|
|
|
|
|
const int to_y = UnScaleByZoom(to_pt.y, vp->zoom);
|
|
|
|
|
const int min_coord_delta = bounds.left / (int)(2 * ZOOM_LVL_BASE * TILE_SIZE);
|
|
|
|
|
const int max_coord_delta = (bounds.right / (int)(2 * ZOOM_LVL_BASE * TILE_SIZE)) + 1;
|
|
|
|
|
|
|
|
|
|
for (Plan *p : Plan::Iterate()) {
|
|
|
|
|
if (!p->IsVisible()) continue;
|
|
|
|
|
for (PlanLineVector::iterator it = p->lines.begin(); it != p->lines.end(); it++) {
|
|
|
|
|
PlanLine *pl = *it;
|
|
|
|
|
if (!pl->visible) continue;
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
bounds.left > pl->viewport_extents.right ||
|
|
|
|
|
bounds.right < pl->viewport_extents.left ||
|
|
|
|
|
bounds.top > pl->viewport_extents.bottom ||
|
|
|
|
|
bounds.bottom < pl->viewport_extents.top
|
|
|
|
|
) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GfxDrawLine(from_x, from_y, to_x, to_y, PC_BLACK, 3);
|
|
|
|
|
if (pl->focused) {
|
|
|
|
|
GfxDrawLine(from_x, from_y, to_x, to_y, PC_RED, 1);
|
|
|
|
|
} else {
|
|
|
|
|
GfxDrawLine(from_x, from_y, to_x, to_y, PC_WHITE, 1);
|
|
|
|
|
TileIndex to_tile = pl->tiles[0];
|
|
|
|
|
int to_coord_delta = (int)TileY(to_tile) - (int)TileX(to_tile);
|
|
|
|
|
for (uint i = 1; i < pl->tiles.size(); i++) {
|
|
|
|
|
const TileIndex from_tile = to_tile;
|
|
|
|
|
const int from_coord_delta = to_coord_delta;
|
|
|
|
|
to_tile = pl->tiles[i];
|
|
|
|
|
to_coord_delta = (int)TileY(to_tile) - (int)TileX(to_tile);
|
|
|
|
|
|
|
|
|
|
if (to_coord_delta < min_coord_delta && from_coord_delta < min_coord_delta) continue;
|
|
|
|
|
if (to_coord_delta > max_coord_delta && from_coord_delta > max_coord_delta) continue;
|
|
|
|
|
|
|
|
|
|
const Point from_pt = RemapCoords2(TileX(from_tile) * TILE_SIZE + TILE_SIZE / 2, TileY(from_tile) * TILE_SIZE + TILE_SIZE / 2);
|
|
|
|
|
const int from_x = UnScaleByZoom(from_pt.x, vp->zoom);
|
|
|
|
|
const int from_y = UnScaleByZoom(from_pt.y, vp->zoom);
|
|
|
|
|
|
|
|
|
|
const Point to_pt = RemapCoords2(TileX(to_tile) * TILE_SIZE + TILE_SIZE / 2, TileY(to_tile) * TILE_SIZE + TILE_SIZE / 2);
|
|
|
|
|
const int to_x = UnScaleByZoom(to_pt.x, vp->zoom);
|
|
|
|
|
const int to_y = UnScaleByZoom(to_pt.y, vp->zoom);
|
|
|
|
|
|
|
|
|
|
GfxDrawLine(from_x, from_y, to_x, to_y, PC_BLACK, 3);
|
|
|
|
|
if (pl->focused) {
|
|
|
|
|
GfxDrawLine(from_x, from_y, to_x, to_y, PC_RED, 1);
|
|
|
|
|
} else {
|
|
|
|
|
GfxDrawLine(from_x, from_y, to_x, to_y, PC_WHITE, 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|