Add a minimum visible height and no ground tile parameter to DrawTileProc.

Filter out tile parts which are entirely outside the drawing area.
pull/135/head
Jonathan G Rennison 4 years ago
parent 8ef367b126
commit 7949de2c05

@ -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;
}

@ -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);

@ -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);

@ -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<int>(SIGNAL_DIRTY_TOP, (TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE) * ZOOM_LVL_BASE) && !_signal_sprite_oversized) return;
TrackBits rails = GetTrackBits(ti->tile);
DrawTrackBits(ti, rails);

@ -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);

@ -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;

@ -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);

@ -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);

@ -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 */

@ -1676,7 +1676,7 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st
* </ul>
* 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);

@ -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);
}

@ -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);
}

@ -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;
}

Loading…
Cancel
Save