Caves in the mantle

This commit is contained in:
cyberpwn
2021-08-27 05:32:40 -04:00
parent 0a930db7d6
commit 524b63e88c
5 changed files with 95 additions and 24 deletions
@@ -27,6 +27,7 @@ import com.volmit.iris.engine.mantle.components.MantleFeatureComponent;
import com.volmit.iris.engine.mantle.components.MantleJigsawComponent; import com.volmit.iris.engine.mantle.components.MantleJigsawComponent;
import com.volmit.iris.engine.mantle.components.MantleObjectComponent; import com.volmit.iris.engine.mantle.components.MantleObjectComponent;
import com.volmit.iris.engine.object.biome.IrisBiome; import com.volmit.iris.engine.object.biome.IrisBiome;
import com.volmit.iris.engine.object.carving.IrisCarving;
import com.volmit.iris.engine.object.deposits.IrisDepositGenerator; import com.volmit.iris.engine.object.deposits.IrisDepositGenerator;
import com.volmit.iris.engine.object.feature.IrisFeaturePotential; import com.volmit.iris.engine.object.feature.IrisFeaturePotential;
import com.volmit.iris.engine.object.jigsaw.IrisJigsawStructurePlacement; import com.volmit.iris.engine.object.jigsaw.IrisJigsawStructurePlacement;
@@ -294,15 +295,36 @@ public class IrisEngineMantle implements EngineMantle {
x = Math.max(z, x); x = Math.max(z, x);
int u = x; int u = x;
int v = computeFeatureRange(); int v = computeFeatureRange();
int c = computeCarvingRange();
x = Math.max(jig, x); x = Math.max(jig, x);
x = Math.max(x, v); x = Math.max(x, v);
x = Math.max(x, c);
x = (Math.max(x, 16) + 16) >> 4; x = (Math.max(x, 16) + 16) >> 4;
x = x % 2 == 0 ? x + 1 : x; x = x % 2 == 0 ? x + 1 : x;
Iris.info("Parallax Size: " + x + " Chunks"); Iris.info("Parallax Size: " + x + " Chunks");
Iris.info(" Object Parallax Size: " + u + " (" + ((Math.max(u, 16) + 16) >> 4) + ")"); Iris.info(" Object Mantle Size: " + u + " (" + ((Math.max(u, 16) + 16) >> 4) + ")");
Iris.info(" Jigsaw Parallax Size: " + jig + " (" + ((Math.max(jig, 16) + 16) >> 4) + ")"); Iris.info(" Jigsaw Mantle Size: " + jig + " (" + ((Math.max(jig, 16) + 16) >> 4) + ")");
Iris.info(" Feature Parallax Size: " + v + " (" + ((Math.max(v, 16) + 16) >> 4) + ")"); Iris.info(" Feature Mantle Size: " + v + " (" + ((Math.max(v, 16) + 16) >> 4) + ")");
Iris.info(" Carving Mantle Size: " + c + " (" + ((Math.max(c, 16) + 16) >> 4) + ")");
return x; return x;
} }
private int computeCarvingRange() {
int m = 0;
m = Math.max(m, getDimension().getCarving().getMaxRange(getData()));
for(IrisRegion i : getDimension().getAllRegions(getEngine()))
{
m = Math.max(m, i.getCarving().getMaxRange(getData()));
}
for(IrisBiome i : getDimension().getAllBiomes(getEngine()))
{
m = Math.max(m, i.getCarving().getMaxRange(getData()));
}
return m;
}
} }
@@ -58,6 +58,6 @@ public class MantleCarvingComponent extends IrisMantleComponent {
@ChunkCoordinates @ChunkCoordinates
private void carve(IrisCarving carving, MantleWriter writer, RNG rng, int cx, int cz) { private void carve(IrisCarving carving, MantleWriter writer, RNG rng, int cx, int cz) {
carving.doCarving(writer, rng, cx << 4, cz << 4); carving.doCarving(writer, rng, getEngineMantle().getEngine(), cx << 4, cz << 4);
} }
} }
@@ -18,7 +18,10 @@
package com.volmit.iris.engine.object.carving; package com.volmit.iris.engine.object.carving;
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.mantle.MantleWriter; import com.volmit.iris.engine.mantle.MantleWriter;
import com.volmit.iris.engine.object.annotations.ArrayType;
import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.Desc;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.BlockCoordinates;
@@ -34,17 +37,29 @@ import lombok.experimental.Accessors;
@Desc("Represents a carving configuration") @Desc("Represents a carving configuration")
@Data @Data
public class IrisCarving { public class IrisCarving {
@ArrayType(type = IrisCavePlacer.class, min = 1)
@Desc("Define cave placers") @Desc("Define cave placers")
private KList<IrisCavePlacer> caves = new KList<>(); private KList<IrisCavePlacer> caves = new KList<>();
@BlockCoordinates @BlockCoordinates
public void doCarving(MantleWriter writer, RNG rng, int x, int z) { public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int z) {
if(caves.isNotEmpty()) if(caves.isNotEmpty())
{ {
for(IrisCavePlacer i : caves) for(IrisCavePlacer i : caves)
{ {
i.generateCave(); i.generateCave(writer, rng, engine, x, z);
} }
} }
} }
public int getMaxRange(IrisData data) {
int max = 0;
for(IrisCavePlacer i : caves)
{
max = Math.max(max, i.getSize(data));
}
return max;
}
} }
@@ -18,16 +18,28 @@
package com.volmit.iris.engine.object.carving; package com.volmit.iris.engine.object.carving;
import com.volmit.iris.Iris;
import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.loader.IrisRegistrant; import com.volmit.iris.core.loader.IrisRegistrant;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.mantle.MantleWriter;
import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.Desc;
import com.volmit.iris.engine.object.basic.IrisPosition;
import com.volmit.iris.engine.object.noise.IrisWorm; import com.volmit.iris.engine.object.noise.IrisWorm;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.data.B;
import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.json.JSONObject;
import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.noise.Worm3;
import com.volmit.iris.util.noise.WormIterator3;
import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.plugin.VolmitSender;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.Vector;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Accessors(chain = true) @Accessors(chain = true)
@@ -36,6 +48,7 @@ import lombok.experimental.Accessors;
@Desc("Translate objects") @Desc("Translate objects")
@Data @Data
public class IrisCave extends IrisRegistrant { public class IrisCave extends IrisRegistrant {
private static final BlockData CAVE_AIR = B.get("CAVE_AIR");
@Desc("Define the shape of this cave") @Desc("Define the shape of this cave")
private IrisWorm worm; private IrisWorm worm;
@@ -49,6 +62,27 @@ public class IrisCave extends IrisRegistrant {
return "Cave"; return "Cave";
} }
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) {
IrisData data = engine.getData();
WormIterator3 w = getWorm().iterate3D(rng, data, x, y, z);
KList<Vector> points = new KList<>();
int itr = 0;
while (w.hasNext()) {
itr++;
Worm3 wx = w.next();
points.add(new Vector(wx.getX().getPosition(), wx.getY().getPosition(), wx.getZ().getPosition()));
}
Iris.info(x + " " + y + " " + z + " /." + " POS: " + points.convert((i) -> "[" + i.getBlockX() + "," + i.getBlockY() + "," + i.getBlockZ() + "]").toString(", "));
writer.setLine(points.convert(IrisPosition::new), getWorm().getGirth().get(rng, x, z, data), true, CAVE_AIR);
// TODO decorate somehow
}
@Override @Override
public void scanForErrors(JSONObject p, VolmitSender sender) { public void scanForErrors(JSONObject p, VolmitSender sender) {
@@ -21,6 +21,7 @@ package com.volmit.iris.engine.object.carving;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.data.cache.AtomicCache;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.mantle.MantleWriter; import com.volmit.iris.engine.mantle.MantleWriter;
import com.volmit.iris.engine.object.annotations.Desc; import com.volmit.iris.engine.object.annotations.Desc;
import com.volmit.iris.engine.object.annotations.MinNumber; import com.volmit.iris.engine.object.annotations.MinNumber;
@@ -28,6 +29,9 @@ import com.volmit.iris.engine.object.annotations.RegistryListResource;
import com.volmit.iris.engine.object.annotations.Required; import com.volmit.iris.engine.object.annotations.Required;
import com.volmit.iris.engine.object.basic.IrisPosition; import com.volmit.iris.engine.object.basic.IrisPosition;
import com.volmit.iris.engine.object.common.IRare; import com.volmit.iris.engine.object.common.IRare;
import com.volmit.iris.engine.object.noise.IrisGeneratorStyle;
import com.volmit.iris.engine.object.noise.IrisStyledRange;
import com.volmit.iris.engine.object.noise.NoiseStyle;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.B;
import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.mantle.Mantle;
@@ -49,8 +53,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
@Desc("Translate objects") @Desc("Translate objects")
@Data @Data
public class IrisCavePlacer implements IRare { public class IrisCavePlacer implements IRare {
private static final BlockData CAVE_AIR = B.get("CAVE_AIR");
@Required @Required
@Desc("Typically a 1 in RARITY on a per chunk basis") @Desc("Typically a 1 in RARITY on a per chunk basis")
@MinNumber(1) @MinNumber(1)
@@ -62,6 +64,12 @@ public class IrisCavePlacer implements IRare {
@RegistryListResource(IrisCave.class) @RegistryListResource(IrisCave.class)
private String cave; private String cave;
@Desc("If set to true, this cave is allowed to break the surface")
private boolean breakSurface = true;
@Desc("The height range this cave can spawn at. If breakSurface is false, the output of this range will be clamped by the current world height to prevent surface breaking.")
private IrisStyledRange caveStartHeight = new IrisStyledRange(13, 120, new IrisGeneratorStyle(NoiseStyle.STATIC));
private transient final AtomicCache<IrisCave> caveCache = new AtomicCache<>(); private transient final AtomicCache<IrisCave> caveCache = new AtomicCache<>();
private transient final AtomicBoolean fail = new AtomicBoolean(false); private transient final AtomicBoolean fail = new AtomicBoolean(false);
@@ -69,11 +77,12 @@ public class IrisCavePlacer implements IRare {
return caveCache.aquire(() -> data.getCaveLoader().load(getCave())); return caveCache.aquire(() -> data.getCaveLoader().load(getCave()));
} }
public void generateCave(MantleWriter mantle, RNG rng, IrisData data, int x, int y, int z) { public void generateCave(MantleWriter mantle, RNG rng, Engine engine, int x, int z) {
if (fail.get()) { if (fail.get()) {
return; return;
} }
IrisData data = engine.getData();
IrisCave cave = getRealCave(data); IrisCave cave = getRealCave(data);
if (cave == null) { if (cave == null) {
@@ -82,21 +91,12 @@ public class IrisCavePlacer implements IRare {
return; return;
} }
WormIterator3 w = cave.getWorm().iterate3D(rng, data, x, y, z); int h = (int) caveStartHeight.get(rng,x, z,data);
KList<Vector> points = new KList<>(); int ma = (int) (engine.getComplex().getHeightStream().get(x, z) - 9);
int itr = 0; cave.generate(mantle, rng, engine, x, Math.min(h, ma), z);
while (w.hasNext()) { }
itr++;
Worm3 wx = w.next();
points.add(new Vector(wx.getX().getPosition(), wx.getY().getPosition(), wx.getZ().getPosition()));
}
public int getSize(IrisData data) {
Iris.info(x + " " + y + " " + z + " /." + " POS: " + points.convert((i) -> "[" + i.getBlockX() + "," + i.getBlockY() + "," + i.getBlockZ() + "]").toString(", ")); return getRealCave(data).getWorm().getMaxDistance();
mantle.setLine(points.convert(IrisPosition::new), cave.getWorm().getGirth().get(rng, x, z, data), true, CAVE_AIR);
// TODO decorate somehow
} }
} }