diff --git a/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java b/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java index 5cdaf60ee..2bd45ea6e 100644 --- a/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java +++ b/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java @@ -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]; } } diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index 62aa6e9bb..4ceded741 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -80,19 +80,19 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { popMan.attachProfiler(p); } - private static Palette getPalette(int x, int y, int z, BiomeConfig c, ChunkInterpolator interpolator, int elevate) { + private static Palette getPalette(int x, int y, int z, BiomeConfig c, ChunkInterpolator interpolator, ElevationInterpolator elevationInterpolator) { Palette 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 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(),