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 {
|
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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user