diff --git a/src/engine/InterestManagement/HeightMap.java b/src/engine/InterestManagement/HeightMap.java index c903031a..fd3e7a7e 100644 --- a/src/engine/InterestManagement/HeightMap.java +++ b/src/engine/InterestManagement/HeightMap.java @@ -288,6 +288,22 @@ public class HeightMap { return interpolatedHeight; } + public static Zone getNextZoneWithTerrain(Zone zone) { + + Zone nextZone = zone; + + if (zone.getHeightMap() != null) + return zone; + + if (zone.equals(ZoneManager.getSeaFloor())) + return zone; + + while (nextZone.getHeightMap() == null) + nextZone = nextZone.getParent(); + + return nextZone; + } + public static float getWorldHeight(AbstractWorldObject worldObject) { Vector2f parentLoc = new Vector2f(-1, -1); @@ -296,32 +312,19 @@ public class HeightMap { if (currentZone == null) return worldObject.getAltitude(); - Zone parentZone = currentZone.getParent(); - HeightMap heightMap = currentZone.getHeightMap(); - - //find the next parents heightmap if the currentzone heightmap is null. - - while (heightMap == null) { - - if (currentZone == ZoneManager.getSeaFloor()) { - break; - } - currentZone = currentZone.getParent(); - heightMap = currentZone.getHeightMap(); - - parentZone = currentZone.getParent(); - } - if ((heightMap == null) || (currentZone == ZoneManager.getSeaFloor())) { + currentZone = getNextZoneWithTerrain(currentZone); + if (currentZone == ZoneManager.getSeaFloor()) return currentZone.getAbsY() + worldObject.getAltitude(); - } + + Zone parentZone = getNextZoneWithTerrain(currentZone.getParent()); + HeightMap heightMap = currentZone.getHeightMap(); Vector2f zoneLoc = ZoneManager.worldToZoneSpace(worldObject.getLoc(), currentZone); Vector3fImmutable localLocFromCenter = ZoneManager.worldToLocal(worldObject.getLoc(), currentZone); - if ((parentZone != null) && (parentZone.getHeightMap() != null)) { + if ((parentZone != null) && (parentZone.getHeightMap() != null)) parentLoc = ZoneManager.worldToZoneSpace(worldObject.getLoc(), parentZone); - } float interaltitude = currentZone.getHeightMap().getInterpolatedTerrainHeight(zoneLoc); @@ -331,32 +334,25 @@ public class HeightMap { //OUTSET - if (parentZone != null) { - float parentXRadius = currentZone.getBounds().getHalfExtents().x; float parentZRadius = currentZone.getBounds().getHalfExtents().y; - float offsetX = Math.abs((localLocFromCenter.x / parentXRadius)); float offsetZ = Math.abs((localLocFromCenter.z / parentZRadius)); float bucketScaleX = heightMap.outsetX / parentXRadius; float bucketScaleZ = heightMap.outsetZ / parentZRadius; - - if (bucketScaleX <= 0.40000001) { + if (bucketScaleX <= 0.40000001) bucketScaleX = heightMap.outsetZ / parentXRadius; - } - if (bucketScaleX > 0.40000001) bucketScaleX = 0.40000001f; - if (bucketScaleZ <= 0.40000001) { + if (bucketScaleZ <= 0.40000001) bucketScaleZ = heightMap.outsetX / parentZRadius; - } if (bucketScaleZ > 0.40000001) bucketScaleZ = 0.40000001f; @@ -367,7 +363,6 @@ public class HeightMap { double scale; - if (offsetX > outsideGridSizeX && offsetX > offsetZ) { weight = (offsetX - outsideGridSizeX) / bucketScaleX; scale = Math.atan2((.5 - weight) * 3.1415927, 1); @@ -375,11 +370,9 @@ public class HeightMap { float scaleChild = (float) ((scale + 1) * .5); float scaleParent = 1 - scaleChild; - float parentAltitude = parentZone.getHeightMap().getInterpolatedTerrainHeight(parentLoc); float parentCenterAltitude = parentZone.getHeightMap().getInterpolatedTerrainHeight(ZoneManager.worldToZoneSpace(currentZone.getLoc(), parentZone)); - parentCenterAltitude += currentZone.getYCoord(); parentCenterAltitude += interaltitude; @@ -411,7 +404,6 @@ public class HeightMap { } } - return realWorldAltitude; } @@ -423,39 +415,22 @@ public class HeightMap { if (currentZone == null) return 0; - Zone parentZone = currentZone.getParent(); - HeightMap heightMap = currentZone.getHeightMap(); - - //find the next parents heightmap if the currentzone heightmap is null. - - while (heightMap == null) { - - if (currentZone == ZoneManager.getSeaFloor()) - break; - - currentZone = currentZone.getParent(); - heightMap = currentZone.getHeightMap(); + currentZone = getNextZoneWithTerrain(currentZone); - parentZone = currentZone.getParent(); - - // Account for databases where the continental - // heightmaps are driven by the zone above them. - - if (parentZone.getHeightMap() == null) - parentZone = parentZone.getParent(); + if (currentZone == ZoneManager.getSeaFloor()) + return currentZone.getAbsY(); - } + Zone parentZone = getNextZoneWithTerrain(currentZone.getParent()); + HeightMap heightMap = currentZone.getHeightMap(); if ((heightMap == null) || (currentZone == ZoneManager.getSeaFloor())) return currentZone.getAbsY(); - Vector2f zoneLoc = ZoneManager.worldToZoneSpace(worldLoc, currentZone); Vector3fImmutable localLocFromCenter = ZoneManager.worldToLocal(worldLoc, currentZone); - if ((parentZone != null) && (parentZone.getHeightMap() != null)) { + if ((parentZone != null) && (parentZone.getHeightMap() != null)) parentLoc = ZoneManager.worldToZoneSpace(worldLoc, parentZone); - } float interaltitude = currentZone.getHeightMap().getInterpolatedTerrainHeight(zoneLoc); @@ -465,7 +440,6 @@ public class HeightMap { //OUTSET - if (parentZone != null) { // if (currentZone.getHeightMap() != null && parentZone.getHeightMap() != null && parentZone.getParent() != null && parentZone.getParent().getHeightMap() != null) @@ -494,11 +468,9 @@ public class HeightMap { float scaleChild = (float) ((scale + 1) * .5); float scaleParent = 1 - scaleChild; - float parentAltitude = parentZone.getHeightMap().getInterpolatedTerrainHeight(parentLoc); float parentCenterAltitude = parentZone.getHeightMap().getInterpolatedTerrainHeight(ZoneManager.worldToZoneSpace(currentZone.getLoc(), parentZone)); - parentCenterAltitude += currentZone.getYCoord(); parentCenterAltitude += interaltitude; @@ -530,7 +502,6 @@ public class HeightMap { } } - return realWorldAltitude; }