diff --git a/engine/src/terrain/com/jme3/terrain/heightmap/AbstractHeightMap.java b/engine/src/terrain/com/jme3/terrain/heightmap/AbstractHeightMap.java index 814e04a58..5c5637375 100644 --- a/engine/src/terrain/com/jme3/terrain/heightmap/AbstractHeightMap.java +++ b/engine/src/terrain/com/jme3/terrain/heightmap/AbstractHeightMap.java @@ -316,6 +316,29 @@ public abstract class AbstractHeightMap implements HeightMap { } } + /** + * Find the minimum and maximum height values. + * @return a float array with two value: min height, max height + */ + public float[] findMinMaxHeights() { + float[] minmax = new float[2]; + + float currentMin, currentMax; + currentMin = heightData[0]; + currentMax = heightData[0]; + + for (int i = 0; i < heightData.length; i++) { + if (heightData[i] > currentMax) { + currentMax = heightData[i]; + } else if (heightData[i] < currentMin) { + currentMin = heightData[i]; + } + } + minmax[0] = currentMin; + minmax[1] = currentMax; + return minmax; + } + /** * erodeTerrain is a convenience method that applies the FIR * filter to a given height map. This simulates water errosion. @@ -378,7 +401,11 @@ public abstract class AbstractHeightMap implements HeightMap { if (flattening <= 1) { return; } + + float[] minmax = findMinMaxHeights(); + normalizeTerrain(1f); + for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { float flat = 1.0f; @@ -391,6 +418,10 @@ public abstract class AbstractHeightMap implements HeightMap { heightData[x + y * size] = flat; } } + + // re-normalize back to its oraginal height range + float height = minmax[1] - minmax[0]; + normalizeTerrain(height); } /**