diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index 20214cb9d7..b6fc5958ed 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -123,29 +123,31 @@ static void DrawClearLandFence(const TileInfo *ti) EndSpriteCombine(); } -static void DrawTile_Clear(TileInfo *ti) +static void DrawTile_Clear(TileInfo *ti, DrawTileProcParams params) { switch (GetClearGround(ti->tile)) { case CLEAR_GRASS: - DrawClearLandTile(ti, GetClearDensity(ti->tile)); + if (!params.no_ground_tiles) DrawClearLandTile(ti, GetClearDensity(ti->tile)); break; case CLEAR_ROUGH: - DrawHillyLandTile(ti); + if (!params.no_ground_tiles) DrawHillyLandTile(ti); break; case CLEAR_ROCKS: - DrawGroundSprite(GetSpriteIDForRocks(ti->tileh, TileHash(ti->x, ti->y)), PAL_NONE); + if (!params.no_ground_tiles) DrawGroundSprite(GetSpriteIDForRocks(ti->tileh, TileHash(ti->x, ti->y)), PAL_NONE); break; case CLEAR_FIELDS: - DrawGroundSprite(GetSpriteIDForFields(ti->tileh, GetFieldType(ti->tile)), PAL_NONE); - DrawClearLandFence(ti); + if (params.min_visible_height <= 4 * ZOOM_LVL_BASE) { + DrawGroundSprite(GetSpriteIDForFields(ti->tileh, GetFieldType(ti->tile)), PAL_NONE); + DrawClearLandFence(ti); + } break; case CLEAR_SNOW: case CLEAR_DESERT: - DrawGroundSprite(GetSpriteIDForSnowDesert(ti->tileh, GetClearDensity(ti->tile)), PAL_NONE); + if (!params.no_ground_tiles) DrawGroundSprite(GetSpriteIDForSnowDesert(ti->tileh, GetClearDensity(ti->tile)), PAL_NONE); break; } diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 3a7b150bd6..4915d18d16 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -317,7 +317,7 @@ static IndustryDrawTileProc * const _industry_draw_tile_procs[5] = { IndustryDrawCoalPlantSparks, }; -static void DrawTile_Industry(TileInfo *ti) +static void DrawTile_Industry(TileInfo *ti, DrawTileProcParams params) { IndustryGfx gfx = GetIndustryGfx(ti->tile); Industry *ind = Industry::GetByTile(ti->tile); diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index efe7d363a6..75d15e56ee 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -418,7 +418,7 @@ CommandCost CmdPurchaseLandArea(TileIndex tile, DoCommandFlag flags, uint32 p1, static Foundation GetFoundation_Object(TileIndex tile, Slope tileh); -static void DrawTile_Object(TileInfo *ti) +static void DrawTile_Object(TileInfo *ti, DrawTileProcParams params) { ObjectType type = GetObjectType(ti->tile); const ObjectSpec *spec = ObjectSpec::Get(type); diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index f5dc035a35..2c8c2d6940 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -3094,13 +3094,15 @@ static void DrawSignals(TileIndex tile, TrackBits rails, const RailtypeInfo *rti } } -static void DrawTile_Track(TileInfo *ti) +static void DrawTile_Track(TileInfo *ti, DrawTileProcParams params) { const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile)); _drawtile_track_palette = COMPANY_SPRITE_COLOUR(GetTileOwner(ti->tile)); if (IsPlainRail(ti->tile)) { + if (!IsBridgeAbove(ti->tile) && params.min_visible_height > max(SIGNAL_DIRTY_TOP, (TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE) * ZOOM_LVL_BASE) && !_signal_sprite_oversized) return; + TrackBits rails = GetTrackBits(ti->tile); DrawTrackBits(ti, rails); diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 89045cc347..9b34fc2454 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1838,8 +1838,10 @@ void DrawRoadBits(TileInfo *ti) } /** Tile callback function for rendering a road tile to the screen */ -static void DrawTile_Road(TileInfo *ti) +static void DrawTile_Road(TileInfo *ti, DrawTileProcParams params) { + if (!IsBridgeAbove(ti->tile) && GetRoadTileType(ti->tile) != ROAD_TILE_DEPOT && params.min_visible_height > (int)((TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE) * ZOOM_LVL_BASE)) return; + switch (GetRoadTileType(ti->tile)) { case ROAD_TILE_NORMAL: DrawRoadBits(ti); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 2dcd32fac7..c94945ad6a 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3025,7 +3025,7 @@ bool SplitGroundSpriteForOverlay(const TileInfo *ti, SpriteID *ground, RailTrack return true; } -static void DrawTile_Station(TileInfo *ti) +static void DrawTile_Station(TileInfo *ti, DrawTileProcParams params) { const NewGRFSpriteLayout *layout = nullptr; DrawTileSprites tmp_rail_layout; diff --git a/src/tile_cmd.h b/src/tile_cmd.h index 345b875d6d..396c079e3e 100644 --- a/src/tile_cmd.h +++ b/src/tile_cmd.h @@ -70,11 +70,16 @@ struct TileDesc { uint16 tram_speed; ///< Speed limit of tram (bridges and track) }; +struct DrawTileProcParams { + int min_visible_height; + bool no_ground_tiles; +}; + /** * Tile callback function signature for drawing a tile and its contents to the screen * @param ti Information about the tile to draw */ -typedef void DrawTileProc(TileInfo *ti); +typedef void DrawTileProc(TileInfo *ti, DrawTileProcParams params); typedef int GetSlopeZProc(TileIndex tile, uint x, uint y); typedef CommandCost ClearTileProc(TileIndex tile, DoCommandFlag flags); diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 0ee9699c1b..359761fd8b 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -284,7 +284,7 @@ static inline DiagDirection RandomDiagDir() * Part of the tile loop process * @param ti TileInfo of the tile to draw */ -static void DrawTile_Town(TileInfo *ti) +static void DrawTile_Town(TileInfo *ti, DrawTileProcParams params) { HouseID house_id = GetHouseType(ti->tile); diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp index eb62366664..9c5e6f1376 100644 --- a/src/tree_cmd.cpp +++ b/src/tree_cmd.cpp @@ -555,13 +555,15 @@ struct TreeListEnt : PalSpriteID { byte x, y; }; -static void DrawTile_Trees(TileInfo *ti) +static void DrawTile_Trees(TileInfo *ti, DrawTileProcParams params) { - switch (GetTreeGround(ti->tile)) { - case TREE_GROUND_SHORE: DrawShoreTile(ti->tileh); break; - case TREE_GROUND_GRASS: DrawClearLandTile(ti, GetTreeDensity(ti->tile)); break; - case TREE_GROUND_ROUGH: DrawHillyLandTile(ti); break; - default: DrawGroundSprite(_clear_land_sprites_snow_desert[GetTreeDensity(ti->tile)] + SlopeToSpriteOffset(ti->tileh), PAL_NONE); break; + if (!params.no_ground_tiles) { + switch (GetTreeGround(ti->tile)) { + case TREE_GROUND_SHORE: DrawShoreTile(ti->tileh); break; + case TREE_GROUND_GRASS: DrawClearLandTile(ti, GetTreeDensity(ti->tile)); break; + case TREE_GROUND_ROUGH: DrawHillyLandTile(ti); break; + default: DrawGroundSprite(_clear_land_sprites_snow_desert[GetTreeDensity(ti->tile)] + SlopeToSpriteOffset(ti->tileh), PAL_NONE); break; + } } /* Do not draw trees when the invisible trees setting is set */ diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 7e9483ab23..877725dc75 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1676,7 +1676,7 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st * * Please note that in this code, "roads" are treated as railtype 1, whilst the real railtypes are 0, 2 and 3 */ -static void DrawTile_TunnelBridge(TileInfo *ti) +static void DrawTile_TunnelBridge(TileInfo *ti, DrawTileProcParams params) { TransportType transport_type = GetTunnelBridgeTransportType(ti->tile); DiagDirection tunnelbridge_direction = GetTunnelBridgeDirection(ti->tile); diff --git a/src/viewport.cpp b/src/viewport.cpp index 260c9ee036..8a4ce2752a 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1587,8 +1587,9 @@ static void ViewportAddLandscape() _vd.last_foundation_child[0] = nullptr; _vd.last_foundation_child[1] = nullptr; - _tile_type_procs[tile_type]->draw_tile_proc(&tile_info); - if (tile_info.tile != INVALID_TILE && min_visible_height <= (int)(ZOOM_LVL_BASE * 2 * TILE_HEIGHT)) { + bool no_ground_tiles = (column == left_column || column == right_column) || min_visible_height > 0; + _tile_type_procs[tile_type]->draw_tile_proc(&tile_info, { min_visible_height, no_ground_tiles }); + if (tile_info.tile != INVALID_TILE && min_visible_height <= 0) { DrawTileSelection(&tile_info); DrawTileZoning(&tile_info); } diff --git a/src/void_cmd.cpp b/src/void_cmd.cpp index cf159d69cc..96657beed1 100644 --- a/src/void_cmd.cpp +++ b/src/void_cmd.cpp @@ -18,7 +18,7 @@ #include "safeguards.h" -static void DrawTile_Void(TileInfo *ti) +static void DrawTile_Void(TileInfo *ti, DrawTileProcParams params) { DrawGroundSprite(SPR_FLAT_BARE_LAND + SlopeToSpriteOffset(ti->tileh), PALETTE_ALL_BLACK); } diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 4b345fdfe4..0021864ad8 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -918,16 +918,16 @@ void DrawWaterClassGround(const TileInfo *ti) } } -static void DrawTile_Water(TileInfo *ti) +static void DrawTile_Water(TileInfo *ti, DrawTileProcParams params) { switch (GetWaterTileType(ti->tile)) { case WATER_TILE_CLEAR: - DrawWaterClassGround(ti); + if (!params.no_ground_tiles) DrawWaterClassGround(ti); DrawBridgeMiddle(ti); break; case WATER_TILE_COAST: { - DrawShoreTile(ti->tileh); + if (!params.no_ground_tiles) DrawShoreTile(ti->tileh); DrawBridgeMiddle(ti); break; }