Reorganize

This commit is contained in:
Daniel Mills
2020-07-27 20:48:00 -04:00
parent e1067aeb83
commit dddbcdf088
138 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,182 @@
package ninja.bytecode.iris.layer;
import ninja.bytecode.iris.Iris;
import ninja.bytecode.iris.generator.DimensionChunkGenerator;
import ninja.bytecode.iris.object.InferredType;
import ninja.bytecode.iris.object.IrisBiome;
import ninja.bytecode.iris.object.IrisRegion;
import ninja.bytecode.iris.object.IrisRegionRidge;
import ninja.bytecode.iris.object.IrisRegionSpot;
import ninja.bytecode.iris.util.BiomeResult;
import ninja.bytecode.iris.util.CellGenerator;
import ninja.bytecode.iris.util.GenLayer;
import ninja.bytecode.iris.util.RNG;
import ninja.bytecode.shuriken.collections.KList;
public class GenLayerBiome extends GenLayer
{
private CellGenerator region;
private CellGenerator bridge;
private CellGenerator land;
private CellGenerator shore;
private CellGenerator sea;
private DimensionChunkGenerator iris;
public GenLayerBiome(DimensionChunkGenerator iris, RNG rng)
{
super(iris, rng);
this.iris = iris;
region = new CellGenerator(rng.nextParallelRNG(1188519));
bridge = new CellGenerator(rng.nextParallelRNG(1541462));
land = new CellGenerator(rng.nextParallelRNG(9045162));
shore = new CellGenerator(rng.nextParallelRNG(2342812));
sea = new CellGenerator(rng.nextParallelRNG(6135621));
}
public IrisRegion getRegion(double bx, double bz)
{
region.setShuffle(8);
region.setCellScale(0.33 / iris.getDimension().getRegionZoom());
double x = bx / iris.getDimension().getBiomeZoom();
double z = bz / iris.getDimension().getBiomeZoom();
String regionId = iris.getDimension().getRegions().get(region.getIndex(x, z, iris.getDimension().getRegions().size()));
return Iris.data.getRegionLoader().load(regionId);
}
public BiomeResult generateData(double bx, double bz, int rawX, int rawZ)
{
return generateRegionData(bx, bz, rawX, rawZ, getRegion(bx, bz));
}
public boolean isSea(double bx, double bz, IrisRegion regionData)
{
bridge.setShuffle(0);
bridge.setCellScale(0.33 / iris.getDimension().getContinentZoom());
double x = bx / iris.getDimension().getBiomeZoom();
double z = bz / iris.getDimension().getBiomeZoom();
return bridge.getIndex(x, z, 5) == 1;
}
public BiomeResult generateRegionData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData)
{
if(isSea(bx, bz, regionData))
{
return generateSeaData(bx, bz, rawX, rawZ, regionData);
}
else
{
return generateLandData(bx, bz, rawX, rawZ, regionData);
}
}
public BiomeResult generateBiomeData(double bx, double bz, IrisRegion regionData, CellGenerator cell, KList<String> biomes, InferredType inferredType)
{
double x = bx / iris.getDimension().getBiomeZoom();
double z = bz / iris.getDimension().getBiomeZoom();
IrisBiome biome = Iris.data.getBiomeLoader().load(biomes.get(sea.getIndex(x, z, biomes.size())));
biome.setInferredType(inferredType);
return implode(bx, bz, regionData, cell, new BiomeResult(biome, cell.getDistance(x, z)));
}
public BiomeResult generatePureSeaData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData)
{
sea.setShuffle(42);
sea.setCellScale(0.56 / iris.getDimension().getSeaZoom());
return generateBiomeData(bx, bz, regionData, sea, regionData.getSeaBiomes(), InferredType.SEA);
}
public BiomeResult generateImpureData(int rawX, int rawZ, InferredType type, IrisRegion regionData, BiomeResult pureResult)
{
for(IrisRegionRidge i : regionData.getRidgeBiomes())
{
if(i.getType().equals(type) && i.isRidge(rng, rawX, rawZ))
{
return new BiomeResult(Iris.data.getBiomeLoader().load(i.getBiome()).infer(i.getAs(), type), 0.5);
}
}
for(IrisRegionSpot i : regionData.getSpotBiomes())
{
if(i.getType().equals(type) && i.isSpot(rng, rawX, rawZ))
{
return new BiomeResult(Iris.data.getBiomeLoader().load(i.getBiome()).infer(i.getAs(), type), 0.5);
}
}
return pureResult;
}
public BiomeResult generateSeaData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData)
{
return generateImpureData(rawX, rawZ, InferredType.SEA, regionData, generatePureSeaData(bx, bz, rawX, rawZ, regionData));
}
public BiomeResult generatePureLandData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData)
{
land.setShuffle(12);
land.setCellScale(0.6 / iris.getDimension().getLandZoom());
return generateBiomeData(bx, bz, regionData, land, regionData.getLandBiomes(), InferredType.LAND);
}
public BiomeResult generateLandData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData)
{
return generateImpureData(rawX, rawZ, InferredType.LAND, regionData, generatePureLandData(bx, bz, rawX, rawZ, regionData));
}
public BiomeResult generatePureShoreData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData)
{
shore.setShuffle(4);
shore.setCellScale(0.8 / iris.getDimension().getShoreZoom());
return generateBiomeData(bx, bz, regionData, shore, regionData.getShoreBiomes(), InferredType.SHORE);
}
public BiomeResult generateShoreData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData)
{
return generateImpureData(rawX, rawZ, InferredType.SHORE, regionData, generatePureShoreData(bx, bz, rawX, rawZ, regionData));
}
public BiomeResult implode(double bx, double bz, IrisRegion regionData, CellGenerator parentCell, BiomeResult parent)
{
return implode(bx, bz, regionData, parentCell, parent, 1);
}
public BiomeResult implode(double bx, double bz, IrisRegion regionData, CellGenerator parentCell, BiomeResult parent, int hits)
{
if(hits > 9)
{
return parent;
}
double x = bx / iris.getDimension().getBiomeZoom();
double z = bz / iris.getDimension().getBiomeZoom();
if(parent.getDistance() > regionData.getBiomeImplosionRatio())
{
if(!parent.getBiome().getChildren().isEmpty())
{
CellGenerator childCell = parent.getBiome().getChildrenGenerator(rng, 123, parentCell.getCellScale() * parent.getBiome().getChildShrinkFactor());
int r = childCell.getIndex(x, z, parent.getBiome().getChildren().size() + 1);
if(r == parent.getBiome().getChildren().size())
{
return new BiomeResult(parent.getBiome(), childCell.getDistance(x, z));
}
IrisBiome biome = Iris.data.getBiomeLoader().load(parent.getBiome().getChildren().get(r));
biome.setInferredType(parent.getBiome().getInferredType());
return implode(bx, bz, regionData, childCell, new BiomeResult(biome, childCell.getDistance(x, z)), hits + 1);
}
}
return parent;
}
@Override
public double generate(double x, double z)
{
return 0;
}
}

View File

@@ -0,0 +1,134 @@
package ninja.bytecode.iris.layer;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import ninja.bytecode.iris.generator.DimensionChunkGenerator;
import ninja.bytecode.iris.object.atomics.AtomicSliver;
import ninja.bytecode.iris.util.BlockDataTools;
import ninja.bytecode.iris.util.CNG;
import ninja.bytecode.iris.util.CaveResult;
import ninja.bytecode.iris.util.FastNoise;
import ninja.bytecode.iris.util.FastNoise.CellularDistanceFunction;
import ninja.bytecode.iris.util.FastNoise.CellularReturnType;
import ninja.bytecode.iris.util.FastNoise.NoiseType;
import ninja.bytecode.iris.util.GenLayer;
import ninja.bytecode.iris.util.RNG;
import ninja.bytecode.shuriken.collections.KList;
public class GenLayerCave extends GenLayer
{
public static final BlockData CAVE_AIR = BlockDataTools.getBlockData("CAVE_AIR");
public static final BlockData AIR = BlockDataTools.getBlockData("AIR");
private static final KList<CaveResult> EMPTY = new KList<>();
private CNG gincline;
private CNG shuffle;
private FastNoise gg;
public GenLayerCave(DimensionChunkGenerator iris, RNG rng)
{
//@builder
super(iris, rng);
shuffle = CNG.signature(rng.nextParallelRNG(1348566));
gincline = new CNG(rng.nextParallelRNG(26512), 1D, 3).scale(0.00452);
gg = new FastNoise(324895 * rng.nextParallelRNG(49678).imax());
//@done
}
public KList<CaveResult> genCaves(double wxx, double wzz, int x, int z, AtomicSliver data)
{
if(!iris.getDimension().isCaves())
{
return EMPTY;
}
KList<CaveResult> result = new KList<>();
shuffle.scale(0.01);
double shuffleDistance = 72;
gg.SetNoiseType(NoiseType.Cellular);
gg.SetCellularReturnType(CellularReturnType.Distance2Sub);
gg.SetCellularDistanceFunction(CellularDistanceFunction.Natural);
for(int i = 0; i < 2; i++)
{
double wx = wxx + (shuffle.noise(wxx, wzz) * shuffleDistance);
double wz = wzz + (shuffle.noise(wzz, wxx) * shuffleDistance);
double incline = 157;
double baseWidth = (9 * iris.getDimension().getCaveScale());
double distanceCheck = 0.0132 * baseWidth;
double distanceTake = 0.0032 * baseWidth;
double drop = (-i * 7) + 44 + iris.getDimension().getCaveShift();
double caveHeightNoise = incline * gincline.noise((wx + (10000 * i)), (wz - (10000 * i)));
caveHeightNoise += shuffle.fitDoubleD(-1, 1, wxx - caveHeightNoise, wzz + caveHeightNoise) * 3;
int ceiling = 0;
int floor = 256;
for(double tunnelHeight = 1; tunnelHeight <= baseWidth; tunnelHeight++)
{
double distance = (gg.GetCellular((float) wx + (10000 * i), (float) wz - (10000 * i)) + 1D) / 2D;
if(distance < distanceCheck - (tunnelHeight * distanceTake))
{
int caveHeight = (int) Math.round(caveHeightNoise - drop);
int pu = (int) (caveHeight + tunnelHeight);
int pd = (int) (caveHeight - tunnelHeight);
if(dig(x, pu, z, data))
{
ceiling = pu > ceiling ? pu : ceiling;
floor = pu < floor ? pu : floor;
}
if(dig(x, pd, z, data))
{
ceiling = pd > ceiling ? pd : ceiling;
floor = pd < floor ? pd : floor;
}
if(tunnelHeight == 1)
{
if(dig(x, (int) (caveHeight), z, data))
{
ceiling = caveHeight > ceiling ? caveHeight : ceiling;
floor = caveHeight < floor ? caveHeight : floor;
}
}
}
}
result.add(new CaveResult(floor, ceiling));
}
return result;
}
public boolean dig(int x, int y, int z, AtomicSliver data)
{
Material a = data.getType(y);
Material c = data.getType(y + 1);
Material f = data.getType(y - 1);
if(can(a) && canAir(c) && canAir(f))
{
data.set(y, CAVE_AIR);
return true;
}
return false;
}
public boolean canAir(Material m)
{
return (m.isSolid() || m.equals(Material.AIR) || m.equals(Material.CAVE_AIR)) && !m.equals(Material.BEDROCK);
}
public boolean can(Material m)
{
return m.isSolid() && !m.equals(Material.BEDROCK);
}
@Override
public double generate(double x, double z)
{
return 0;
}
}

View File

@@ -0,0 +1,37 @@
package ninja.bytecode.iris.layer.post;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import ninja.bytecode.iris.generator.PostBlockChunkGenerator;
import ninja.bytecode.iris.util.IrisPostBlockFilter;
public class PostNippleSmoother extends IrisPostBlockFilter
{
public PostNippleSmoother(PostBlockChunkGenerator gen)
{
super(gen);
}
@Override
public void onPost(int x, int z)
{
int h = highestTerrainBlock(x, z);
int ha = highestTerrainBlock(x + 1, z);
int hb = highestTerrainBlock(x, z + 1);
int hc = highestTerrainBlock(x - 1, z);
int hd = highestTerrainBlock(x, z - 1);
if(ha == h - 1 && hb == h - 1 && hc == h - 1 && hd == h - 1)
{
BlockData bc = getPostBlock(x, h, z);
BlockData b = getPostBlock(x, h + 1, z);
Material m = bc.getMaterial();
if(m.isSolid())
{
setPostBlock(x, h, z, b);
}
}
}
}

View File

@@ -0,0 +1,27 @@
package ninja.bytecode.iris.layer.post;
import ninja.bytecode.iris.generator.PostBlockChunkGenerator;
import ninja.bytecode.iris.util.IrisPostBlockFilter;
public class PostPotholeFiller extends IrisPostBlockFilter
{
public PostPotholeFiller(PostBlockChunkGenerator gen)
{
super(gen);
}
@Override
public void onPost(int x, int z)
{
int h = highestTerrainBlock(x, z);
int ha = highestTerrainBlock(x + 1, z);
int hb = highestTerrainBlock(x, z + 1);
int hc = highestTerrainBlock(x - 1, z);
int hd = highestTerrainBlock(x, z - 1);
if(ha == h + 1 && hb == h + 1 && hc == h + 1 && hd == h + 1)
{
setPostBlock(x, h + 1, z, getPostBlock(x, h, z));
}
}
}

View File

@@ -0,0 +1,50 @@
package ninja.bytecode.iris.layer.post;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Waterlogged;
import ninja.bytecode.iris.generator.PostBlockChunkGenerator;
import ninja.bytecode.iris.util.IrisPostBlockFilter;
import ninja.bytecode.iris.util.RNG;
public class PostSlabber extends IrisPostBlockFilter
{
public static final Material AIR = Material.AIR;
public static final Material WATER = Material.WATER;
private RNG rng;
public PostSlabber(PostBlockChunkGenerator gen)
{
super(gen);
rng = gen.getMasterRandom().nextParallelRNG(1239456);
}
@Override
public void onPost(int x, int z)
{
int h = highestTerrainBlock(x, z);
if(highestTerrainBlock(x + 1, z) == h + 1 || highestTerrainBlock(x, z + 1) == h + 1 || highestTerrainBlock(x - 1, z) == h + 1 || highestTerrainBlock(x, z - 1) == h + 1)
{
BlockData d = gen.sampleTrueBiome(x, z).getBiome().getSlab().get(rng, x, h, z);
if(d != null)
{
if(d.getMaterial().equals(AIR))
{
return;
}
if(d instanceof Waterlogged)
{
((Waterlogged) d).setWaterlogged(getPostBlock(x, h + 1, z).getMaterial().equals(Material.WATER));
}
if(getPostBlock(x, h + 2, z).getMaterial().equals(AIR) || getPostBlock(x, h + 2, z).getMaterial().equals(WATER))
{
setPostBlock(x, h + 1, z, d);
}
}
}
}
}

View File

@@ -0,0 +1,56 @@
package ninja.bytecode.iris.layer.post;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import ninja.bytecode.iris.generator.PostBlockChunkGenerator;
import ninja.bytecode.iris.object.IrisBiome;
import ninja.bytecode.iris.util.IrisPostBlockFilter;
import ninja.bytecode.iris.util.RNG;
public class PostWallPatcher extends IrisPostBlockFilter
{
public static final Material AIR = Material.AIR;
private RNG rng;
public PostWallPatcher(PostBlockChunkGenerator gen)
{
super(gen);
rng = gen.getMasterRandom().nextParallelRNG(1239456);
}
@Override
public void onPost(int x, int z)
{
IrisBiome biome = gen.sampleTrueBiome(x, z).getBiome();
if(!biome.getWall().getPalette().isEmpty())
{
int h = highestTerrainBlock(x, z);
int ha = highestTerrainBlock(x + 1, z);
int hb = highestTerrainBlock(x, z + 1);
int hc = highestTerrainBlock(x - 1, z);
int hd = highestTerrainBlock(x, z - 1);
if(ha < h - 2 || hb < h - 2 || hc < h - 2 || hd < h - 2)
{
int max = Math.abs(Math.max(h - ha, Math.max(h - hb, Math.max(h - hc, h - hd))));
for(int i = h; i > h - max; i--)
{
BlockData d = biome.getWall().get(rng, x + i, i + h, z + i);
if(d != null)
{
if(d.getMaterial().equals(AIR))
{
continue;
}
setPostBlock(x, i, z, d);
}
}
}
}
}
}