Changeset - r22157:78a6c66530ed
[Not reviewed]
master
0 1 0
frosch - 9 years ago 2015-07-11 10:46:25
frosch@openttd.org
(svn r27330) -Fix [FS#6335]: Make variety distribution not assume that sea level is at height 0.2 / 3 * TGPGetMaxHeight().
1 file changed with 14 insertions and 5 deletions:
0 comments (0 inline, 0 general)
src/tgp.cpp
Show inline comments
 
@@ -573,7 +573,7 @@ static void HeightMapSineTransform(heigh
 
 */
 
static void HeightMapCurves(uint level)
 
{
 
	height_t mh = TGPGetMaxHeight();
 
	height_t mh = TGPGetMaxHeight() - I2H(1); // height levels above sea level only
 

	
 
	/** Basically scale height X to height Y. Everything in between is interpolated. */
 
	struct control_point_t {
 
@@ -582,10 +582,10 @@ static void HeightMapCurves(uint level)
 
	};
 
	/* Scaled curve maps; value is in height_ts. */
 
#define F(fraction) ((height_t)(fraction * mh))
 
	const control_point_t curve_map_1[] = { { F(0.0), F(0.0) }, { F(0.6 / 3), F(0.1) }, { F(2.4 / 3), F(0.4 / 3) },                                                       { F(1.0), F(0.4)  } };
 
	const control_point_t curve_map_2[] = { { F(0.0), F(0.0) }, { F(0.2 / 3), F(0.1) }, { F(1.6 / 3), F(0.4 / 3) }, { F(2.4 / 3), F(0.8 / 3) },                           { F(1.0), F(0.6)  } };
 
	const control_point_t curve_map_3[] = { { F(0.0), F(0.0) }, { F(0.2 / 3), F(0.1) }, { F(1.6 / 3), F(0.8 / 3) }, { F(2.4 / 3), F(1.8 / 3) },                           { F(1.0), F(0.8)  } };
 
	const control_point_t curve_map_4[] = { { F(0.0), F(0.0) }, { F(0.2 / 3), F(0.1) }, { F(1.2 / 3), F(0.9 / 3) }, { F(2.0 / 3), F(2.4 / 3) } , { F(5.5 / 6), F(0.99) }, { F(1.0), F(0.99) } };
 
	const control_point_t curve_map_1[] = { { F(0.0), F(0.0) }, { F(2.4 / 3), F(0.4 / 3) },                                                       { F(1.0), F(0.4)  } };
 
	const control_point_t curve_map_2[] = { { F(0.0), F(0.0) }, { F(1.6 / 3), F(0.4 / 3) }, { F(2.4 / 3), F(0.8 / 3) },                           { F(1.0), F(0.6)  } };
 
	const control_point_t curve_map_3[] = { { F(0.0), F(0.0) }, { F(1.6 / 3), F(0.8 / 3) }, { F(2.4 / 3), F(1.8 / 3) },                           { F(1.0), F(0.8)  } };
 
	const control_point_t curve_map_4[] = { { F(0.0), F(0.0) }, { F(1.2 / 3), F(0.9 / 3) }, { F(2.0 / 3), F(2.4 / 3) } , { F(5.5 / 6), F(0.99) }, { F(1.0), F(0.99) } };
 
#undef F
 

	
 
	/** Helper structure to index the different curve maps. */
 
@@ -663,6 +663,12 @@ static void HeightMapCurves(uint level)
 

	
 
			height_t *h = &_height_map.height(x, y);
 

	
 
			/* Do not touch sea level */
 
			if (*h < I2H(1)) continue;
 

	
 
			/* Only scale above sea level */
 
			*h -= I2H(1);
 

	
 
			/* Apply all curve maps that are used on this tile. */
 
			for (uint t = 0; t < lengthof(curve_maps); t++) {
 
				if (!HasBit(corner_bits, t)) continue;
 
@@ -684,6 +690,9 @@ static void HeightMapCurves(uint level)
 

	
 
			/* Apply interpolation of curve map results. */
 
			*h = (height_t)((ht[corner_a] * yri + ht[corner_b] * yr) * xri + (ht[corner_c] * yri + ht[corner_d] * yr) * xr);
 

	
 
			/* Readd sea level */
 
			*h += I2H(1);
 
		}
 
	}
 
}
0 comments (0 inline, 0 general)