| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -53,8 +53,6 @@ public class HeightMap { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    private float bucketWidthY; | 
					 | 
					 | 
					 | 
					    private float bucketWidthY; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    private final int zoneLoadID; | 
					 | 
					 | 
					 | 
					    private final int zoneLoadID; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    private float seaLevel = 0; | 
					 | 
					 | 
					 | 
					    private float seaLevel = 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    private final float outsetX; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    private final float outsetZ; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    private int[][] pixelColorValues; | 
					 | 
					 | 
					 | 
					    private int[][] pixelColorValues; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    public HeightMap(ResultSet rs) throws SQLException { | 
					 | 
					 | 
					 | 
					    public HeightMap(ResultSet rs) throws SQLException { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -65,9 +63,6 @@ public class HeightMap { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        int halfExtentsY = rs.getInt("zRadius"); | 
					 | 
					 | 
					 | 
					        int halfExtentsY = rs.getInt("zRadius"); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.zoneLoadID = rs.getInt("zoneLoadID"); | 
					 | 
					 | 
					 | 
					        this.zoneLoadID = rs.getInt("zoneLoadID"); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.seaLevel = rs.getFloat("seaLevel"); | 
					 | 
					 | 
					 | 
					        this.seaLevel = rs.getFloat("seaLevel"); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.outsetX = rs.getFloat("outsetX"); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.outsetZ = rs.getFloat("outsetZ"); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // Cache the full extents to avoid the calculation
 | 
					 | 
					 | 
					 | 
					        // Cache the full extents to avoid the calculation
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -90,16 +85,15 @@ public class HeightMap { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            Logger.error("***Error loading heightmap data for heightmap " + this.heightMapID + e); | 
					 | 
					 | 
					 | 
					            Logger.error("***Error loading heightmap data for heightmap " + this.heightMapID + e); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        } | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // We needed to flip the image as OpenGL and Shadowbane both use the bottom left corner as origin.
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // this.heightmapImage = MapLoader.flipImage(this.heightmapImage);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // Calculate the data we do not load from table
 | 
					 | 
					 | 
					 | 
					        // Calculate the data we do not load from table
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        float numOfBuckets = this.heightmapImage.getWidth() - 1; | 
					 | 
					 | 
					 | 
					        float numOfBucketsX = this.heightmapImage.getWidth() - 1; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        float calculatedWidth = this.fullExtentsX / numOfBuckets; | 
					 | 
					 | 
					 | 
					        float calculatedWidthX = this.fullExtentsX / numOfBucketsX; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.bucketWidthX = calculatedWidth; | 
					 | 
					 | 
					 | 
					        this.bucketWidthX = calculatedWidthX; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.bucketWidthY = this.bucketWidthX; // This makes no sense.
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        float numOfBucketsY = this.heightmapImage.getWidth() - 1; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        float calculatedWidthY = this.fullExtentsY / numOfBucketsY; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        this.bucketWidthX = calculatedWidthY; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // Generate pixel array from image data
 | 
					 | 
					 | 
					 | 
					        // Generate pixel array from image data
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -119,8 +113,6 @@ public class HeightMap { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        int halfExtentsY = (int) Enum.CityBoundsType.ZONE.extents; | 
					 | 
					 | 
					 | 
					        int halfExtentsY = (int) Enum.CityBoundsType.ZONE.extents; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.zoneLoadID = 0; | 
					 | 
					 | 
					 | 
					        this.zoneLoadID = 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.seaLevel = 0; | 
					 | 
					 | 
					 | 
					        this.seaLevel = 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.outsetX = 128; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.outsetZ = 128; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // Cache the full extents to avoid the calculation
 | 
					 | 
					 | 
					 | 
					        // Cache the full extents to avoid the calculation
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -152,8 +144,6 @@ public class HeightMap { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        int halfExtentsY = (int) zone.getBounds().getHalfExtents().y; | 
					 | 
					 | 
					 | 
					        int halfExtentsY = (int) zone.getBounds().getHalfExtents().y; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.zoneLoadID = 0; | 
					 | 
					 | 
					 | 
					        this.zoneLoadID = 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.seaLevel = 0; | 
					 | 
					 | 
					 | 
					        this.seaLevel = 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.outsetX = 0; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        this.outsetZ = 0; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        // Cache the full extents to avoid the calculation
 | 
					 | 
					 | 
					 | 
					        // Cache the full extents to avoid the calculation
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -209,8 +199,6 @@ public class HeightMap { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    public static float getWorldHeight(Zone currentZone, Vector3fImmutable worldLoc) { | 
					 | 
					 | 
					 | 
					    public static float getWorldHeight(Zone currentZone, Vector3fImmutable worldLoc) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        Vector2f parentLoc = new Vector2f(-1, -1); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (currentZone == null) | 
					 | 
					 | 
					 | 
					        if (currentZone == null) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            return 0; | 
					 | 
					 | 
					 | 
					            return 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -219,17 +207,12 @@ public class HeightMap { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (currentZone == ZoneManager.getSeaFloor()) | 
					 | 
					 | 
					 | 
					        if (currentZone == ZoneManager.getSeaFloor()) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            return currentZone.getAbsY(); | 
					 | 
					 | 
					 | 
					            return currentZone.getAbsY(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        Zone parentZone = getNextZoneWithTerrain(currentZone.getParent()); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        HeightMap heightMap = currentZone.getHeightMap(); | 
					 | 
					 | 
					 | 
					        HeightMap heightMap = currentZone.getHeightMap(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if ((heightMap == null) || (currentZone == ZoneManager.getSeaFloor())) | 
					 | 
					 | 
					 | 
					        if ((heightMap == null) || (currentZone == ZoneManager.getSeaFloor())) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            return currentZone.getAbsY(); | 
					 | 
					 | 
					 | 
					            return currentZone.getAbsY(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        Vector2f zoneLoc = ZoneManager.worldToZoneSpace(worldLoc, currentZone); | 
					 | 
					 | 
					 | 
					        Vector2f zoneLoc = ZoneManager.worldToZoneSpace(worldLoc, currentZone); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        Vector3fImmutable localLocFromCenter = ZoneManager.worldToLocal(worldLoc, currentZone); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if ((parentZone != null) && (parentZone.getHeightMap() != null)) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            parentLoc = ZoneManager.worldToZoneSpace(worldLoc, parentZone); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        float interaltitude = currentZone.getHeightMap().getInterpolatedTerrainHeight(zoneLoc); | 
					 | 
					 | 
					 | 
					        float interaltitude = currentZone.getHeightMap().getInterpolatedTerrainHeight(zoneLoc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -237,66 +220,6 @@ public class HeightMap { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        float realWorldAltitude = interaltitude + worldAltitude; | 
					 | 
					 | 
					 | 
					        float realWorldAltitude = interaltitude + worldAltitude; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        //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; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            float outsideGridSizeX = 1 - bucketScaleX; //32/256
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            float outsideGridSizeZ = 1 - bucketScaleZ; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            float weight; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            double scale; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            if (offsetX > outsideGridSizeX && offsetX > offsetZ) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                weight = (offsetX - outsideGridSizeX) / bucketScaleX; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                scale = Math.atan2((.5 - weight) * 3.1415927, 1); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                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; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                float firstScale = parentAltitude * scaleParent; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                float secondScale = parentCenterAltitude * scaleChild; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                float outsetALt = firstScale + secondScale; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                outsetALt += currentZone.getParent().worldAltitude; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                realWorldAltitude = outsetALt; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } else if (offsetZ > outsideGridSizeZ) { | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                weight = (offsetZ - outsideGridSizeZ) / bucketScaleZ; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                scale = Math.atan2((.5 - weight) * 3.1415927, 1); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                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; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                float firstScale = parentAltitude * scaleParent; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                float secondScale = parentCenterAltitude * scaleChild; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                float outsetALt = firstScale + secondScale; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                outsetALt += currentZone.getParent().worldAltitude; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                realWorldAltitude = outsetALt; | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        } | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return realWorldAltitude; | 
					 | 
					 | 
					 | 
					        return realWorldAltitude; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |