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 { public class ElevationInterpolator {
private final UserDefinedGenerator[][] gens = new UserDefinedGenerator[7][7]; 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 FastNoiseLite noise;
private final int xOrigin; private final int xOrigin;
private final int zOrigin; private final int zOrigin;
@ -25,16 +25,16 @@ public class ElevationInterpolator {
} }
} }
for(byte x = 0; x < 16; x++) { for(byte x = -1; x <= 16; x++) {
for(byte z = 0; z < 16; z++) { for(byte z = -1; z <= 16; z++) {
if(compareGens((x / 4) + 1, (z / 4) + 1)) { if(compareGens((x / 4) + 1, (z / 4) + 1)) {
Interpolator interpolator = new Interpolator(biomeAvg(x / 4, z / 4), Interpolator interpolator = new Interpolator(biomeAvg(x / 4, z / 4),
biomeAvg((x / 4) + 1, z / 4), biomeAvg((x / 4) + 1, z / 4),
biomeAvg(x / 4, (z / 4) + 1), biomeAvg(x / 4, (z / 4) + 1),
biomeAvg((x / 4) + 1, (z / 4) + 1), biomeAvg((x / 4) + 1, (z / 4) + 1),
Interpolator.Type.LINEAR); Interpolator.Type.LINEAR);
values[x][z] = interpolator.bilerp((double) (x % 4) / 4, (double) (z % 4) / 4); values[x + 1][z + 1] = interpolator.bilerp((double) (x % 4) / 4, (double) (z % 4) / 4);
} else values[x][z] = elevate(gens[x / 4][z / 4], xOrigin + x, zOrigin + z); } 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][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 + 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], 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) { private double elevate(UserDefinedGenerator g, int x, int z) {
@ -72,6 +76,6 @@ public class ElevationInterpolator {
} }
public double getElevation(int x, int z) { 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); 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(); Palette<BlockData> slant = c.getSlant();
if(slant != null) { if(slant != null) {
double xzOffset = c.getXZSlantOffset(); double xzOffset = c.getXZSlantOffset();
boolean north = interpolator.getNoise(x, y + elevate, z + xzOffset) > 0; boolean north = interpolator.getNoise(x, y + elevationInterpolator.getElevation(x, (int) (z + xzOffset)), z + xzOffset) > 0;
boolean south = interpolator.getNoise(x, y + elevate, 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 + elevate, z) > 0; boolean east = interpolator.getNoise(x + xzOffset, y + elevationInterpolator.getElevation((int) (x + xzOffset), z), z) > 0;
boolean west = interpolator.getNoise(x - xzOffset, y + elevate, z) > 0; boolean west = interpolator.getNoise(x - xzOffset, y + elevationInterpolator.getElevation((int) (x - xzOffset), z), z) > 0;
double ySlantOffsetTop = c.getYSlantOffsetTop(); double ySlantOffsetTop = c.getYSlantOffsetTop();
double ySlantOffsetBottom = c.getYSlantOffsetBottom(); double ySlantOffsetBottom = c.getYSlantOffsetBottom();
boolean top = interpolator.getNoise(x, y + ySlantOffsetTop + elevate, z) > 0; boolean top = interpolator.getNoise(x, y + ySlantOffsetTop + elevationInterpolator.getElevation(x, z), z) > 0;
boolean bottom = interpolator.getNoise(x, y - ySlantOffsetBottom + elevate, 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; 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(); Palette<BlockData> seaPalette = c.getOcean().getOcean();
for(int y = world.getMaxHeight() - 1; y >= 0; y--) { for(int y = world.getMaxHeight() - 1; y >= 0; y--) {
if(interpolator.getNoise(x, y - elevate, z) > 0) { 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); chunk.setBlock(x, y, z, data);
if(paletteLevel == 0 && slab != null && y < 255) { if(paletteLevel == 0 && slab != null && y < 255) {
prepareBlockPart(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), slab.getSlabs(), prepareBlockPart(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), slab.getSlabs(),