(svn r5368) -Backport: 5351, 5352 0.4
authortron
Mon, 26 Jun 2006 15:00:23 +0000
branch0.4
changeset 10049 f1b796f03d9f
parent 10048 699760ec6757
child 10050 53795ed4cdaf
(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
tunnelbridge_cmd.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
--- 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];
 }