mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-18 10:32:30 +00:00
Smooth out elevation interpolation
This commit is contained in:
parent
922f971c8e
commit
6b6b3fb3d4
@ -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];
|
||||
}
|
||||
}
|
||||
|
@ -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(),
|
||||
|
Loading…
x
Reference in New Issue
Block a user