|
|
|
@ -25,8 +25,7 @@ public class Terrain {
@@ -25,8 +25,7 @@ public class Terrain {
|
|
|
|
|
public Vector2f cell_size = new Vector2f(); |
|
|
|
|
public Vector2f cell_count = new Vector2f(); |
|
|
|
|
public float terrain_scale; |
|
|
|
|
public Vector2f major_blend = new Vector2f(); |
|
|
|
|
public Vector2f minor_blend = new Vector2f(); |
|
|
|
|
public Vector2f blend_ratio = new Vector2f(); |
|
|
|
|
public int heightmap; |
|
|
|
|
Zone zone; |
|
|
|
|
|
|
|
|
@ -65,11 +64,21 @@ public class Terrain {
@@ -65,11 +64,21 @@ public class Terrain {
|
|
|
|
|
|
|
|
|
|
// Blending and height scaling configuration
|
|
|
|
|
|
|
|
|
|
this.major_blend.x = this.zone.max_blend / this.zone.major_radius; |
|
|
|
|
this.major_blend.y = this.zone.min_blend / this.zone.major_radius; |
|
|
|
|
Vector2f major_blend = new Vector2f(this.zone.max_blend / this.zone.major_radius, |
|
|
|
|
this.zone.min_blend / this.zone.major_radius); |
|
|
|
|
|
|
|
|
|
this.minor_blend.x = this.zone.max_blend / this.zone.minor_radius; |
|
|
|
|
this.minor_blend.y = this.zone.min_blend / this.zone.minor_radius; |
|
|
|
|
Vector2f minor_blend = new Vector2f(this.zone.max_blend / this.zone.minor_radius, |
|
|
|
|
this.zone.min_blend / this.zone.minor_radius); |
|
|
|
|
|
|
|
|
|
if (major_blend.y > 0.4f) |
|
|
|
|
blend_ratio.x = major_blend.y; |
|
|
|
|
else |
|
|
|
|
blend_ratio.x = Math.min(major_blend.x, 0.4f); |
|
|
|
|
|
|
|
|
|
if (minor_blend.y > 0.4f) |
|
|
|
|
blend_ratio.y = minor_blend.y; |
|
|
|
|
else |
|
|
|
|
blend_ratio.y = Math.min(minor_blend.x, 0.4f); |
|
|
|
|
|
|
|
|
|
this.terrain_scale = this.zone.terrain_max_y / 255f; |
|
|
|
|
} |
|
|
|
@ -123,10 +132,10 @@ public class Terrain {
@@ -123,10 +132,10 @@ public class Terrain {
|
|
|
|
|
|
|
|
|
|
// Blend between terrains
|
|
|
|
|
|
|
|
|
|
float blendFactor = terrainZone.terrain.terrainBlend(terrainOffset); |
|
|
|
|
float blendCoefficient = terrainZone.terrain.getTerrainBlendCoefficient(terrainOffset); |
|
|
|
|
|
|
|
|
|
float terrainHeight = interpolatedChildHeight * blendFactor; |
|
|
|
|
terrainHeight += interpolatedParentTerrainHeight * (1 - blendFactor); |
|
|
|
|
float terrainHeight = interpolatedChildHeight * blendCoefficient; |
|
|
|
|
terrainHeight += interpolatedParentTerrainHeight * (1 - blendCoefficient); |
|
|
|
|
|
|
|
|
|
return terrainHeight; |
|
|
|
|
|
|
|
|
@ -136,9 +145,6 @@ public class Terrain {
@@ -136,9 +145,6 @@ public class Terrain {
|
|
|
|
|
|
|
|
|
|
Zone currentZone = ZoneManager.findSmallestZone(world_loc); |
|
|
|
|
|
|
|
|
|
if (currentZone == null) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
return getWorldHeight(currentZone, world_loc); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
@ -188,37 +194,23 @@ public class Terrain {
@@ -188,37 +194,23 @@ public class Terrain {
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public float terrainBlend(Vector2f zone_offset) { |
|
|
|
|
public float getTerrainBlendCoefficient(Vector2f zone_offset) { |
|
|
|
|
|
|
|
|
|
// Normalize terrain offset
|
|
|
|
|
|
|
|
|
|
Vector2f normalizedOffset = new Vector2f(Math.abs(zone_offset.x) / this.zone.major_radius, |
|
|
|
|
Math.abs(zone_offset.y) / this.zone.minor_radius); |
|
|
|
|
|
|
|
|
|
float xval; |
|
|
|
|
|
|
|
|
|
if (this.major_blend.y > 0.4f) |
|
|
|
|
xval = this.major_blend.y; |
|
|
|
|
else |
|
|
|
|
xval = Math.min(this.major_blend.x, 0.4f); |
|
|
|
|
|
|
|
|
|
float yval; |
|
|
|
|
|
|
|
|
|
if (this.minor_blend.y > 0.4f) |
|
|
|
|
yval = this.minor_blend.y; |
|
|
|
|
else |
|
|
|
|
yval = Math.min(this.minor_blend.x, 0.4f); |
|
|
|
|
|
|
|
|
|
float value; |
|
|
|
|
|
|
|
|
|
if (normalizedOffset.x <= 1 - xval || normalizedOffset.x <= normalizedOffset.y) { |
|
|
|
|
if (normalizedOffset.x <= 1 - blend_ratio.x || normalizedOffset.x <= normalizedOffset.y) { |
|
|
|
|
|
|
|
|
|
if (normalizedOffset.y < 1 - yval) |
|
|
|
|
if (normalizedOffset.y < 1 - blend_ratio.y) |
|
|
|
|
return 1; |
|
|
|
|
|
|
|
|
|
value = (normalizedOffset.y - (1 - yval)) / yval; |
|
|
|
|
value = (normalizedOffset.y - (1 - blend_ratio.y)) / blend_ratio.y; |
|
|
|
|
} else |
|
|
|
|
value = (normalizedOffset.x - (1 - xval)) / xval; |
|
|
|
|
value = (normalizedOffset.x - (1 - blend_ratio.x)) / blend_ratio.x; |
|
|
|
|
|
|
|
|
|
value = (float) Math.atan((0.5f - value) * PI); |
|
|
|
|
|
|
|
|
|