OSDN Git Service

fixed a bug in AbstractHeightmap.flatten
authorbrentowens <brentowens@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Wed, 8 Jun 2011 22:55:24 +0000 (22:55 +0000)
committerbrentowens <brentowens@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Wed, 8 Jun 2011 22:55:24 +0000 (22:55 +0000)
git-svn-id: http://jmonkeyengine.googlecode.com/svn/trunk@7560 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

engine/src/terrain/com/jme3/terrain/heightmap/AbstractHeightMap.java

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