Add a minimum visible height and no ground tile parameter to DrawTileProc.
Filter out tile parts which are entirely outside the drawing area.
This commit is contained in:
@@ -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:
|
||||
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,14 +555,16 @@ struct TreeListEnt : PalSpriteID {
|
||||
byte x, y;
|
||||
};
|
||||
|
||||
static void DrawTile_Trees(TileInfo *ti)
|
||||
static void DrawTile_Trees(TileInfo *ti, DrawTileProcParams params)
|
||||
{
|
||||
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 */
|
||||
if (IsInvisibilitySet(TO_TREES)) return;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user