|
|
@ -39,18 +39,24 @@ public class Terrain { |
|
|
|
|
|
|
|
|
|
|
|
this.heightmap = this.zone.terrain_image; |
|
|
|
this.heightmap = this.zone.terrain_image; |
|
|
|
|
|
|
|
|
|
|
|
// Configure PLANAR
|
|
|
|
// Configure PLANAR zones to use the same
|
|
|
|
|
|
|
|
// 16x16 pixel image that all other flat
|
|
|
|
|
|
|
|
// terrains share.
|
|
|
|
|
|
|
|
|
|
|
|
if (this.zone.terrain_type.equals("PLANAR")) |
|
|
|
if (this.zone.terrain_type.equals("PLANAR")) |
|
|
|
this.heightmap = 1006300; |
|
|
|
this.heightmap = 1006300; |
|
|
|
|
|
|
|
|
|
|
|
this.terrain_size.x = this.zone.major_radius * 2; |
|
|
|
// Load pixel data for this terrain from cache
|
|
|
|
this.terrain_size.y = this.zone.minor_radius * 2; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.terrain_pixel_data = Terrain._heightmap_pixel_cache.get(heightmap); |
|
|
|
this.terrain_pixel_data = Terrain._heightmap_pixel_cache.get(heightmap); |
|
|
|
|
|
|
|
|
|
|
|
if (terrain_pixel_data == null) |
|
|
|
if (terrain_pixel_data == null) |
|
|
|
Logger.error("Pixel map empty for zone: " + zone.getObjectUUID() + ":" + zone.zoneName); |
|
|
|
Logger.error("Pixel map empty for zone: " + this.zone.getObjectUUID() + ":" + this.zone.zoneName); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Configure terrain based on zone properties
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.terrain_size.x = this.zone.major_radius * 2; |
|
|
|
|
|
|
|
this.terrain_size.y = this.zone.minor_radius * 2; |
|
|
|
|
|
|
|
|
|
|
|
this.cell_count.x = this.terrain_pixel_data.length - 1; |
|
|
|
this.cell_count.x = this.terrain_pixel_data.length - 1; |
|
|
|
this.cell_count.y = this.terrain_pixel_data[0].length - 1; |
|
|
|
this.cell_count.y = this.terrain_pixel_data[0].length - 1; |
|
|
@ -67,6 +73,10 @@ public class Terrain { |
|
|
|
|
|
|
|
|
|
|
|
public static Zone getNextZoneWithTerrain(Zone zone) { |
|
|
|
public static Zone getNextZoneWithTerrain(Zone zone) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Not all zones have a terrain. Some are for display only
|
|
|
|
|
|
|
|
// and heights returned are from the parent heightmap. This
|
|
|
|
|
|
|
|
// is controlled in the JSON via the has_terrain_gen field.
|
|
|
|
|
|
|
|
|
|
|
|
Zone terrain_zone = zone; |
|
|
|
Zone terrain_zone = zone; |
|
|
|
|
|
|
|
|
|
|
|
if (zone == null) |
|
|
|
if (zone == null) |
|
|
@ -88,9 +98,7 @@ public class Terrain { |
|
|
|
|
|
|
|
|
|
|
|
Zone terrainZone; |
|
|
|
Zone terrainZone; |
|
|
|
|
|
|
|
|
|
|
|
// Retrieve the next zone with a heightmap attached.
|
|
|
|
// Retrieve the next zone with a terrain defined.
|
|
|
|
// Zones without a heightmap use the next zone up the
|
|
|
|
|
|
|
|
// tree to calculate heights from.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
terrainZone = getNextZoneWithTerrain(currentZone); |
|
|
|
terrainZone = getNextZoneWithTerrain(currentZone); |
|
|
|
|
|
|
|
|
|
|
@ -136,11 +144,10 @@ public class Terrain { |
|
|
|
|
|
|
|
|
|
|
|
Vector2f terrain_cell = getTerrainCell(terrainLoc); |
|
|
|
Vector2f terrain_cell = getTerrainCell(terrainLoc); |
|
|
|
|
|
|
|
|
|
|
|
int gridX = (int) Math.floor(terrain_cell.x); |
|
|
|
int pixel_x = (int) Math.floor(terrain_cell.x); |
|
|
|
int gridY = (int) Math.floor(terrain_cell.y); |
|
|
|
int pixel_t = (int) Math.floor(terrain_cell.y); |
|
|
|
|
|
|
|
|
|
|
|
float offsetX = terrain_cell.x % 1; |
|
|
|
Vector2f pixel_offset = new Vector2f(terrain_cell.x % 1, terrain_cell.y % 1); |
|
|
|
float offsetY = terrain_cell.y % 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//get 4 surrounding vertices from the pixel array.
|
|
|
|
//get 4 surrounding vertices from the pixel array.
|
|
|
|
|
|
|
|
|
|
|
@ -149,17 +156,17 @@ public class Terrain { |
|
|
|
float bottomLeftHeight; |
|
|
|
float bottomLeftHeight; |
|
|
|
float bottomRightHeight; |
|
|
|
float bottomRightHeight; |
|
|
|
|
|
|
|
|
|
|
|
topLeftHeight = terrain_pixel_data[gridX][gridY]; |
|
|
|
topLeftHeight = terrain_pixel_data[pixel_x][pixel_t]; |
|
|
|
topRightHeight = terrain_pixel_data[gridX + 1][gridY]; |
|
|
|
topRightHeight = terrain_pixel_data[pixel_x + 1][pixel_t]; |
|
|
|
bottomLeftHeight = terrain_pixel_data[gridX][gridY + 1]; |
|
|
|
bottomLeftHeight = terrain_pixel_data[pixel_x][pixel_t + 1]; |
|
|
|
bottomRightHeight = terrain_pixel_data[gridX + 1][gridY + 1]; |
|
|
|
bottomRightHeight = terrain_pixel_data[pixel_x + 1][pixel_t + 1]; |
|
|
|
|
|
|
|
|
|
|
|
// Interpolate between the 4 vertices
|
|
|
|
// Interpolate between the 4 vertices
|
|
|
|
|
|
|
|
|
|
|
|
interpolatedHeight = topLeftHeight * (1 - offsetX) * (1 - offsetY); |
|
|
|
interpolatedHeight = topLeftHeight * (1 - pixel_offset.x) * (1 - pixel_offset.y); |
|
|
|
interpolatedHeight += topRightHeight * (1 - offsetY) * (offsetX); |
|
|
|
interpolatedHeight += topRightHeight * (1 - pixel_offset.y) * (pixel_offset.x); |
|
|
|
interpolatedHeight += (bottomLeftHeight * (1 - offsetX) * offsetY); |
|
|
|
interpolatedHeight += (bottomLeftHeight * (1 - pixel_offset.x) * pixel_offset.y); |
|
|
|
interpolatedHeight += (bottomRightHeight * offsetY * offsetX); |
|
|
|
interpolatedHeight += (bottomRightHeight * pixel_offset.y * pixel_offset.x); |
|
|
|
|
|
|
|
|
|
|
|
interpolatedHeight *= this.terrain_scale; // Scale height
|
|
|
|
interpolatedHeight *= this.terrain_scale; // Scale height
|
|
|
|
|
|
|
|
|
|
|
|