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();
|
EndSpriteCombine();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DrawTile_Clear(TileInfo *ti)
|
static void DrawTile_Clear(TileInfo *ti, DrawTileProcParams params)
|
||||||
{
|
{
|
||||||
switch (GetClearGround(ti->tile)) {
|
switch (GetClearGround(ti->tile)) {
|
||||||
case CLEAR_GRASS:
|
case CLEAR_GRASS:
|
||||||
DrawClearLandTile(ti, GetClearDensity(ti->tile));
|
if (!params.no_ground_tiles) DrawClearLandTile(ti, GetClearDensity(ti->tile));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CLEAR_ROUGH:
|
case CLEAR_ROUGH:
|
||||||
DrawHillyLandTile(ti);
|
if (!params.no_ground_tiles) DrawHillyLandTile(ti);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CLEAR_ROCKS:
|
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;
|
break;
|
||||||
|
|
||||||
case CLEAR_FIELDS:
|
case CLEAR_FIELDS:
|
||||||
|
if (params.min_visible_height <= 4 * ZOOM_LVL_BASE) {
|
||||||
DrawGroundSprite(GetSpriteIDForFields(ti->tileh, GetFieldType(ti->tile)), PAL_NONE);
|
DrawGroundSprite(GetSpriteIDForFields(ti->tileh, GetFieldType(ti->tile)), PAL_NONE);
|
||||||
DrawClearLandFence(ti);
|
DrawClearLandFence(ti);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CLEAR_SNOW:
|
case CLEAR_SNOW:
|
||||||
case CLEAR_DESERT:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -317,7 +317,7 @@ static IndustryDrawTileProc * const _industry_draw_tile_procs[5] = {
|
|||||||
IndustryDrawCoalPlantSparks,
|
IndustryDrawCoalPlantSparks,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void DrawTile_Industry(TileInfo *ti)
|
static void DrawTile_Industry(TileInfo *ti, DrawTileProcParams params)
|
||||||
{
|
{
|
||||||
IndustryGfx gfx = GetIndustryGfx(ti->tile);
|
IndustryGfx gfx = GetIndustryGfx(ti->tile);
|
||||||
Industry *ind = Industry::GetByTile(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 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);
|
ObjectType type = GetObjectType(ti->tile);
|
||||||
const ObjectSpec *spec = ObjectSpec::Get(type);
|
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));
|
const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
|
||||||
|
|
||||||
_drawtile_track_palette = COMPANY_SPRITE_COLOUR(GetTileOwner(ti->tile));
|
_drawtile_track_palette = COMPANY_SPRITE_COLOUR(GetTileOwner(ti->tile));
|
||||||
|
|
||||||
if (IsPlainRail(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);
|
TrackBits rails = GetTrackBits(ti->tile);
|
||||||
|
|
||||||
DrawTrackBits(ti, rails);
|
DrawTrackBits(ti, rails);
|
||||||
|
@@ -1838,8 +1838,10 @@ void DrawRoadBits(TileInfo *ti)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Tile callback function for rendering a road tile to the screen */
|
/** 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)) {
|
switch (GetRoadTileType(ti->tile)) {
|
||||||
case ROAD_TILE_NORMAL:
|
case ROAD_TILE_NORMAL:
|
||||||
DrawRoadBits(ti);
|
DrawRoadBits(ti);
|
||||||
|
@@ -3025,7 +3025,7 @@ bool SplitGroundSpriteForOverlay(const TileInfo *ti, SpriteID *ground, RailTrack
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DrawTile_Station(TileInfo *ti)
|
static void DrawTile_Station(TileInfo *ti, DrawTileProcParams params)
|
||||||
{
|
{
|
||||||
const NewGRFSpriteLayout *layout = nullptr;
|
const NewGRFSpriteLayout *layout = nullptr;
|
||||||
DrawTileSprites tmp_rail_layout;
|
DrawTileSprites tmp_rail_layout;
|
||||||
|
@@ -70,11 +70,16 @@ struct TileDesc {
|
|||||||
uint16 tram_speed; ///< Speed limit of tram (bridges and track)
|
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
|
* Tile callback function signature for drawing a tile and its contents to the screen
|
||||||
* @param ti Information about the tile to draw
|
* @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 int GetSlopeZProc(TileIndex tile, uint x, uint y);
|
||||||
typedef CommandCost ClearTileProc(TileIndex tile, DoCommandFlag flags);
|
typedef CommandCost ClearTileProc(TileIndex tile, DoCommandFlag flags);
|
||||||
|
|
||||||
|
@@ -284,7 +284,7 @@ static inline DiagDirection RandomDiagDir()
|
|||||||
* Part of the tile loop process
|
* Part of the tile loop process
|
||||||
* @param ti TileInfo of the tile to draw
|
* @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);
|
HouseID house_id = GetHouseType(ti->tile);
|
||||||
|
|
||||||
|
@@ -555,14 +555,16 @@ struct TreeListEnt : PalSpriteID {
|
|||||||
byte x, y;
|
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)) {
|
switch (GetTreeGround(ti->tile)) {
|
||||||
case TREE_GROUND_SHORE: DrawShoreTile(ti->tileh); break;
|
case TREE_GROUND_SHORE: DrawShoreTile(ti->tileh); break;
|
||||||
case TREE_GROUND_GRASS: DrawClearLandTile(ti, GetTreeDensity(ti->tile)); break;
|
case TREE_GROUND_GRASS: DrawClearLandTile(ti, GetTreeDensity(ti->tile)); break;
|
||||||
case TREE_GROUND_ROUGH: DrawHillyLandTile(ti); break;
|
case TREE_GROUND_ROUGH: DrawHillyLandTile(ti); break;
|
||||||
default: DrawGroundSprite(_clear_land_sprites_snow_desert[GetTreeDensity(ti->tile)] + SlopeToSpriteOffset(ti->tileh), PAL_NONE); 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 */
|
/* Do not draw trees when the invisible trees setting is set */
|
||||||
if (IsInvisibilitySet(TO_TREES)) return;
|
if (IsInvisibilitySet(TO_TREES)) return;
|
||||||
|
@@ -1676,7 +1676,7 @@ static void DrawBridgeSignalOnMiddlePart(const TileInfo *ti, TileIndex bridge_st
|
|||||||
* </ul>
|
* </ul>
|
||||||
* Please note that in this code, "roads" are treated as railtype 1, whilst the real railtypes are 0, 2 and 3
|
* 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);
|
TransportType transport_type = GetTunnelBridgeTransportType(ti->tile);
|
||||||
DiagDirection tunnelbridge_direction = GetTunnelBridgeDirection(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[0] = nullptr;
|
||||||
_vd.last_foundation_child[1] = nullptr;
|
_vd.last_foundation_child[1] = nullptr;
|
||||||
|
|
||||||
_tile_type_procs[tile_type]->draw_tile_proc(&tile_info);
|
bool no_ground_tiles = (column == left_column || column == right_column) || min_visible_height > 0;
|
||||||
if (tile_info.tile != INVALID_TILE && min_visible_height <= (int)(ZOOM_LVL_BASE * 2 * TILE_HEIGHT)) {
|
_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);
|
DrawTileSelection(&tile_info);
|
||||||
DrawTileZoning(&tile_info);
|
DrawTileZoning(&tile_info);
|
||||||
}
|
}
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
#include "safeguards.h"
|
#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);
|
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)) {
|
switch (GetWaterTileType(ti->tile)) {
|
||||||
case WATER_TILE_CLEAR:
|
case WATER_TILE_CLEAR:
|
||||||
DrawWaterClassGround(ti);
|
if (!params.no_ground_tiles) DrawWaterClassGround(ti);
|
||||||
DrawBridgeMiddle(ti);
|
DrawBridgeMiddle(ti);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WATER_TILE_COAST: {
|
case WATER_TILE_COAST: {
|
||||||
DrawShoreTile(ti->tileh);
|
if (!params.no_ground_tiles) DrawShoreTile(ti->tileh);
|
||||||
DrawBridgeMiddle(ti);
|
DrawBridgeMiddle(ti);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user