OpenTTD Source
1.11.0-beta2
|
Go to the documentation of this file.
83 #include "viewport_kdtree.h"
92 #include <forward_list>
96 #include "table/strings.h"
101 Point _tile_fract_coords;
105 static int _viewport_sign_maxwidth = 0;
157 typedef std::vector<TileSpriteToDraw> TileSpriteToDrawVector;
158 typedef std::vector<StringSpriteToDraw> StringSpriteToDrawVector;
159 typedef std::vector<ParentSpriteToDraw> ParentSpriteToDrawVector;
160 typedef std::vector<ChildScreenSpriteToDraw> ChildScreenSpriteToDrawVector;
166 StringSpriteToDrawVector string_sprites_to_draw;
167 TileSpriteToDrawVector tile_sprites_to_draw;
168 ParentSpriteToDrawVector parent_sprites_to_draw;
170 ChildScreenSpriteToDrawVector child_screen_sprites_to_draw;
188 bool _draw_bounding_boxes =
false;
189 bool _draw_dirty_blocks =
false;
190 uint _dirty_block_colour = 0;
193 static Point MapXYZToViewport(
const Viewport *vp,
int x,
int y,
int z)
201 void DeleteWindowViewport(
Window *w)
223 int width,
int height, uint32 follow_flags,
ZoomLevel zoom)
241 if (follow_flags & 0x80000000) {
252 pt = MapXYZToViewport(vp, x, y, GetSlopePixelZ(x, y));
260 vp->overlay =
nullptr;
267 static Point _vp_move_offs;
269 static void DoSetViewportPosition(
const Window *w,
int left,
int top,
int width,
int height)
272 if (left + width > w->
left &&
274 top + height > w->
top &&
277 if (left < w->left) {
278 DoSetViewportPosition(w, left, top, w->
left - left, height);
279 DoSetViewportPosition(w, left + (w->
left - left), top, width - (w->
left - left), height);
284 DoSetViewportPosition(w, left, top, (w->
left + w->
width - left), height);
285 DoSetViewportPosition(w, left + (w->
left + w->
width - left), top, width - (w->
left + w->
width - left), height);
290 DoSetViewportPosition(w, left, top, width, (w->
top - top));
291 DoSetViewportPosition(w, left, top + (w->
top - top), width, height - (w->
top - top));
296 DoSetViewportPosition(w, left, top, width, (w->
top + w->
height - top));
297 DoSetViewportPosition(w, left, top + (w->
top + w->
height - top), width, height - (w->
top + w->
height - top));
306 int xo = _vp_move_offs.x;
307 int yo = _vp_move_offs.y;
309 if (
abs(xo) >= width ||
abs(yo) >= height) {
315 GfxScroll(left, top, width, height, xo, yo);
334 static void SetViewportPosition(
Window *w,
int x,
int y)
340 int left, top, width, height;
356 if (old_top == 0 && old_left == 0)
return;
358 _vp_move_offs.x = old_left;
359 _vp_move_offs.y = old_top;
371 i = left + width - _screen.width;
372 if (i >= 0) width -= i;
380 i = top + height - _screen.height;
381 if (i >= 0) height -= i;
383 if (height > 0) DoSetViewportPosition(w->
z_front, left, top, width, height);
422 Point pt = { -1, -1 };
434 static Point GetTileFromScreenXY(
int x,
int y,
int zoom_x,
int zoom_y)
448 Point GetTileBelowCursor()
450 return GetTileFromScreenXY(_cursor.
pos.x, _cursor.
pos.y, _cursor.
pos.x, _cursor.
pos.y);
460 x = ((_cursor.
pos.x - vp->
left) >> 1) + (vp->
width >> 2);
461 y = ((_cursor.
pos.y - vp->
top) >> 1) + (vp->
height >> 2);
467 return GetTileFromScreenXY(_cursor.
pos.x, _cursor.
pos.y, x + vp->
left, y + vp->
top);
508 ts.
x = pt.x + extra_offs_x;
509 ts.
y = pt.y + extra_offs_y;
526 assert(
IsInsideMM(foundation_part, 0, FOUNDATION_PART_END));
527 assert(_vd.
foundation[foundation_part] != -1);
531 int *old_child = _vd.last_child;
534 AddChildSpriteScreen(image, pal, offs.x + extra_offs_x, offs.y + extra_offs_y,
false, sub,
false);
537 _vd.last_child = old_child;
562 AddTileSpriteToDraw(image, pal, _cur_ti->
x + x, _cur_ti->
y + y, _cur_ti->
z + z, sub, extra_offs_x * ZOOM_LVL_BASE, extra_offs_y * ZOOM_LVL_BASE);
598 default: NOT_REACHED();
625 if (pt.x + spr->
x_offs >= _vd.dpi.left + _vd.dpi.width ||
627 pt.y + spr->
y_offs >= _vd.dpi.top + _vd.dpi.height ||
660 void AddSortableSpriteToDraw(
SpriteID image,
PaletteID pal,
int x,
int y,
int w,
int h,
int dz,
int z,
bool transparent,
int bb_offset_x,
int bb_offset_y,
int bb_offset_z,
const SubSprite *sub)
662 int32 left, right, top, bottom;
677 _vd.last_child =
nullptr;
680 int tmp_left, tmp_top, tmp_x = pt.x, tmp_y = pt.y;
683 if (image == SPR_EMPTY_BOUNDING_BOX) {
684 left = tmp_left =
RemapCoords(x + w , y + bb_offset_y, z + bb_offset_z).x;
685 right =
RemapCoords(x + bb_offset_x, y + h , z + bb_offset_z).x + 1;
686 top = tmp_top =
RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz ).y;
687 bottom =
RemapCoords(x + w , y + h , z + bb_offset_z).y + 1;
690 left = tmp_left = (pt.x += spr->
x_offs);
691 right = (pt.x + spr->
width );
692 top = tmp_top = (pt.y += spr->
y_offs);
693 bottom = (pt.y + spr->
height);
696 if (_draw_bounding_boxes && (image != SPR_EMPTY_BOUNDING_BOX)) {
698 left = std::min(left ,
RemapCoords(x + w , y + bb_offset_y, z + bb_offset_z).x);
699 right = std::max(right ,
RemapCoords(x + bb_offset_x, y + h , z + bb_offset_z).x + 1);
700 top = std::min(top ,
RemapCoords(x + bb_offset_x, y + bb_offset_y, z + dz ).y);
701 bottom = std::max(bottom,
RemapCoords(x + w , y + h , z + bb_offset_z).y + 1);
705 if (left >= _vd.dpi.left + _vd.dpi.width ||
706 right <= _vd.dpi.left ||
707 top >= _vd.dpi.top + _vd.dpi.height ||
708 bottom <= _vd.dpi.top) {
722 ps.
xmin = x + bb_offset_x;
723 ps.
xmax = x + std::max(bb_offset_x, w) - 1;
725 ps.
ymin = y + bb_offset_y;
726 ps.
ymax = y + std::max(bb_offset_y, h) - 1;
728 ps.
zmin = z + bb_offset_z;
729 ps.
zmax = z + std::max(bb_offset_z, dz) - 1;
783 if (begin > end)
Swap(begin, end);
784 return begin <= check && check <= end;
795 int dist_a = (_thd.
size.x + _thd.
size.y);
796 int dist_b = (_thd.
size.x - _thd.
size.y);
797 int a = ((x - _thd.
pos.x) + (y - _thd.
pos.y));
798 int b = ((x - _thd.
pos.x) - (y - _thd.
pos.y));
819 if (_vd.last_child ==
nullptr)
return;
827 *_vd.last_child = (uint)_vd.child_screen_sprites_to_draw.size();
833 cs.x = scale ? x * ZOOM_LVL_BASE : x;
834 cs.y = scale ? y * ZOOM_LVL_BASE : y;
842 _vd.last_child = &cs.
next;
845 static void AddStringToDraw(
int x,
int y,
StringID string, uint64 params_1, uint64 params_2, Colours colour, uint16 width)
852 ss.params[0] = params_1;
853 ss.params[1] = params_2;
895 SpriteID sel2 = SPR_HALFTILE_SELECTION_FLAT + halftile_corner;
900 sel = SPR_HALFTILE_SELECTION_DOWN;
904 sel += opposite_corner;
911 static bool IsPartOfAutoLine(
int px,
int py)
921 case HT_DIR_HU:
return px == -py || px == -py - 16;
922 case HT_DIR_HL:
return px == -py || px == -py + 16;
923 case HT_DIR_VL:
return px == py || px == py + 16;
924 case HT_DIR_VR:
return px == py || px == py - 16;
957 static const uint _lower_rail[4] = { 5U, 2U, 4U, 3U };
959 if (autorail_type != _lower_rail[halftile_corner]) {
966 offset = _AutorailTilehSprite[autorail_tileh][autorail_type];
968 image = SPR_AUTORAIL_BASE + offset;
971 image = SPR_AUTORAIL_BASE - offset;
978 enum TileHighlightType {
1003 TileHighlightType type = THT_RED;
1006 if (st->TileIsInCatchment(t))
return THT_BLUE;
1030 case THT_NONE:
break;
1045 if (_town_local_authority_kdtree.
Count() == 0)
return;
1111 if ((halftile_corner == CORNER_W) || (halftile_corner == CORNER_E)) z +=
TILE_HEIGHT;
1112 if (halftile_corner != CORNER_S) {
1123 }
else if (IsPartOfAutoLine(ti->
x, ti->
y)) {
1141 if (!is_redsq && (tht == THT_NONE || tht == THT_RED) && _thd.
outersize.x > 0 &&
1167 assert(_vd.dpi.top <= _vd.dpi.top + _vd.dpi.height);
1168 assert(_vd.dpi.left <= _vd.dpi.left + _vd.dpi.width);
1186 int left_column = (upper_left.y - upper_left.x) / (
int)
TILE_SIZE - 2;
1187 int right_column = (upper_right.y - upper_right.x) / (
int)
TILE_SIZE + 2;
1195 int row = (upper_left.x + upper_left.y) / (
int)
TILE_SIZE - 2;
1196 bool last_row =
false;
1197 for (; !last_row; row++) {
1199 for (
int column = left_column; column <= right_column; column++) {
1201 if ((row + column) % 2 != 0)
continue;
1204 tilecoord.x = (row - column) / 2;
1205 tilecoord.y = (row + column) / 2;
1206 assert(column == tilecoord.y - tilecoord.x);
1207 assert(row == tilecoord.y + tilecoord.x);
1211 _cur_ti = &tile_info;
1217 tile_info.
tile =
TileXY(tilecoord.x, tilecoord.y);
1241 int min_visible_height = viewport_y - (_vd.dpi.top + _vd.dpi.height);
1242 bool tile_visible = min_visible_height <= 0;
1261 if ((tilecoord.x <= 0 || tilecoord.y <= 0) && min_visible_height < potential_bridge_height +
MAX_TILE_EXTENT_TOP) last_row =
false;
1291 bool small = dpi->zoom >= small_from;
1293 int left = dpi->left;
1295 int right = left + dpi->width;
1296 int bottom = top + dpi->height;
1301 if (bottom < sign->top ||
1302 top > sign->
top + sign_height ||
1303 right < sign->center - sign_half_width ||
1304 left > sign->
center + sign_half_width) {
1309 AddStringToDraw(sign->
center - sign_half_width, sign->
top, string_normal, params_1, params_2, colour, sign->
width_normal);
1311 int shadow_offset = 0;
1312 if (string_small_shadow != STR_NULL) {
1314 AddStringToDraw(sign->
center - sign_half_width + shadow_offset, sign->
top, string_small_shadow, params_1, params_2, INVALID_COLOUR, sign->
width_small);
1316 AddStringToDraw(sign->
center - sign_half_width, sign->
top - shadow_offset, string_small, params_1, params_2,
1325 const int max_tw = _viewport_sign_maxwidth / 2 + 1;
1330 r.right += expand_x;
1332 r.bottom += expand_y;
1339 Rect search_rect{ dpi->left, dpi->top, dpi->left + dpi->width, dpi->top + dpi->height };
1340 search_rect = ExpandRectWithViewportSignMargins(search_rect, dpi->zoom);
1352 std::vector<const BaseStation *> stations;
1353 std::vector<const Town *> towns;
1354 std::vector<const Sign *> signs;
1357 switch (item.type) {
1358 case ViewportSignKdtreeItem::VKI_STATION:
1359 if (!show_stations) break;
1360 st = BaseStation::Get(item.id.station);
1363 if (!show_competitors && _local_company != st->owner && st->owner != OWNER_NONE) break;
1365 stations.push_back(st);
1368 case ViewportSignKdtreeItem::VKI_WAYPOINT:
1369 if (!show_waypoints) break;
1370 st = BaseStation::Get(item.id.station);
1373 if (!show_competitors && _local_company != st->owner && st->owner != OWNER_NONE) break;
1375 stations.push_back(st);
1378 case ViewportSignKdtreeItem::VKI_TOWN:
1379 if (!show_towns) break;
1380 towns.push_back(Town::Get(item.id.town));
1383 case ViewportSignKdtreeItem::VKI_SIGN:
1384 if (!show_signs) break;
1385 si = Sign::Get(item.id.sign);
1390 if (!show_competitors && _local_company != si->owner && si->owner != OWNER_DEITY) break;
1392 signs.push_back(si);
1402 for (
const auto *t : towns) {
1405 STR_VIEWPORT_TOWN_TINY_WHITE, STR_VIEWPORT_TOWN_TINY_BLACK,
1406 t->index, t->cache.population);
1409 for (
const auto *si : signs) {
1416 for (
const auto *st : stations) {
1420 STR_VIEWPORT_STATION, STR_VIEWPORT_STATION + 1, STR_NULL,
1425 STR_VIEWPORT_WAYPOINT, STR_VIEWPORT_WAYPOINT + 1, STR_NULL,
1447 GetString(buffer, str,
lastof(buffer));
1452 if (str_small != STR_NULL) {
1453 GetString(buffer, str_small,
lastof(buffer));
1473 zoomlevels[zoom].top = this->top -
ScaleByZoom(1, zoom);
1479 FOR_ALL_WINDOWS_FROM_BACK(w) {
1481 if (vp !=
nullptr && vp->
zoom <= maxzoom) {
1482 assert(vp->
width != 0);
1489 static void ViewportDrawTileSprites(
const TileSpriteToDrawVector *tstdv)
1505 if (psdv->size() < 2)
return;
1514 const uint32 ORDER_COMPARED = UINT32_MAX;
1515 const uint32 ORDER_RETURNED = UINT32_MAX - 1;
1516 std::stack<ParentSpriteToDraw *> sprite_order;
1517 uint32 next_order = 0;
1519 std::forward_list<std::pair<int64, ParentSpriteToDraw *>> sprite_list;
1522 for (
auto p = psdv->rbegin(); p != psdv->rend(); p++) {
1523 sprite_list.push_front(std::make_pair((*p)->xmin + (*p)->ymin, *p));
1524 sprite_order.push(*p);
1525 (*p)->order = next_order++;
1530 std::vector<ParentSpriteToDraw *> preceding;
1531 auto preceding_prev = sprite_list.begin();
1532 auto out = psdv->begin();
1534 while (!sprite_order.empty()) {
1536 auto s = sprite_order.top();
1540 if (s->order == ORDER_RETURNED)
continue;
1543 if (s->order == ORDER_COMPARED) {
1545 s->order = ORDER_RETURNED;
1559 auto ssum = std::max(s->xmax, s->xmin) + std::max(s->ymax, s->ymin);
1560 auto prev = sprite_list.before_begin();
1561 auto x = sprite_list.begin();
1562 while (x != sprite_list.end() && ((*x).first <= ssum)) {
1563 auto p = (*x).second;
1566 x = sprite_list.erase_after(prev);
1573 if (s->xmax < p->xmin || s->ymax < p->ymin || s->zmax < p->zmin)
continue;
1574 if (s->xmin <= p->xmax &&
1575 s->ymin <= p->ymax &&
1576 s->zmin <= p->zmax) {
1577 if (s->xmin + s->xmax + s->ymin + s->ymax + s->zmin + s->zmax <=
1578 p->xmin + p->xmax + p->ymin + p->ymax + p->zmin + p->zmax) {
1582 preceding.push_back(p);
1583 preceding_prev = p_prev;
1586 if (preceding.empty()) {
1589 s->order = ORDER_RETURNED;
1594 if (preceding.size() == 1) {
1595 auto p = preceding[0];
1597 if (p->xmax <= s->xmax && p->ymax <= s->ymax && p->zmax <= s->zmax) {
1598 p->order = ORDER_RETURNED;
1599 s->order = ORDER_RETURNED;
1600 sprite_list.erase_after(preceding_prev);
1609 return a->order > b->order;
1612 s->order = ORDER_COMPARED;
1613 sprite_order.push(s);
1615 for (
auto p: preceding) {
1616 p->order = next_order++;
1617 sprite_order.push(p);
1623 static void ViewportDrawParentSprites(
const ParentSpriteToSortVector *psd,
const ChildScreenSpriteToDrawVector *csstdv)
1626 if (ps->image != SPR_EMPTY_BOUNDING_BOX)
DrawSpriteViewport(ps->image, ps->pal, ps->x, ps->y, ps->sub);
1628 int child_idx = ps->first_child;
1629 while (child_idx >= 0) {
1631 child_idx = cs->
next;
1650 pt2.x - pt1.x, pt2.y - pt1.y,
1651 pt3.x - pt1.x, pt3.y - pt1.y,
1652 pt4.x - pt1.x, pt4.y - pt1.y);
1671 byte bo =
UnScaleByZoom(dpi->left + dpi->top, dpi->zoom) & 1;
1673 for (
int i = (bo ^= 1); i < right; i += 2) blitter->
SetPixel(dst, i, 0, (uint8)colour);
1674 dst = blitter->
MoveTo(dst, 0, 1);
1675 }
while (--bottom > 0);
1678 static void ViewportDrawStrings(
ZoomLevel zoom,
const StringSpriteToDrawVector *sstdv)
1682 bool small =
HasBit(ss.width, 15);
1683 int w =
GB(ss.width, 0, 15);
1691 if (ss.colour != INVALID_COLOUR) {
1704 x, y, x + w, y + h, ss.colour,
1714 void ViewportDoDraw(
const Viewport *vp,
int left,
int top,
int right,
int bottom)
1717 _cur_dpi = &_vd.dpi;
1719 _vd.dpi.zoom = vp->
zoom;
1724 _vd.dpi.width = (right - left) & mask;
1725 _vd.dpi.height = (bottom - top) & mask;
1726 _vd.dpi.left = left & mask;
1727 _vd.dpi.top = top & mask;
1728 _vd.dpi.pitch = old_dpi->pitch;
1729 _vd.last_child =
nullptr;
1739 ViewportAddKdtreeSigns(&_vd.dpi);
1741 DrawTextEffects(&_vd.dpi);
1743 if (_vd.tile_sprites_to_draw.size() != 0) ViewportDrawTileSprites(&_vd.tile_sprites_to_draw);
1745 for (
auto &psd : _vd.parent_sprites_to_draw) {
1766 vp->overlay->
Draw(&dp);
1769 if (_vd.string_sprites_to_draw.size() != 0) {
1773 ViewportDrawStrings(zoom, &_vd.string_sprites_to_draw);
1778 _vd.string_sprites_to_draw.clear();
1779 _vd.tile_sprites_to_draw.clear();
1780 _vd.parent_sprites_to_draw.clear();
1782 _vd.child_screen_sprites_to_draw.clear();
1785 static inline void ViewportDraw(
const Viewport *vp,
int left,
int top,
int right,
int bottom)
1787 if (right <= vp->left || bottom <= vp->top)
return;
1789 if (left >= vp->
left + vp->
width)
return;
1791 if (left < vp->left) left = vp->
left;
1794 if (top >= vp->
top + vp->
height)
return;
1796 if (top < vp->top) top = vp->
top;
1816 dpi->left += this->
left;
1817 dpi->top += this->
top;
1819 ViewportDraw(this->
viewport, dpi->left, dpi->top, dpi->left + dpi->width, dpi->top + dpi->height);
1821 dpi->left -= this->
left;
1822 dpi->top -= this->
top;
1869 SetViewportPosition(w, pt.x, pt.y);
1877 bool update_overlay =
false;
1878 if (delta_x != 0 || delta_y != 0) {
1895 if (update_overlay) RebuildViewportOverlay(w);
1912 right += (1 << vp->
zoom) - 1;
1913 bottom += (1 << vp->
zoom) - 1;
1916 if (right <= 0)
return false;
1919 if (bottom <= 0)
return false;
1953 FOR_ALL_WINDOWS_FROM_BACK(w) {
1955 if (vp !=
nullptr) {
1956 assert(vp->
width != 0);
1964 void ConstrainAllViewportsZoom()
1967 FOR_ALL_WINDOWS_FROM_FRONT(w) {
1968 if (w->
viewport ==
nullptr)
continue;
2004 int x_size = _thd.
size.x;
2005 int y_size = _thd.
size.y;
2008 int x_start = _thd.
pos.x;
2009 int y_start = _thd.
pos.y;
2013 x_start += _thd.
offs.x;
2015 y_start += _thd.
offs.y;
2021 assert(x_size >= 0);
2022 assert(y_size >= 0);
2031 assert((x_end | y_end | x_start | y_start) %
TILE_SIZE == 0);
2052 int top_y = y_start;
2073 static const int OVERLAY_WIDTH = 4 * ZOOM_LVL_BASE;
2079 if (top_x != x_start) {
2086 if (bot_y != y_end) {
2091 }
while (bot_x >= top_x);
2094 int a_size = x_size + y_size, b_size = x_size - y_size;
2099 for (
int a = -interval_a; a != a_size + interval_a; a += interval_a) {
2100 for (
int b = -interval_b; b != b_size + interval_b; b += interval_b) {
2113 void SetSelectionRed(
bool b)
2133 return y >= sign->
top && y < sign->
top + sign_height &&
2134 x >= sign->
center - sign_half_width && x < sign->
center + sign_half_width;
2147 if (_game_mode == GM_MENU)
return false;
2152 Rect search_rect{ x - 1, y - 1, x + 1, y + 1 };
2153 search_rect = ExpandRectWithViewportSignMargins(search_rect, vp->
zoom);
2163 Town *t =
nullptr, *last_t =
nullptr;
2164 Sign *si =
nullptr, *last_si =
nullptr;
2168 switch (item.type) {
2169 case ViewportSignKdtreeItem::VKI_STATION:
2170 if (!show_stations) break;
2171 st = BaseStation::Get(item.id.station);
2172 if (!show_competitors && _local_company != st->owner && st->owner != OWNER_NONE) break;
2173 if (CheckClickOnViewportSign(vp, x, y, &st->sign)) last_st = st;
2176 case ViewportSignKdtreeItem::VKI_WAYPOINT:
2177 if (!show_waypoints) break;
2178 st = BaseStation::Get(item.id.station);
2179 if (!show_competitors && _local_company != st->owner && st->owner != OWNER_NONE) break;
2180 if (CheckClickOnViewportSign(vp, x, y, &st->sign)) last_st = st;
2183 case ViewportSignKdtreeItem::VKI_TOWN:
2184 if (!show_towns) break;
2185 t = Town::Get(item.id.town);
2186 if (CheckClickOnViewportSign(vp, x, y, &t->cache.sign)) last_t = t;
2189 case ViewportSignKdtreeItem::VKI_SIGN:
2190 if (!show_signs) break;
2191 si = Sign::Get(item.id.sign);
2192 if (!show_competitors && _local_company != si->owner && si->owner != OWNER_DEITY) break;
2193 if (CheckClickOnViewportSign(vp, x, y, &si->sign)) last_si = si;
2202 if (last_st !=
nullptr) {
2209 }
else if (last_t !=
nullptr) {
2210 ShowTownViewWindow(last_t->index);
2212 }
else if (last_si !=
nullptr) {
2224 item.type = VKI_STATION;
2225 item.id.station = id;
2233 _viewport_sign_maxwidth = std::max<int>(_viewport_sign_maxwidth, st->
sign.
width_normal);
2241 item.type = VKI_WAYPOINT;
2242 item.id.station = id;
2250 _viewport_sign_maxwidth = std::max<int>(_viewport_sign_maxwidth, st->
sign.
width_normal);
2258 item.type = VKI_TOWN;
2275 item.type = VKI_SIGN;
2280 item.center = sign->sign.
center;
2281 item.top = sign->sign.
top;
2284 _viewport_sign_maxwidth = std::max<int>(_viewport_sign_maxwidth, sign->sign.
width_normal);
2289 void RebuildViewportKdtree()
2292 _viewport_sign_maxwidth = 0;
2294 std::vector<ViewportSignKdtreeItem> items;
2302 if (wp->sign.kdtree_valid) items.push_back(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
2306 if (town->cache.sign.kdtree_valid) items.push_back(ViewportSignKdtreeItem::MakeTown(town->index));
2310 if (sign->sign.kdtree_valid) items.push_back(ViewportSignKdtreeItem::MakeSign(sign->index));
2313 _viewport_sign_kdtree.
Build(items.begin(), items.end());
2317 static bool CheckClickOnLandscape(
const Viewport *vp,
int x,
int y)
2321 if (pt.x != -1)
return ClickTile(
TileVirtXY(pt.x, pt.y));
2325 static void PlaceObject()
2330 pt = GetTileBelowCursor();
2331 if (pt.x == -1)
return;
2346 bool HandleViewportClicked(
const Viewport *vp,
int x,
int y)
2361 bool result = CheckClickOnLandscape(vp, x, y);
2378 void RebuildViewportOverlay(
Window *w)
2380 if (w->
viewport->overlay !=
nullptr &&
2403 z = GetSlopePixelZ(x, y);
2417 RebuildViewportOverlay(w);
2478 void SetTileSelectBigSize(
int ox,
int oy,
int sx,
int sy)
2538 bool new_diagonal =
false;
2550 new_diagonal =
true;
2552 if (x1 >= x2)
Swap(x1, x2);
2553 if (y1 >= y2)
Swap(y1, y2);
2559 if (!new_diagonal) {
2566 Point pt = GetTileBelowCursor();
2598 default: NOT_REACHED();
2646 static void HideMeasurementTooltips()
2697 void VpSetPlaceSizingLimit(
int limit)
2721 HideMeasurementTooltips();
2725 static void VpStartPreSizing()
2737 int fxpy = _tile_fract_coords.x + _tile_fract_coords.y;
2739 int fxmy = _tile_fract_coords.x - _tile_fract_coords.y;
2743 default: NOT_REACHED();
2745 if (fxpy >= 20 && sxpy <= 12)
return HT_DIR_HL;
2746 if (fxmy < -3 && sxmy > 3)
return HT_DIR_VR;
2750 if (fxmy > 3 && sxmy < -3)
return HT_DIR_VL;
2751 if (fxpy <= 12 && sxpy >= 20)
return HT_DIR_HU;
2755 if (fxmy > 3 && sxmy < -3)
return HT_DIR_VL;
2756 if (fxpy >= 20 && sxpy <= 12)
return HT_DIR_HL;
2760 if (fxmy < -3 && sxmy > 3)
return HT_DIR_VR;
2761 if (fxpy <= 12 && sxpy >= 20)
return HT_DIR_HU;
2781 uint start_x =
TileX(start_tile);
2782 uint start_y =
TileY(start_tile);
2783 uint end_x =
TileX(end_tile);
2784 uint end_y =
TileY(end_tile);
2788 case HT_LINE:
return (end_x > start_x || (end_x == start_x && end_y > start_y));
2791 case HT_POINT:
return (end_x != start_x && end_y < start_y);
2792 default: NOT_REACHED();
2818 if (start_tile == end_tile)
return 0;
2819 if (swap)
Swap(start_tile, end_tile);
2830 byte style_t = (byte)(
TileX(end_tile) >
TileX(start_tile));
2845 {1, 0}, {1, 1}, {0, 1}, {1, 1},
2846 {1, 0}, {0, 0}, {1, 0}, {1, 1},
2847 {1, 0}, {1, 1}, {0, 1}, {1, 1},
2849 {0, 1}, {0, 0}, {1, 0}, {0, 0},
2850 {0, 1}, {0, 0}, {1, 1}, {0, 1},
2851 {1, 0}, {0, 0}, {0, 0}, {0, 1},
2861 if (swap && distance == 0) style = flip_style_direction[style];
2864 byte style_t = style * 2;
2865 assert(style_t <
lengthof(heightdiff_line_by_dir) - 13);
2868 h0 = std::max(h0, ht);
2872 if (distance == 0) style_t = flip_style_direction[style] * 2;
2873 assert(style_t <
lengthof(heightdiff_line_by_dir) - 13);
2876 h1 = std::max(h1, ht);
2881 if (swap)
Swap(h0, h1);
2885 static const StringID measure_strings_length[] = {STR_NULL, STR_MEASURE_LENGTH, STR_MEASURE_LENGTH_HEIGHTDIFF};
2895 if (test >= 0)
return;
2897 other += mult * test;
2910 if (test <= max)
return;
2912 other += mult * (test - max);
2955 int offset = (raw_dx - raw_dy) / 2;
2990 int offset = (raw_dx + raw_dy + (int)
TILE_SIZE) / 2;
3039 }
else if (w > h * 2) {
3042 }
else if (h > w * 2) {
3056 }
else if (d >= 0) {
3067 }
else if (d >= 0) {
3080 }
else if (d >= 0) {
3091 }
else if (d >= 0) {
3109 if (distance != 1) {
3115 distance =
CeilDiv(distance, 2);
3118 params[index++] = distance;
3119 if (heightdiff != 0) params[index++] = heightdiff;
3168 if (
abs(sy - y) <
abs(sx - x)) {
3175 goto calc_heightdiff_single_direction;
3184 goto calc_heightdiff_single_direction;
3194 calc_heightdiff_single_direction:;
3196 x = sx +
Clamp(x - sx, -limit, limit);
3197 y = sy +
Clamp(y - sy, -limit, limit);
3206 if (distance != 1) {
3214 params[index++] = distance;
3215 if (heightdiff != 0) params[index++] = heightdiff;
3224 x = sx +
Clamp(x - sx, -limit, limit);
3225 y = sy +
Clamp(y - sy, -limit, limit);
3230 static const StringID measure_strings_area[] = {
3231 STR_NULL, STR_NULL, STR_MEASURE_AREA, STR_MEASURE_AREA_HEIGHTDIFF
3257 int a_max = dist_x + dist_y;
3258 int b_max = dist_y - dist_x;
3262 a_max =
abs(a_max + (a_max > 0 ? 2 : -2)) / 2;
3263 b_max =
abs(b_max + (b_max > 0 ? 2 : -2)) / 2;
3269 if (a_max != 1 || b_max != 1) {
3276 }
else if (dy == 1) {
3281 if (dx != 1 || dy != 1) {
3284 params[index++] = dx - (style &
HT_POINT ? 1 : 0);
3285 params[index++] = dy - (style &
HT_POINT ? 1 : 0);
3286 if (heightdiff != 0) params[index++] = heightdiff;
3293 default: NOT_REACHED();
3345 HideMeasurementTooltips();
3386 HideMeasurementTooltips();
3447 { &ViewportSortParentSpritesSSE41Checker, &ViewportSortParentSpritesSSE41 },
3461 assert(_vp_sprite_sorter !=
nullptr);
3497 static void MarkCatchmentTilesDirty()
3527 MarkCatchmentTilesDirty();
3530 MarkCatchmentTilesDirty();
3532 MarkCatchmentTilesDirty();
@ DO_SHOW_COMPETITOR_SIGNS
Display signs, station names and waypoint names of opponent companies. Buoys and oilrig-stations are ...
@ ES_HANDLED
The passed event is handled.
static Corner OppositeCorner(Corner corner)
Returns the opposite corner.
@ HT_DIR_HL
horizontal lower
@ MP_HOUSE
A house by a town.
static void CalcRaildirsDrawstyle(int x, int y, int method)
while dragging
Data structure for a window viewport.
@ SPRITE_MASK
The mask to for the main sprite.
StationFacility facilities
The facilities that this station has.
void SetTileSelectSize(int w, int h)
Highlight w by h tiles at the cursor.
SpriteID image
sprite to draw
static bool IsCompanyBuildableVehicleType(VehicleType type)
Is the given vehicle type buildable by a company?
Point foundation_offset[FOUNDATION_PART_END]
Pixel offset for ground sprites on the foundations.
int32 x
screen X coordinate of sprite
byte sizelimit
Whether the selection is limited in length, and what the maximum length is.
uint32 TileIndex
The index/ID of a Tile.
#define TILE_ADD(x, y)
Adds to tiles together.
static void DrawAutorailSelection(const TileInfo *ti, uint autorail_type)
Draws autorail highlights.
Point size
Size, in tile "units", of the white/red selection area.
Window * FindWindowFromPt(int x, int y)
Do a search for a window at specific coordinates.
void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3)
Draws the projection of a parallelepiped.
Point outersize
Size, in tile "units", of the blue coverage area excluding the side of the selected area.
@ WC_INVALID
Invalid window.
static void CheckUnderflow(int &test, int &other, int mult)
Check for underflowing the map.
virtual void SetPixel(void *video, int x, int y, uint8 colour)=0
Draw a pixel with a given colour on the video-buffer.
static Titem * Get(size_t index)
Returns Titem with given index.
bool ScrollMainWindowToTile(TileIndex tile, bool instant)
Scrolls the viewport of the main window to a given location.
static const PaletteID PALETTE_SEL_TILE_RED
makes a square red. is used when removing rails or other stuff
@ VPM_FIX_VERTICAL
drag only in vertical direction
static const int MAX_TILE_EXTENT_LEFT
Maximum left extent of tile relative to north corner.
void AddDirtyBlock(int left, int top, int right, int bottom)
Extend the internal _invalid_rect rectangle to contain the rectangle defined by the given parameters.
int32 y
screen Y coordinate of sprite
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
static int UnScaleByZoomLower(int value, ZoomLevel zoom)
Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL)
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
bool ScrollWindowTo(int x, int y, int z, Window *w, bool instant)
Scrolls the viewport in a window to a given location.
EventState VpHandlePlaceSizingDrag()
Handle the mouse while dragging for placement/resizing.
@ ZOOM_OUT
Zoom out (get helicopter view).
static const AnimCursor *const _animcursors[]
This is an array of pointers to all the animated cursor definitions we have above.
int32 zmax
maximal world Z coordinate of bounding box
const TileTypeProcs *const _tile_type_procs[16]
Tile callback functions for each type of tile.
uint x
X position of the tile in unit coordinates.
@ HT_DIR_VR
vertical right
Slope GetTilePixelSlopeOutsideMap(int x, int y, int *h)
Return the slope of a given tile, also for tiles outside the map (virtual "black" tiles).
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
K-dimensional tree, specialised for 2-dimensional space.
Town * ClosestTownFromTile(TileIndex tile, uint threshold)
Return the town closest (in distance or ownership) to a given tile, within a given threshold.
Point offs
Offset, in tile "units", for the blue coverage area from the selected area's northern tile.
SpecialMouseMode _special_mouse_mode
Mode of the mouse.
Tile information, used while rendering the tile.
bool _left_button_down
Is left mouse button pressed?
static const PaletteID PALETTE_TILE_RED_PULSATING
pulsating red tile drawn if you try to build a wrong tunnel or raise/lower land where it is not possi...
ViewportDragDropSelectionProcess
Drag and drop selection process, or, what to do with an area of land when you've selected it.
static bool IsTransparencySet(TransparencyOption to)
Check if the transparency option bit is set and if we aren't in the game menu (there's never transpar...
const SubSprite * sub
only draw a rectangular part of the sprite
@ ZOOM_LVL_END
End for iteration.
How all blitters should look like.
@ ZOOM_LVL_OUT_16X
Zoomed 16 times out.
static uint TilePixelHeight(TileIndex tile)
Returns the height of a tile in pixels.
static void DrawTileHighlightType(const TileInfo *ti, TileHighlightType tht)
Draw tile highlight for coverage area highlight.
int width
Screen width of the viewport.
ViewportPlaceMethod select_method
The method which governs how tiles are selected.
static Point RemapCoords(int x, int y, int z)
Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.
ViewportData * viewport
Pointer to viewport data, if present.
CommandCost CmdScrollViewport(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Scroll players main viewport.
int height
Screen height of the viewport.
Iterator to iterate over all tiles belonging to a bitmaptilearea.
void SetRedErrorSquare(TileIndex tile)
Set a tile to display a red error square.
int32 scrollpos_y
Currently shown y coordinate (virtual screen coordinate of topleft corner of the viewport).
Point new_size
New value for size; used to determine whether to redraw the selection.
Tindex index
Index of this pool item.
bool IsDraggingDiagonal()
Is the user dragging a 'diagonal rectangle'?
void HandleClickOnSign(const Sign *si)
Handle clicking on a sign.
@ VST_EVERYONE
All players.
int top
Screen coordinate top edge of the viewport.
int32 ymin
minimal world Y coordinate of bounding box
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
@ ZOOM_LVL_COUNT
Number of zoom levels.
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
static bool IsHalftileSlope(Slope s)
Checks for non-continuous slope on halftile foundations.
Data structure storing rendering information.
static const PaletteID PALETTE_TO_TRANSPARENT
This sets the sprite to transparent.
@ FOUNDATION_PART_HALFTILE
Second part (halftile foundation)
uint16 height
Height of the sprite.
Representation of a waypoint.
bool _ctrl_pressed
Is Ctrl pressed?
static void AddTileSpriteToDraw(SpriteID image, PaletteID pal, int32 x, int32 y, int z, const SubSprite *sub=nullptr, int extra_offs_x=0, int extra_offs_y=0)
Schedules a tile sprite for drawing.
static Slope RemoveHalftileSlope(Slope s)
Removes a halftile slope from a slope.
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
bool DoZoomInOutWindow(ZoomStateChange how, Window *w)
Zooms a viewport in a window in or out.
int32 center
The center position of the sign.
int16 x_offs
Number of pixels to shift the sprite to the right.
static const uint TILE_SIZE
Tile size in world coordinates.
CargoTypes GetCargoMask()
Get a bitmask of the currently shown cargoes.
ZoomLevel
All zoom levels we know.
static Station * Get(size_t index)
Gets station with given index.
@ VPM_FIX_Y
drag only in Y axis
uint y
Y position of the tile in unit coordinates.
ClientSettings _settings_client
The current settings for this game.
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
TileIndex xy
town center tile
static uint TileY(TileIndex tile)
Get the Y component of a tile.
@ ST_NORMAL
The most basic (normal) sprite.
int32 WindowNumber
Number to differentiate different windows of the same class.
@ WC_STATION_VIEW
Station view; Window numbers:
byte _display_opt
What do we want to draw/do?
int32 top
The top of the sign.
ViewportPlaceMethod
Viewport place method (type of highlighted area and placed objects)
@ SA_HOR_CENTER
Horizontally center the text.
int virtual_top
Virtual top coordinate.
Owner owner
Which company owns the vehicle?
Location information about a sign as seen on the viewport.
Owner
Enum for all companies/owners.
int32 x
screen X coordinate of sprite
@ DC_EXEC
execute the given command
Used to only draw a part of the sprite.
void Build(It begin, It end)
Clear and rebuild the tree from a new sequence of elements,.
@ FR_TRANSPARENT
Makes the background transparent if set.
ZoomLevel zoom_max
maximum zoom out level
DrawTileProc * draw_tile_proc
Called to render the tile and its contents to the screen.
Owner owner
The owner of this station.
byte _colour_gradient[COLOUR_END][8]
All 16 colour gradients 8 colours per gradient from darkest (0) to lightest (7)
static bool MarkViewportDirty(const Viewport *vp, int left, int top, int right, int bottom)
Marks a viewport as dirty for repaint if it displays (a part of) the area the needs to be repainted.
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
bool show_zone
NOSAVE: mark town to show the local authority zone in the viewports.
DoCommandFlag
List of flags for a command.
static TownID GetTownIndex(TileIndex t)
Get the index of which town this house/street is attached to.
int32 xmin
minimal world X coordinate of bounding box
size_t Count() const
Get number of elements stored in tree.
static bool CheckClickOnViewportSign(const Viewport *vp, int x, int y, const ViewportSign *sign)
Test whether a sign is below the mouse.
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
@ ZOOM_LVL_BEGIN
Begin for iteration.
static bool SwapDirection(HighLightStyle style, TileIndex start_tile, TileIndex end_tile)
Check if the direction of start and end tile should be swapped based on the dragging-style.
static uint SlopeToSpriteOffset(Slope s)
Returns the Sprite offset for a given Slope.
@ SPRITE_COMBINE_ACTIVE
Sprite combining is active. AddSortableSpriteToDraw outputs child sprites.
static int CalcHeightdiff(HighLightStyle style, uint distance, TileIndex start_tile, TileIndex end_tile)
Calculates height difference between one tile and another.
static uint TileX(TileIndex tile)
Get the X component of a tile.
@ FOUNDATION_PART_NORMAL
First part (normal foundation or no foundation)
void FindContained(CoordT x1, CoordT y1, CoordT x2, CoordT y2, Outputter outputter) const
Find all items contained within the given rectangle.
virtual void OnPlaceMouseUp(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt, TileIndex start_tile, TileIndex end_tile)
The user has dragged over the map when the tile highlight mode has been set.
Vehicle * CheckClickOnVehicle(const Viewport *vp, int x, int y)
Find the vehicle close to the clicked coordinates.
Metadata about the current highlighting.
static Pool::IterateWrapper< Station > Iterate(size_t from=0)
Returns an iterable ensemble of all valid stations of type T.
@ VPM_RAILDIRS
all rail directions
static bool IsInsideMM(const T x, const size_t min, const size_t max)
Checks if a value is in an interval.
Slope tileh
Slope of the tile.
uint32 SpriteID
The number of a sprite, without mapping bits and colourtables.
static uint MapSizeX()
Get the size of the map along the X.
bool measure_tooltip
show a permanent tooltip when dragging tools
int * last_foundation_child[FOUNDATION_PART_END]
Tail of ChildSprite list of the foundations. (index into child_screen_sprites_to_draw)
VpSorterChecker fct_checker
The check function.
int foundation[FOUNDATION_PART_END]
Foundation sprites (index into parent_sprites_to_draw).
static TileIndexDiff ToTileIndexDiff(TileIndexDiffC tidc)
Return the offset between to tiles from a TileIndexDiffC struct.
Colours _company_colours[MAX_COMPANIES]
NOSAVE: can be determined from company structs.
@ ZOOM_IN
Zoom in (get more detailed view).
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
Data structure for viewport, display of a part of the world.
static const uint TILE_UNIT_MASK
For masking in/out the inner-tile world coordinate units.
TrackedViewportSign sign
NOSAVE: Dimensions of sign.
static const int DRAW_STRING_BUFFER
Size of the buffer used for drawing strings.
static bool IsSteepSlope(Slope s)
Checks if a slope is steep.
bool IsInsideRotatedRectangle(int x, int y)
Checks whether a point is inside the selected a diagonal rectangle given by _thd.size and _thd....
Common return value for all commands.
static Point InverseRemapCoords(int x, int y)
Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.
@ WSM_PRESIZE
Presizing mode (docks, tunnels).
static T Align(const T x, uint n)
Return the smallest multiple of n equal or greater than x.
void GuiShowTooltips(Window *parent, StringID str, uint paramcount, const uint64 params[], TooltipCloseCondition close_tooltip)
Shows a tooltip.
FoundationPart foundation_part
Currently active foundation for ground sprite drawing.
PaletteID pal
palette to use
static uint TileHeight(TileIndex tile)
Returns the height of a tile.
uint32 CursorID
The number of the cursor (sprite)
void UpdateTileSelection()
Updates tile highlighting for all cases.
void StartStopVehicle(const Vehicle *v, bool texteffect)
Executes CMD_START_STOP_VEHICLE for given vehicle.
void SetMouseCursor(CursorID sprite, PaletteID pal)
Assign a single non-animated sprite to the cursor.
@ MAX_SPRITES
Maximum number of sprites that can be loaded at a given time.
static void SetSelectionTilesDirty()
Marks the selected tiles as dirty.
ParentSpriteToSortVector parent_sprites_to_sort
Parent sprite pointer array used for sorting.
@ VPM_FIX_X
drag only in X axis
static void DrawTileSelectionRect(const TileInfo *ti, PaletteID pal)
Draws a selection rectangle on a tile.
int virtual_left
Virtual left coordinate.
void SetObjectToPlace(CursorID icon, PaletteID pal, HighLightStyle mode, WindowClass window_class, WindowNumber window_num)
Change the cursor and mouse click/drag handling to a mode for performing special operations like tile...
WindowNumber window_number
The WindowNumber of the window that is responsible for the selection mode.
int height
Height of the window (number of pixels down in y direction)
static const CursorID ANIMCURSOR_FLAG
Flag for saying a cursor sprite is an animated cursor.
bool VehicleClicked(const Vehicle *v)
Dispatch a "vehicle selected" event if any window waits for it.
#define DEBUG(name, level,...)
Output a line of debugging information.
static const VehicleID INVALID_VEHICLE
Constant representing a non-existing vehicle.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
int left
Screen coordinate left edge of the viewport.
static void AddCombinedSprite(SpriteID image, PaletteID pal, int x, int y, int z, const SubSprite *sub)
Adds a child sprite to a parent sprite.
@ FS_SMALL
Index of the small font in the font tables.
bool ScrollWindowToTile(TileIndex tile, Window *w, bool instant)
Scrolls the viewport in a window to a given location.
@ HT_DIAGONAL
Also allow 'diagonal rectangles'. Only usable in combination with HT_RECT or HT_POINT.
bool population_in_label
show the population of a town in his label?
static bool IsInsideBS(const T x, const size_t base, const size_t size)
Checks if a value is between a window started at some base point.
static bool IsExpected(const BaseStation *st)
Helper for checking whether the given station is of this type.
bool(* VpSorterChecker)()
Type for method for checking whether a viewport sprite sorter exists.
ClientID
'Unique' identifier to be given to clients
const SubSprite * sub
only draw a rectangular part of the sprite
static const uint MAX_BUILDING_PIXELS
Maximum height of a building in pixels in #ZOOM_LVL_BASE. (Also applies to "bridge buildings" on the ...
@ ES_NOT_HANDLED
The passed event is not handled.
StationList stations_near
NOSAVE: List of nearby stations.
Corner
Enumeration of tile corners.
@ HT_RAIL
autorail (one piece), lower bits: direction
static bool IsInvisibilitySet(TransparencyOption to)
Check if the invisibility option bit is set and if we aren't in the game menu (there's never transpar...
byte max_bridge_height
maximum height of bridges
TileIndex GetNorthernBridgeEnd(TileIndex t)
Finds the northern end of a bridge starting at a middle tile.
int next
next child to draw (-1 at the end)
void EndSpriteCombine()
Terminates a block of sprites started by StartSpriteCombine.
static uint TilePixelHeightOutsideMap(int x, int y)
Returns the height of a tile in pixels, also for tiles outside the map (virtual "black" tiles).
static void CheckOverflow(int &test, int &other, int max, int mult)
Check for overflowing the map.
virtual void OnPlaceObject(Point pt, TileIndex tile)
The user clicked some place on the map when a tile highlight mode has been set.
static uint TileHeightOutsideMap(int x, int y)
Returns the height of a tile, also for tiles outside the map (virtual "black" tiles).
static const byte _string_colourmap[17]
Colour mapping for TextColour.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
@ TC_IS_PALETTE_COLOUR
Colour value is already a real palette colour index, not an index of a StringColour.
void MarkDirty(ZoomLevel maxzoom=ZOOM_LVL_MAX) const
Mark the sign dirty in all viewports.
static Blitter * GetCurrentBlitter()
Get the current active blitter (always set by calling SelectBlitter).
uint16 width_small
The width when zoomed out (small font)
static void HighlightTownLocalAuthorityTiles(const TileInfo *ti)
Highlights tiles insede local authority of selected towns.
EconomySettings economy
settings to change the economy
void SetWidgetDisabledState(byte widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
static void ViewportDrawBoundingBoxes(const ParentSpriteToSortVector *psd)
Draws the bounding boxes of all ParentSprites.
@ DO_SHOW_STATION_NAMES
Display station names.
uint16 width_normal
The width when not zoomed out (normal font)
int32 left
minimal screen X coordinate of sprite (= x + sprite->x_offs), reference point for child sprites
int left
x position of left edge of the window
uint16 width
Width of the sprite.
bool make_square_red
Whether to give a tile a red selection.
static bool IsValidTile(TileIndex tile)
Checks if a tile is valid.
int32 zmin
minimal world Z coordinate of bounding box
WindowClass
Window classes.
static int DivAwayFromZero(int a, uint b)
Computes (a / b) rounded away from zero.
void RedrawScreenRect(int left, int top, int right, int bottom)
Repaints a specific rectangle of the screen.
static Slope SlopeWithThreeCornersRaised(Corner corner)
Returns the slope with all except one corner raised.
void StartSpriteCombine()
Starts a block of sprites, which are "combined" into a single bounding box.
static Corner GetHalftileSlopeCorner(Slope s)
Returns the leveled halftile of a halftile slope.
Point pos
Location, in tile "units", of the northern tile of the selected area.
int32 first_child
the first child to draw.
void(* VpSpriteSorter)(ParentSpriteToSortVector *psd)
Type for the actual viewport sprite sorter.
@ SPRITE_COMBINE_NONE
Every AddSortableSpriteToDraw start its own bounding box.
SpriteCombineMode combine_sprites
Current mode of "sprite combining".
Point new_outersize
New value for outersize; used to determine whether to redraw the selection.
int virtual_width
width << zoom
Coordinates of a point in 2D.
bool ScrollMainWindowTo(int x, int y, int z, bool instant)
Scrolls the main window to given coordinates.
int32 dest_scrollpos_y
Current destination y coordinate to display (virtual screen coordinate of topleft corner of the viewp...
Slope
Enumeration for the slope-type.
static uint MapSizeY()
Get the size of the map along the Y.
@ WSM_DRAGDROP
Drag&drop an object.
void OffsetGroundSprite(int x, int y)
Called when a foundation has been drawn for the current tile.
static Waypoint * From(BaseStation *st)
Converts a BaseStation to SpecializedStation with type checking.
@ HT_DIR_MASK
masks the drag-direction
static int UnScaleByZoom(int value, ZoomLevel zoom)
Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) When shifting right,...
@ ZOOM_LVL_DETAIL
All zoomlevels below or equal to this, will result in details on the screen, like road-work,...
void SetAnimatedMouseCursor(const AnimCursor *table)
Assign an animation to the cursor.
void ShowStationViewWindow(StationID station)
Opens StationViewWindow for given station.
const Town * _viewport_highlight_town
Currently selected town for coverage area highlight.
WindowNumber window_number
Window number within the window class.
@ PALETTE_MODIFIER_TRANSPARENT
when a sprite is to be displayed transparently, this bit needs to be set.
void VpStartPlaceSizing(TileIndex tile, ViewportPlaceMethod method, ViewportDragDropSelectionProcess process)
highlighting tiles while only going over them with the mouse
static bool IsTileType(TileIndex tile, TileType type)
Checks if a tile is a given tiletype.
Point InverseRemapCoords2(int x, int y, bool clamp_to_map, bool *clamped)
Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.
static void ViewportAddLandscape()
Add the landscape to the viewport, i.e.
@ HT_VEHICLE
vehicle is accepted as target as well (bitmask)
#define FONT_HEIGHT_SMALL
Height of characters in the small (FS_SMALL) font.
void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int w, int h, int dz, int z, bool transparent, int bb_offset_x, int bb_offset_y, int bb_offset_z, const SubSprite *sub)
Draw a (transparent) sprite at given coordinates with a given bounding box.
@ HT_DRAG
dragging items in the depot windows
static HighLightStyle GetAutorailHT(int x, int y)
returns the best autorail highlight type from map coordinates
ClientID _network_own_client_id
Our client identifier.
bool MarkAllViewportsDirty(int left, int top, int right, int bottom)
Mark all viewports that display an area as dirty (in need of repaint).
A pair-construct of a TileIndexDiff.
int32 ymax
maximal world Y coordinate of bounding box
ZoomLevel zoom_min
minimum zoom out level
byte dirty
Whether the build station window needs to redraw due to the changed selection.
static void ShowMeasurementTooltips(StringID str, uint paramcount, const uint64 params[], TooltipCloseCondition close_cond=TCC_NONE)
Displays the measurement tooltips when selecting multiple tiles.
byte dist_local_authority
distance for town local authority, default 20
HighLightStyle drawstyle
Lower bits 0-3 are reserved for detailed highlight information.
HighLightStyle place_mode
Method which is used to place the selection.
static const int MAX_TILE_EXTENT_BOTTOM
Maximum bottom extent of tile relative to north corner (worst case: SLOPE_STEEP_N).
void ViewportAddString(const DrawPixelInfo *dpi, ZoomLevel small_from, const ViewportSign *sign, StringID string_normal, StringID string_small, StringID string_small_shadow, uint64 params_1, uint64 params_2, Colours colour)
Add a string to draw in the viewport.
void VpStartDragging(ViewportDragDropSelectionProcess process)
Drag over the map while holding the left mouse down.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
int32 scrollpos_x
Currently shown x coordinate (virtual screen coordinate of topleft corner of the viewport).
static void ClampViewportToMap(const Viewport *vp, int *scroll_x, int *scroll_y)
Ensure that a given viewport has a valid scroll position.
Point selstart
The location where the dragging started.
CompanyID _current_company
Company currently doing an action.
static bool IsInRangeInclusive(int begin, int end, int check)
Check if the parameter "check" is inside the interval between begin and end, including both begin and...
@ SLOPE_N
the north corner of the tile is raised
static T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
static const PaletteID PALETTE_CRASH
Recolour sprite greying of crashed vehicles.
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows).
Vehicle * First() const
Get the first vehicle of this vehicle chain.
void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
Delete a window by its class and window number (if it is open).
int32 top
minimal screen Y coordinate of sprite (= y + sprite->y_offs), reference point for child sprites
static int ScaleByZoom(int value, ZoomLevel zoom)
Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) When shifting right,...
static Slope SlopeWithOneCornerRaised(Corner corner)
Returns the slope with a specific corner raised.
static uint MapMaxY()
Gets the maximum Y coordinate within the map, including MP_VOID.
virtual void OnPlaceObjectAbort()
The user cancelled a tile highlight mode that has been set.
@ MP_VOID
Invisible tiles at the SW and SE border.
static void AddChildSpriteToFoundation(SpriteID image, PaletteID pal, const SubSprite *sub, FoundationPart foundation_part, int extra_offs_x, int extra_offs_y)
Adds a child sprite to the active foundation.
static int GetTilePixelZ(TileIndex tile)
Get bottom height of the tile.
virtual void * MoveTo(void *video, int x, int y)=0
Move the destination pointer the requested amount x and y, keeping in mind any pitch and bpp of the r...
static size_t GetNumItems()
Returns number of valid items in the pool.
static TileIndex TileXY(uint x, uint y)
Returns the TileIndex of a coordinate.
@ VPM_Y_LIMITED
Drag only in Y axis with limited size.
bool diagonal
Whether the dragged area is a 45 degrees rotated rectangle.
static void DrawTileSelection(const TileInfo *ti)
Checks if the specified tile is selected and if so draws selection using correct selectionstyle.
TileType
The different types of tiles.
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
@ HT_LINE
used for autorail highlighting (longer stretches), lower bits: direction
void UpdatePosition(int center, int top, StringID str, StringID str_small=STR_NULL)
Update the position of the viewport sign.
static const PaletteID PALETTE_SEL_TILE_BLUE
This draws a blueish square (catchment areas for example)
TileIndex tile
The base tile of the area.
uint32 PaletteID
The number of the palette.
void Draw(const DrawPixelInfo *dpi)
Draw the linkgraph overlay or some part of it, in the area given.
void SetObjectToPlaceWnd(CursorID icon, PaletteID pal, HighLightStyle mode, Window *w)
Change the cursor and mouse click/drag handling to a mode for performing special operations like tile...
int32 y
screen Y coordinate of sprite
static ViewportSSCSS _vp_sprite_sorters[]
List of sorters ordered from best to worst.
@ WC_TOOLTIPS
Tooltip window; Window numbers:
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
static int GetViewportY(Point tile)
Returns the y coordinate in the viewport coordinate system where the given tile is painted.
@ OWNER_NONE
The tile has no ownership.
static void ViewportSortParentSprites(ParentSpriteToSortVector *psdv)
Sort parent sprites pointer array replicating the way original sorter did it.
T FindNearest(CoordT x, CoordT y) const
Find the element closest to given coordinate, in Manhattan distance.
@ MP_STATION
A tile of a station.
TownCache cache
Container for all cacheable data.
static StationID GetStationIndex(TileIndex t)
Get StationID from a tile.
EventState
State of handling an event.
bool kdtree_valid
Are the sign data valid for use with the _viewport_sign_kdtree?
@ HT_RECT
rectangle (stations, depots, ...)
@ VPM_FIX_HORIZONTAL
drag only in horizontal direction
void UpdateViewportPosition(Window *w)
Update the viewport position being displayed.
@ VPM_X_AND_Y
area of land in X and Y directions
@ DO_SHOW_SIGNS
Display signs.
@ WSM_DRAGGING
Dragging mode (trees).
WindowClass window_class
Window class.
int16 y_offs
Number of pixels to shift the sprite downwards.
BitmapTileArea catchment_tiles
NOSAVE: Set of individual tiles covered by catchment area.
static HighLightStyle Check2x1AutoRail(int mode)
returns information about the 2x1 piece to be build.
@ OWNER_DEITY
The object is owned by a superuser / goal script.
@ WC_MAIN_WINDOW
Main window; Window numbers:
TileIndex xy
Base tile of the station.
UnitID unitnumber
unit number, for display purposes only
static int GetTileMaxPixelZ(TileIndex tile)
Get top height of the tile.
@ HT_DRAG_MASK
Mask for the tile drag-type modes.
static uint ScaleByMapSize1D(uint n)
Scales the given value by the maps circumference, where the given value is for a 256 by 256 map.
Base class for all station-ish types.
@ DO_SHOW_TOWN_NAMES
Display town names.
ViewportDragDropSelectionProcess select_proc
The procedure that has to be called when the selection is done.
void SetViewportCatchmentStation(const Station *st, bool sel)
Select or deselect station for coverage area highlight.
static uint MapMaxX()
Gets the maximum X coordinate within the map, including MP_VOID.
void DrawGroundSpriteAt(SpriteID image, PaletteID pal, int32 x, int32 y, int z, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
Draws a ground sprite at a specific world-coordinate relative to the current tile.
int top
y position of top edge of the window
FoundationPart
Enumeration of multi-part foundations.
static TileHighlightType GetTileHighlightType(TileIndex t)
Get tile highlight type of coverage area for a given tile.
static void DrawSelectionSprite(SpriteID image, PaletteID pal, const TileInfo *ti, int z_offset, FoundationPart foundation_part)
Draws sprites between ground sprite and everything above.
static T abs(const T a)
Returns the absolute value of (scalar) variable.
void DrawViewport() const
Draw the viewport of this window.
Viewport * IsPtInWindowViewport(const Window *w, int x, int y)
Is a xy position inside the viewport of the window?
uint32 VehicleID
The type all our vehicle IDs have.
static void ViewportDrawDirtyBlocks()
Draw/colour the blocks that have been redrawn.
HighLightStyle
Highlighting draw styles.
Parent sprite that should be drawn.
@ VPSM_RIGHT
Right margin.
const SubSprite * sub
only draw a rectangular part of the sprite
VehicleID follow_vehicle
VehicleID to follow if following a vehicle, INVALID_VEHICLE otherwise.
void ShowVehicleViewWindow(const Vehicle *v)
Shows the vehicle view window of the given vehicle.
void SetDirty()
Mark the linkgraph dirty to be rebuilt next time Draw() is called.
void VpSetPresizeRange(TileIndex from, TileIndex to)
Highlights all tiles between a set of two tiles.
static T SetBit(T &x, const uint8 y)
Set a bit in a variable.
#define lengthof(x)
Return the length of an fixed size array.
int width
width of the window (number of pixels to the right in x direction)
@ VPM_X_LIMITED
Drag only in X axis with limited size.
ZoomLevel zoom
The zoom level of the viewport.
int32 dest_scrollpos_x
Current destination x coordinate to display (virtual screen coordinate of topleft corner of the viewp...
static int GetBridgePixelHeight(TileIndex tile)
Get the height ('z') of a bridge in pixels.
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
WindowClass window_class
The WindowClass of the window that is responsible for the selection mode.
static const uint TILE_HEIGHT
Height of a height level in world coordinate AND in pixels in #ZOOM_LVL_BASE.
uint32 GetCompanyMask()
Get a bitmask of the currently shown companies.
@ VPSM_BOTTOM
Bottom margin.
static const TileIndex INVALID_TILE
The very nice invalid tile marker.
static const int TILE_HEIGHT_STEP
One Z unit tile height difference is displayed as 50m.
virtual void OnPlaceDrag(ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, Point pt)
The user is dragging over the map when the tile highlight mode has been set.
static bool ViewportSortParentSpritesChecker()
This fallback sprite checker always exists.
@ WC_TOWN_VIEW
Town view; Window numbers:
VpSpriteSorter fct_sorter
The sorting function.
@ ZOOM_LVL_NORMAL
The normal zoom level.
static const CursorID SPR_CURSOR_MOUSE
Cursor sprite numbers.
static uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
bool IsInUse() const
Check whether the base station currently is in use; in use means that it is not scheduled for deletio...
TileIndex tile
Tile index.
ConstructionSettings construction
construction of things in-game
Window * z_front
The window in front of us in z-order.
Data structure for an opened window.
static const uint TILE_PIXELS
Pixel distance between tile columns/rows in #ZOOM_LVL_BASE.
static TileType GetTileType(TileIndex tile)
Get the tiletype of a given tile.
@ VST_CLIENT
Single player.
static const int MAX_TILE_EXTENT_RIGHT
Maximum right extent of tile relative to north corner.
HighLightStyle next_drawstyle
Queued, but not yet drawn style.
const Station * _viewport_highlight_station
Currently selected station for coverage area highlight.
void VpSelectTilesWithMethod(int x, int y, ViewportPlaceMethod method)
Selects tiles while dragging.
Point TranslateXYToTileCoord(const Viewport *vp, int x, int y, bool clamp_to_map)
Translate screen coordinate in a viewport to underlying tile coordinate.
static const int MAX_TILE_EXTENT_TOP
Maximum top extent of tile relative to north corner (not considering bridges).
void InitializeSpriteSorter()
Choose the "best" sprite sorter and set _vp_sprite_sorter.
int virtual_height
height << zoom
static void Swap(T &a, T &b)
Type safe swap operation.
@ HT_POINT
point (lower land, raise land, level land, ...)
static Slope GetTilePixelSlope(TileIndex tile, int *h)
Return the slope of a given tile.
@ VPM_X_AND_Y_LIMITED
area of land of limited size
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
@ HT_DIR_HU
horizontal upper
void SetWidgetDirty(byte widget_index) const
Invalidate a widget, i.e.
SpriteCombineMode
Mode of "sprite combining".
void HandleZoomMessage(Window *w, const Viewport *vp, byte widget_zoom_in, byte widget_zoom_out)
Update the status of the zoom-buttons according to the zoom-level of the viewport.
static Point RemapCoords2(int x, int y)
Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.
Specification of a rectangle with absolute coordinates of all edges.
Point pos
logical mouse position
Data structure describing a sprite.
@ VST_COMPANY
All players in specific company.
@ VPM_X_OR_Y
drag in X or Y direction
@ FOUNDATION_PART_NONE
Neither foundation nor groundsprite drawn yet.
@ DO_SHOW_WAYPOINT_NAMES
Display waypoint names.
void InitializeWindowViewport(Window *w, int x, int y, int width, int height, uint32 follow_flags, ZoomLevel zoom)
Initialize viewport of the window for use.
Point new_pos
New value for pos; used to determine whether to redraw the selection.
#define lastof(x)
Get the last element of an fixed size array.
void ShowWaypointWindow(const Waypoint *wp)
Show the window for the given waypoint.
@ HT_SPECIAL
special mode used for highlighting while dragging (and for tunnels/docks)
Helper class for getting the best sprite sorter.
void ViewportAddVehicles(DrawPixelInfo *dpi)
Add the vehicle sprites that should be drawn at a part of the screen.
TileIndex redsq
The tile that has to get a red selection.
bool freeze
Freeze highlight in place.
@ VPM_SIGNALDIRS
similar to VMP_RAILDIRS, but with different cursor
@ PFE_DRAWWORLD
Time spent drawing world viewports in GUI.
@ WSM_NONE
No special mouse mode.
void DrawGroundSprite(SpriteID image, PaletteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
Draws a ground sprite for the current tile.
bool smooth_scroll
smooth scroll viewports
GUISettings gui
settings related to the GUI
TrackedViewportSign sign
Location of name sign, UpdateVirtCoord updates this.
static T Delta(const T a, const T b)
Returns the (absolute) difference between two (scalar) variables.
uint16 SignID
The type of the IDs of signs.
Point selend
The location where the drag currently ends.
#define FOR_ALL_WINDOWS_FROM_BACK_FROM(w, start)
Iterate over all windows.
void SetViewportCatchmentTown(const Town *t, bool sel)
Select or deselect town for coverage area highlight.
Window * GetCallbackWnd()
Get the window that started the current highlighting.
Data about how and where to blit pixels.
@ SLOPE_STEEP_N
a steep slope falling to south (from north)
void Reset()
Reset tile highlighting.
static TileIndex TileVirtXY(uint x, uint y)
Get a tile from the virtual XY-coordinate.
static bool IsBridgeAbove(TileIndex t)
checks if a bridge is set above the ground of this tile
int32 xmax
maximal world X coordinate of bounding box
ViewportScrollTarget
Target of the viewport scrolling GS method.
void AddChildSpriteScreen(SpriteID image, PaletteID pal, int x, int y, bool transparent, const SubSprite *sub, bool scale)
Add a child sprite to a parent sprite.
@ SPRITE_COMBINE_PENDING
Sprite combining will start with the next unclipped sprite.
void DrawSpriteViewport(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub)
Draw a sprite in a viewport.