# HG changeset patch # User tron # Date 1151334023 0 # Node ID f1b796f03d9f9ba064459b7518383172c51d6523 # Parent 699760ec6757f6a1b98cd796cbde7c333495bff8 (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 diff -r 699760ec6757 -r f1b796f03d9f landscape.c --- a/landscape.c Mon Jun 26 14:58:41 2006 +0000 +++ b/landscape.c Mon Jun 26 15:00:23 2006 +0000 @@ -184,34 +184,54 @@ 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) -{ - 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; - if (slope == 0 && slope != tileh) tileh = 15; - south = (tileh & 2) != (slope & 2); +static Slope GetFoundationSlope(TileIndex tile, uint* z) +{ + TileInfo ti; + Slope tileh; + Slope slope; - if (direction) { - other = (tileh & 4) != (slope & 4); - } else { - other = (tileh & 1) != (slope & 1); - } - return south || other; + FindLandscapeHeightByTile(&ti, tile); + tileh = ti.tileh; + slope = _tile_type_procs[GetTileType(tile)]->get_slope_tileh_proc(&ti); + + // 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 -r 699760ec6757 -r f1b796f03d9f tunnelbridge_cmd.c --- a/tunnelbridge_cmd.c Mon Jun 26 14:58:41 2006 +0000 +++ b/tunnelbridge_cmd.c Mon Jun 26 15:00:23 2006 +0000 @@ -1277,8 +1277,31 @@ 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]; }