9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-29 20:19:06 +00:00

Rivers & Lakes

This commit is contained in:
Daniel Mills
2020-09-02 02:31:17 -04:00
parent 9be6e12a5c
commit 6d3a35517b
12 changed files with 260 additions and 52 deletions

View File

@@ -114,7 +114,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
}
KList<BlockData> layers = biome.generateLayers(rx, rz, masterRandom, height, height - getFluidHeight());
KList<BlockData> seaLayers = biome.isSea() || biome.isShore() ? biome.generateSeaLayers(rx, rz, masterRandom, fluidHeight - height) : new KList<>();
KList<BlockData> seaLayers = biome.isAquatic() || biome.isShore() ? biome.generateSeaLayers(rx, rz, masterRandom, fluidHeight - height) : new KList<>();
boolean caverning = false;
KList<Integer> cavernHeights = new KList<>();
int lastCavernHeight = -1;
@@ -510,34 +510,33 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
double wz = getModifiedZ(x, z);
IrisRegion region = sampleRegion(x, z);
double sh = region.getShoreHeight(wx, wz);
double shMax = getFluidHeight() + (sh / 2);
double shMin = getFluidHeight() - (sh / 2);
IrisBiome current = sampleBiome(x, z);
InferredType aquaticType = current.isAquatic() ? (current.isSea() ? InferredType.SEA : current.isRiver() ? InferredType.RIVER : InferredType.LAKE) : InferredType.SEA;
boolean sea = height <= getFluidHeight();
boolean shore = height >= shMin && height <= shMax;
boolean land = height > getFluidHeight();
if(current.isShore() && height > sh)
// Remove rivers, lakes & sea from land
if(current.isAquatic() && land)
{
return glBiome.generateData(InferredType.LAND, wx, wz, x, z, region);
current = glBiome.generateData(InferredType.LAND, wx, wz, x, z, region);
}
if(current.isShore() || current.isLand() && height <= getDimension().getFluidHeight())
// Remove land from underwater
if(current.isLand() && sea)
{
return glBiome.generateData(InferredType.SEA, wx, wz, x, z, region);
current = glBiome.generateData(aquaticType, wx, wz, x, z, region);
}
if(current.isSea() && height > getDimension().getFluidHeight())
// Add shores to land
if(shore)
{
return glBiome.generateData(InferredType.LAND, wx, wz, x, z, region);
current = glBiome.generateData(InferredType.SHORE, wx, wz, x, z, region);
}
if(height <= getDimension().getFluidHeight())
{
return glBiome.generateData(InferredType.SEA, wx, wz, x, z, region);
}
if(height <= getDimension().getFluidHeight() + sh)
{
return glBiome.generateData(InferredType.SHORE, wx, wz, x, z, region);
}
return glBiome.generateRegionData(wx, wz, x, z, region);
return current;
}
public IrisBiome sampleCaveBiome(int x, int z)
@@ -586,22 +585,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator
return focus();
}
return getCache().getBiome(x, z, () ->
{
double wx = getModifiedX(x, z);
double wz = getModifiedZ(x, z);
IrisRegion region = sampleRegion(x, z);
int height = (int) Math.round(noise);
double sh = region.getShoreHeight(wx, wz);
IrisBiome current = sampleTrueBiomeBase(x, z, height);
if(current.isSea() && height > getDimension().getFluidHeight() - sh)
{
return glBiome.generateData(InferredType.SHORE, wx, wz, x, z, region);
}
return current;
});
return getCache().getBiome(x, z, () -> sampleTrueBiomeBase(x, z, (int) Math.round(noise)));
}
@Override

View File

@@ -10,6 +10,7 @@ import org.bukkit.block.data.BlockData;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
import org.bukkit.generator.ChunkGenerator.ChunkData;
import com.volmit.iris.Iris;
import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.util.B;
import com.volmit.iris.util.HeightMap;
@@ -118,6 +119,7 @@ public class AtomicSliver
{
return;
}
setSilently(h, d);
modified = true;
lock.lock();
@@ -134,6 +136,7 @@ public class AtomicSliver
if(d == null)
{
Iris.warn("Null set at " + h + " of " + x + " " + z);
return;
}
@@ -361,14 +364,16 @@ public class AtomicSliver
return;
}
lock.lock();
for(int i = 0; i < 256; i++)
for(int i : block.keySet())
{
if(block.get(i) != null && !block.get(i).equals(AIR))
BlockData b = block.get(i);
if(b != null)
{
BlockData b = block.get(i);
currentData.setBlock(x, i, z, b);
}
}
lock.unlock();
}

View File

@@ -22,20 +22,28 @@ public class GenLayerBiome extends GenLayer
{
private CNG regionGenerator;
private CNG bridgeGenerator;
private RNG lakeRandom;
private RNG riverRandom;
private BiomeDataProvider seaProvider;
private BiomeDataProvider landProvider;
private BiomeDataProvider shoreProvider;
private BiomeDataProvider caveProvider;
private BiomeDataProvider riverProvider;
private BiomeDataProvider lakeProvider;
private DimensionChunkGenerator iris;
public GenLayerBiome(DimensionChunkGenerator iris, RNG rng)
{
super(iris, rng);
this.iris = iris;
riverRandom = iris.getMasterRandom().nextParallelRNG(-324778);
lakeRandom = iris.getMasterRandom().nextParallelRNG(-868778);
seaProvider = new BiomeDataProvider(this, InferredType.SEA, rng);
landProvider = new BiomeDataProvider(this, InferredType.LAND, rng);
shoreProvider = new BiomeDataProvider(this, InferredType.SHORE, rng);
caveProvider = new BiomeDataProvider(this, InferredType.CAVE, rng);
riverProvider = new BiomeDataProvider(this, InferredType.RIVER, rng);
lakeProvider = new BiomeDataProvider(this, InferredType.LAKE, rng);
regionGenerator = iris.getDimension().getRegionStyle().create(rng.nextParallelRNG(1188519)).bake().scale(1D / iris.getDimension().getRegionZoom());
bridgeGenerator = iris.getDimension().getContinentalStyle().create(rng.nextParallelRNG(1541462)).bake().scale(1D / iris.getDimension().getContinentZoom());
}
@@ -86,6 +94,16 @@ public class GenLayerBiome extends GenLayer
return caveProvider;
}
else if(type.equals(InferredType.RIVER))
{
return riverProvider;
}
else if(type.equals(InferredType.LAKE))
{
return lakeProvider;
}
else
{
Iris.error("Cannot find a BiomeDataProvider for type " + type.name());
@@ -99,12 +117,13 @@ public class GenLayerBiome extends GenLayer
return generateData(getType(bx, bz, regionData), bx, bz, rawX, rawZ, regionData);
}
public InferredType getType(double bx, double bz, IrisRegion regionData)
public InferredType getType(double bx, double bz, IrisRegion region)
{
double x = bx;
double z = bz;
double c = iris.getDimension().getLandChance();
InferredType bridge;
if(c >= 1)
{
bridge = InferredType.LAND;
@@ -117,6 +136,16 @@ public class GenLayerBiome extends GenLayer
bridge = bridgeGenerator.fitDouble(0, 1, x, z) < c ? InferredType.LAND : InferredType.SEA;
if(bridge.equals(InferredType.LAND) && region.isLake(lakeRandom, x, z))
{
bridge = InferredType.LAKE;
}
if(bridge.equals(InferredType.LAND) && region.isRiver(riverRandom, x, z))
{
bridge = InferredType.RIVER;
}
return bridge;
}

View File

@@ -35,7 +35,7 @@ public class PostFloatingNibDeleter extends IrisPostBlockFilter
{
return;
}
int ha = highestTerrainBlock(x + 1, z);
int hb = highestTerrainBlock(x, z + 1);
int hc = highestTerrainBlock(x - 1, z);