Smooth out elevation interpolation

This commit is contained in:
dfsek 2020-11-11 02:35:46 -07:00
parent 922f971c8e
commit 6b6b3fb3d4
2 changed files with 19 additions and 15 deletions

View File

@ -9,7 +9,7 @@ import org.polydev.gaea.math.Interpolator;
public class ElevationInterpolator {
private final UserDefinedGenerator[][] gens = new UserDefinedGenerator[7][7];
private final double[][] values = new double[16][16];
private final double[][] values = new double[18][18];
private final FastNoiseLite noise;
private final int xOrigin;
private final int zOrigin;
@ -25,16 +25,16 @@ public class ElevationInterpolator {
}
}
for(byte x = 0; x < 16; x++) {
for(byte z = 0; z < 16; z++) {
for(byte x = -1; x <= 16; x++) {
for(byte z = -1; z <= 16; z++) {
if(compareGens((x / 4) + 1, (z / 4) + 1)) {
Interpolator interpolator = new Interpolator(biomeAvg(x / 4, z / 4),
biomeAvg((x / 4) + 1, z / 4),
biomeAvg(x / 4, (z / 4) + 1),
biomeAvg((x / 4) + 1, (z / 4) + 1),
Interpolator.Type.LINEAR);
values[x][z] = interpolator.bilerp((double) (x % 4) / 4, (double) (z % 4) / 4);
} else values[x][z] = elevate(gens[x / 4][z / 4], xOrigin + x, zOrigin + z);
values[x + 1][z + 1] = interpolator.bilerp((double) (x % 4) / 4, (double) (z % 4) / 4);
} else values[x + 1][z + 1] = elevate(gens[x / 4][z / 4], xOrigin + x, zOrigin + z);
}
}
}
@ -63,7 +63,11 @@ public class ElevationInterpolator {
+ elevate(gens[x][z + 1], x * 4 - 4 + xOrigin, z * 4 + zOrigin)
+ elevate(gens[x + 1][z + 2], x * 4 + xOrigin, z * 4 + 4 + zOrigin)
+ elevate(gens[x + 1][z], x * 4 + xOrigin, z * 4 - 4 + zOrigin)
+ elevate(gens[x + 1][z + 1], x * 4 + xOrigin, z * 4 + zOrigin)) / 5D;
+ elevate(gens[x + 1][z + 1], x * 4 + xOrigin, z * 4 + zOrigin)
+ elevate(gens[x][z], x * 4 + xOrigin, z * 4 + zOrigin)
+ elevate(gens[x][z + 2], x * 4 + xOrigin, z * 4 + zOrigin)
+ elevate(gens[x + 2][z], x * 4 + xOrigin, z * 4 + zOrigin)
+ elevate(gens[x + 2][z + 2], x * 4 + xOrigin, z * 4 + zOrigin)) / 9D;
}
private double elevate(UserDefinedGenerator g, int x, int z) {
@ -72,6 +76,6 @@ public class ElevationInterpolator {
}
public double getElevation(int x, int z) {
return values[x][z];
return values[x - 1][z - 1];
}
}

View File

@ -80,19 +80,19 @@ public class TerraChunkGenerator extends GaeaChunkGenerator {
popMan.attachProfiler(p);
}
private static Palette<BlockData> getPalette(int x, int y, int z, BiomeConfig c, ChunkInterpolator interpolator, int elevate) {
private static Palette<BlockData> getPalette(int x, int y, int z, BiomeConfig c, ChunkInterpolator interpolator, ElevationInterpolator elevationInterpolator) {
Palette<BlockData> slant = c.getSlant();
if(slant != null) {
double xzOffset = c.getXZSlantOffset();
boolean north = interpolator.getNoise(x, y + elevate, z + xzOffset) > 0;
boolean south = interpolator.getNoise(x, y + elevate, z - xzOffset) > 0;
boolean east = interpolator.getNoise(x + xzOffset, y + elevate, z) > 0;
boolean west = interpolator.getNoise(x - xzOffset, y + elevate, z) > 0;
boolean north = interpolator.getNoise(x, y + elevationInterpolator.getElevation(x, (int) (z + xzOffset)), z + xzOffset) > 0;
boolean south = interpolator.getNoise(x, y + elevationInterpolator.getElevation(x, (int) (z - xzOffset)), z - xzOffset) > 0;
boolean east = interpolator.getNoise(x + xzOffset, y + elevationInterpolator.getElevation((int) (x + xzOffset), z), z) > 0;
boolean west = interpolator.getNoise(x - xzOffset, y + elevationInterpolator.getElevation((int) (x - xzOffset), z), z) > 0;
double ySlantOffsetTop = c.getYSlantOffsetTop();
double ySlantOffsetBottom = c.getYSlantOffsetBottom();
boolean top = interpolator.getNoise(x, y + ySlantOffsetTop + elevate, z) > 0;
boolean bottom = interpolator.getNoise(x, y - ySlantOffsetBottom + elevate, z) > 0;
boolean top = interpolator.getNoise(x, y + ySlantOffsetTop + elevationInterpolator.getElevation(x, z), z) > 0;
boolean bottom = interpolator.getNoise(x, y - ySlantOffsetBottom + elevationInterpolator.getElevation(x, z), z) > 0;
if((top && bottom) && (north || south || east || west) && (!(north && south && east && west))) return slant;
}
@ -161,7 +161,7 @@ public class TerraChunkGenerator extends GaeaChunkGenerator {
Palette<BlockData> seaPalette = c.getOcean().getOcean();
for(int y = world.getMaxHeight() - 1; y >= 0; y--) {
if(interpolator.getNoise(x, y - elevate, z) > 0) {
BlockData data = getPalette(x, y, z, c, interpolator, elevate).get(paletteLevel, cx, cz);
BlockData data = getPalette(x, y, z, c, interpolator, elevationInterpolator).get(paletteLevel, cx, cz);
chunk.setBlock(x, y, z, data);
if(paletteLevel == 0 && slab != null && y < 255) {
prepareBlockPart(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), slab.getSlabs(),