Browse Source

Test of raw heightmaps

magicbox-1.5.2
MagicBot 1 year ago
parent
commit
403bff27b4
  1. 91
      src/engine/InterestManagement/HeightMap.java

91
src/engine/InterestManagement/HeightMap.java

@ -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;
} }

Loading…
Cancel
Save