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

Carving Objects

This commit is contained in:
Daniel Mills
2020-09-11 12:59:37 -04:00
parent 1618d54b70
commit 1bafdf0feb
12 changed files with 161 additions and 22 deletions

View File

@@ -21,6 +21,7 @@ import com.volmit.iris.object.IrisRegion;
import com.volmit.iris.object.IrisStructurePlacement;
import com.volmit.iris.object.IrisTextPlacement;
import com.volmit.iris.util.BiomeMap;
import com.volmit.iris.util.CarveResult;
import com.volmit.iris.util.CaveResult;
import com.volmit.iris.util.ChunkPosition;
import com.volmit.iris.util.HeightMap;
@@ -240,6 +241,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
g = placeMutations(ro, random, i, j, g);
g = placeText(random, r, b, i, j, g);
g = placeObjects(random, r, b, i, j, g);
g = placeCarveObjects(random, r, b, i, j, g);
g = placeCaveObjects(ro, random, i, j, g);
g = placeStructures(randomx, r, b, i, j, g);
});
@@ -304,7 +306,7 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
{
for(IrisObjectPlacement k : b.getObjects())
{
placeObject(k, i, j, random.nextParallelRNG((34 * ((i * 30) + (j * 30) + g++) * i * j) + i - j + 3569222));
placeObject(k, i, j, random.nextParallelRNG((34 * ((i * 30) + (j * 30) + g++) * i * j) + i - j + 3566522));
}
for(IrisObjectPlacement k : r.getObjects())
@@ -315,6 +317,43 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
return g;
}
private int placeCarveObjects(RNG random, IrisRegion r, IrisBiome b, int i, int j, int g)
{
if(!getGlCarve().isCouldCarve())
{
return g;
}
KList<CarveResult> layers = getGlCarve().getCarveLayers((i * 16) + random.nextInt(16), (j * 16) + random.nextInt(16));
if(layers.isEmpty())
{
return g + 2;
}
for(CarveResult c : layers)
{
g = placeCarveObjects(random, r, b, i, j, g, c);
}
return g;
}
private int placeCarveObjects(RNG random, IrisRegion r, IrisBiome b, int i, int j, int g, CarveResult c)
{
for(IrisObjectPlacement k : b.getObjects())
{
placeCarveObject(k, i, j, random.nextParallelRNG((34 * ((i * 30) + (j * 30) + g++) * i * j) + i - j + 3569221 + g), c);
}
for(IrisObjectPlacement k : r.getObjects())
{
placeCarveObject(k, i, j, random.nextParallelRNG((34 * ((i * 30) + (j * 30) + g++) * i * j) + i - j + 3561222 + g), c);
}
return g;
}
private int placeCaveObjects(RNG ro, RNG random, int i, int j, int g)
{
if(!getDimension().isCaves())
@@ -370,6 +409,15 @@ public abstract class ParallaxTerrainProvider extends TopographicTerrainProvider
}
}
public void placeCarveObject(IrisObjectPlacement o, int x, int z, RNG rng, CarveResult c)
{
for(int i = 0; i < o.getTriesForChunk(rng); i++)
{
rng = rng.nextParallelRNG((i * 3 + 8) - 23040);
o.getSchematic(this, rng).place((x * 16) + rng.nextInt(16), (z * 16) + rng.nextInt(16), this, o, rng, c);
}
}
public void placeCaveObject(IrisObjectPlacement o, int x, int z, RNG rng)
{
for(int i = 0; i < o.getTriesForChunk(rng); i++)

View File

@@ -348,6 +348,11 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider
protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain)
{
super.onGenerate(random, x, z, terrain);
if(!getDimension().isVanillaCaves())
{
generateDeposits(random.nextParallelRNG(x * ((z * 39) + 10000)).nextParallelRNG(z + z - x), terrain, x, z);
}
}
private void decorateLand(IrisBiome biome, AtomicSliver sliver, double wx, int k, double wz, int rx, int rz, BlockData block)
@@ -538,16 +543,13 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider
protected void onPreParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map)
{
if(!getDimension().isVanillaCaves())
{
generateDeposits(random.nextParallelRNG(x).nextParallelRNG(z), terrain, x, z);
}
}
public void generateDeposits(RNG rx, TerrainChunk terrain, int x, int z)
{
PrecisionStopwatch p = PrecisionStopwatch.start();
RNG ro = rx.nextParallelRNG((x * x * x) - z);
RNG ro = rx.nextParallelRNG(x * x).nextParallelRNG(z * z);
IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7);
IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7);

View File

@@ -3,6 +3,7 @@ package com.volmit.iris.gen.layer;
import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings;
import com.volmit.iris.gen.DimensionalTerrainProvider;
import com.volmit.iris.gen.TopographicTerrainProvider;
import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.InferredType;
import com.volmit.iris.object.IrisBiome;
@@ -33,7 +34,7 @@ public class GenLayerBiome extends GenLayer
private BiomeDataProvider lakeProvider;
private DimensionalTerrainProvider iris;
public GenLayerBiome(@NonNull DimensionalTerrainProvider iris, @NonNull RNG rng)
public GenLayerBiome(@NonNull TopographicTerrainProvider iris, @NonNull RNG rng)
{
super(iris, rng);
this.iris = iris;

View File

@@ -1,17 +1,28 @@
package com.volmit.iris.gen.layer;
import com.volmit.iris.gen.DimensionalTerrainProvider;
import com.volmit.iris.gen.TopographicTerrainProvider;
import com.volmit.iris.object.IrisCarveLayer;
import com.volmit.iris.util.CarveResult;
import com.volmit.iris.util.GenLayer;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.RNG;
import lombok.Getter;
public class GenLayerCarve extends GenLayer
{
private static final KList<CarveResult> EMPTY_LIST = new KList<>();
@Getter
private boolean couldCarve;
@Getter
private int minimum;
@Getter
private int maximum;
public GenLayerCarve(DimensionalTerrainProvider iris, RNG rng)
public GenLayerCarve(TopographicTerrainProvider iris, RNG rng)
{
super(iris, rng);
@@ -36,6 +47,46 @@ public class GenLayerCarve extends GenLayer
return couldCarve && y <= maximum;
}
public KList<CarveResult> getCarveLayers(int x, int z)
{
if(!couldCarve)
{
return EMPTY_LIST;
}
KList<CarveResult> surfaces = new KList<>();
int terrainHeight = (int) Math.round(iris.getTerrainHeight(x, z));
boolean carving = false;
int lastCarve = terrainHeight + 1;
for(int i = Math.min(maximum, terrainHeight); i >= Math.max(minimum, 0); i--)
{
if(i <= 0 || i > 255)
{
continue;
}
boolean nowCarving = isCarved(x, i, z);
if(carving && !nowCarving)
{
if(lastCarve - i > 2 && !(i < terrainHeight && lastCarve - i > terrainHeight))
{
surfaces.add(new CarveResult(i, lastCarve - i));
}
}
if(nowCarving && !carving)
{
lastCarve = i;
}
carving = nowCarving;
}
return surfaces;
}
public int getSurfaceCarve(int x, int y, int z)
{
if(couldCarveBelow(x, y, z))

View File

@@ -5,8 +5,8 @@ import java.util.function.Function;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import com.volmit.iris.gen.DimensionalTerrainProvider;
import com.volmit.iris.gen.IrisTerrainProvider;
import com.volmit.iris.gen.TopographicTerrainProvider;
import com.volmit.iris.gen.atomics.AtomicSliver;
import com.volmit.iris.noise.FastNoiseDouble;
import com.volmit.iris.noise.FastNoiseDouble.CellularDistanceFunction;
@@ -27,7 +27,7 @@ public class GenLayerCave extends GenLayer
private static final KList<CaveResult> EMPTY = new KList<>();
private FastNoiseDouble gg;
public GenLayerCave(DimensionalTerrainProvider iris, RNG rng)
public GenLayerCave(TopographicTerrainProvider iris, RNG rng)
{
// @NoArgsConstructor
super(iris, rng);

View File

@@ -8,7 +8,7 @@ import java.awt.image.BufferedImage;
import org.bukkit.block.data.BlockData;
import com.volmit.iris.Iris;
import com.volmit.iris.gen.DimensionalTerrainProvider;
import com.volmit.iris.gen.TopographicTerrainProvider;
import com.volmit.iris.gen.atomics.AtomicCache;
import com.volmit.iris.object.IrisMaterialPalette;
import com.volmit.iris.object.IrisObject;
@@ -22,7 +22,7 @@ public class GenLayerText extends GenLayer
private AtomicCache<IrisObject> debug = new AtomicCache<>();
public GenLayerText(DimensionalTerrainProvider iris, RNG rng)
public GenLayerText(TopographicTerrainProvider iris, RNG rng)
{
super(iris, rng);
}