From a2fc417d868f3323e2fe99cdeeb9a2f7d48d3511 Mon Sep 17 00:00:00 2001 From: tron Date: Mon, 26 Jun 2006 15:00:23 +0000 Subject: [PATCH] (svn r5368) -Backport: 5351, 5352 -Fix: Several graphical glitches at adjacent tiles with foundations. Some borders were missing, some were superfluous -Fix: Return accurate slope information for tunnels and bridges to fix several foundation graphics glitches --- landscape.c | 58 +++++++++++++++++++++++++++++++--------------- tunnelbridge_cmd.c | 27 +++++++++++++++++++-- 2 files changed, 64 insertions(+), 21 deletions(-) diff --git a/landscape.c b/landscape.c index 839b5dbd41..f92cd13498 100644 --- a/landscape.c +++ b/landscape.c @@ -184,34 +184,54 @@ uint GetSlopeZ(int x, int y) return _tile_type_procs[ti.type]->get_slope_z_proc(&ti); } -// direction=true: check for foundation in east and south corner -// direction=false: check for foundation in west and south corner -static bool hasFoundation(const TileInfo* ti, bool direction) + +static Slope GetFoundationSlope(TileIndex tile, uint* z) { - bool south, other; // southern corner and east/west corner - uint slope = _tile_type_procs[ti->type]->get_slope_tileh_proc(ti); - uint tileh = ti->tileh; + TileInfo ti; + Slope tileh; + Slope slope; - if (slope == 0 && slope != tileh) tileh = 15; - south = (tileh & 2) != (slope & 2); + FindLandscapeHeightByTile(&ti, tile); + tileh = ti.tileh; + slope = _tile_type_procs[GetTileType(tile)]->get_slope_tileh_proc(&ti); - if (direction) { - other = (tileh & 4) != (slope & 4); - } else { - other = (tileh & 1) != (slope & 1); - } - return south || other; + // Flatter slope -> higher base height + if (slope < tileh) *z += TILE_HEIGHT; + return slope; } + +static bool HasFoundationNW(TileIndex tile, Slope slope_here, uint z_here) +{ + uint z; + Slope slope = GetFoundationSlope(TILE_ADDXY(tile, 0, -1), &z); + + return + (z_here + (slope_here & SLOPE_N ? TILE_HEIGHT : 0) > z + (slope & SLOPE_E ? TILE_HEIGHT : 0)) || + (z_here + (slope_here & SLOPE_W ? TILE_HEIGHT : 0) > z + (slope & SLOPE_S ? TILE_HEIGHT : 0)); +} + + +static bool HasFoundationNE(TileIndex tile, Slope slope_here, uint z_here) +{ + uint z; + Slope slope = GetFoundationSlope(TILE_ADDXY(tile, -1, 0), &z); + + return + (z_here + (slope_here & SLOPE_N ? TILE_HEIGHT : 0) > z + (slope & SLOPE_W ? TILE_HEIGHT : 0)) || + (z_here + (slope_here & SLOPE_E ? TILE_HEIGHT : 0) > z + (slope & SLOPE_S ? TILE_HEIGHT : 0)); +} + + void DrawFoundation(TileInfo *ti, uint f) { uint32 sprite_base = SPR_SLOPES_BASE-14; + Slope slope; + uint z; - TileInfo ti2; - FindLandscapeHeight(&ti2, ti->x, ti->y - 1); - if (hasFoundation(&ti2, true)) sprite_base += 22; // foundation in NW direction - FindLandscapeHeight(&ti2, ti->x - 1, ti->y); - if (hasFoundation(&ti2, false)) sprite_base += 22 * 2; // foundation in NE direction + slope = GetFoundationSlope(ti->tile, &z); + if (!HasFoundationNW(ti->tile, slope, z)) sprite_base += 22; + if (!HasFoundationNE(ti->tile, slope, z)) sprite_base += 44; if (f < 15) { // leveled foundation diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c index 47a7ce8701..9c1c25ab76 100644 --- a/tunnelbridge_cmd.c +++ b/tunnelbridge_cmd.c @@ -1277,8 +1277,31 @@ static uint GetSlopeZ_TunnelBridge(const TileInfo* ti) static uint GetSlopeTileh_TunnelBridge(const TileInfo* ti) { - // not accurate, but good enough for slope graphics drawing - return 0; + TileIndex tile = ti->tile; + Slope tileh = ti->tileh; + uint f; + + if (IsTunnel(tile)) { + return tileh; + } else { + if (IsBridgeRamp(tile)) { + if (HASBIT(BRIDGE_NO_FOUNDATION, tileh)) { + return tileh; + } else { + f = GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(tile))); + } + } else { + if (IsTransportUnderBridge(tile)) { + f = _bridge_foundations[GetBridgeAxis(tile)][tileh]; + } else { + return tileh; + } + } + } + + if (f == 0) return tileh; + if (f < 15) return SLOPE_FLAT; + return _inclined_tileh[f - 15]; }