mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-12-26 18:49:06 +00:00
Caves in the mantle
This commit is contained in:
@@ -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.MantleObjectComponent;
|
||||
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.feature.IrisFeaturePotential;
|
||||
import com.volmit.iris.engine.object.jigsaw.IrisJigsawStructurePlacement;
|
||||
@@ -294,15 +295,36 @@ public class IrisEngineMantle implements EngineMantle {
|
||||
x = Math.max(z, x);
|
||||
int u = x;
|
||||
int v = computeFeatureRange();
|
||||
int c = computeCarvingRange();
|
||||
x = Math.max(jig, x);
|
||||
x = Math.max(x, v);
|
||||
x = Math.max(x, c);
|
||||
x = (Math.max(x, 16) + 16) >> 4;
|
||||
x = x % 2 == 0 ? x + 1 : x;
|
||||
Iris.info("Parallax Size: " + x + " Chunks");
|
||||
Iris.info(" Object Parallax Size: " + u + " (" + ((Math.max(u, 16) + 16) >> 4) + ")");
|
||||
Iris.info(" Jigsaw Parallax Size: " + jig + " (" + ((Math.max(jig, 16) + 16) >> 4) + ")");
|
||||
Iris.info(" Feature Parallax Size: " + v + " (" + ((Math.max(v, 16) + 16) >> 4) + ")");
|
||||
Iris.info(" Object Mantle Size: " + u + " (" + ((Math.max(u, 16) + 16) >> 4) + ")");
|
||||
Iris.info(" Jigsaw Mantle Size: " + jig + " (" + ((Math.max(jig, 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;
|
||||
}
|
||||
|
||||
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
|
||||
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;
|
||||
|
||||
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.object.annotations.ArrayType;
|
||||
import com.volmit.iris.engine.object.annotations.Desc;
|
||||
import com.volmit.iris.util.collection.KList;
|
||||
import com.volmit.iris.util.documentation.BlockCoordinates;
|
||||
@@ -34,17 +37,29 @@ import lombok.experimental.Accessors;
|
||||
@Desc("Represents a carving configuration")
|
||||
@Data
|
||||
public class IrisCarving {
|
||||
@ArrayType(type = IrisCavePlacer.class, min = 1)
|
||||
@Desc("Define cave placers")
|
||||
private KList<IrisCavePlacer> caves = new KList<>();
|
||||
|
||||
@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())
|
||||
{
|
||||
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;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.core.loader.IrisData;
|
||||
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.basic.IrisPosition;
|
||||
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.math.RNG;
|
||||
import com.volmit.iris.util.noise.Worm3;
|
||||
import com.volmit.iris.util.noise.WormIterator3;
|
||||
import com.volmit.iris.util.plugin.VolmitSender;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Accessors(chain = true)
|
||||
@@ -36,6 +48,7 @@ import lombok.experimental.Accessors;
|
||||
@Desc("Translate objects")
|
||||
@Data
|
||||
public class IrisCave extends IrisRegistrant {
|
||||
private static final BlockData CAVE_AIR = B.get("CAVE_AIR");
|
||||
@Desc("Define the shape of this cave")
|
||||
private IrisWorm worm;
|
||||
|
||||
@@ -49,6 +62,27 @@ public class IrisCave extends IrisRegistrant {
|
||||
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
|
||||
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.core.loader.IrisData;
|
||||
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.object.annotations.Desc;
|
||||
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.basic.IrisPosition;
|
||||
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.data.B;
|
||||
import com.volmit.iris.util.mantle.Mantle;
|
||||
@@ -49,8 +53,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
@Desc("Translate objects")
|
||||
@Data
|
||||
public class IrisCavePlacer implements IRare {
|
||||
private static final BlockData CAVE_AIR = B.get("CAVE_AIR");
|
||||
|
||||
@Required
|
||||
@Desc("Typically a 1 in RARITY on a per chunk basis")
|
||||
@MinNumber(1)
|
||||
@@ -62,6 +64,12 @@ public class IrisCavePlacer implements IRare {
|
||||
@RegistryListResource(IrisCave.class)
|
||||
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 AtomicBoolean fail = new AtomicBoolean(false);
|
||||
|
||||
@@ -69,11 +77,12 @@ public class IrisCavePlacer implements IRare {
|
||||
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()) {
|
||||
return;
|
||||
}
|
||||
|
||||
IrisData data = engine.getData();
|
||||
IrisCave cave = getRealCave(data);
|
||||
|
||||
if (cave == null) {
|
||||
@@ -82,21 +91,12 @@ public class IrisCavePlacer implements IRare {
|
||||
return;
|
||||
}
|
||||
|
||||
WormIterator3 w = cave.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()));
|
||||
}
|
||||
int h = (int) caveStartHeight.get(rng,x, z,data);
|
||||
int ma = (int) (engine.getComplex().getHeightStream().get(x, z) - 9);
|
||||
cave.generate(mantle, rng, engine, x, Math.min(h, ma), z);
|
||||
}
|
||||
|
||||
|
||||
Iris.info(x + " " + y + " " + z + " /." + " POS: " + points.convert((i) -> "[" + i.getBlockX() + "," + i.getBlockY() + "," + i.getBlockZ() + "]").toString(", "));
|
||||
|
||||
mantle.setLine(points.convert(IrisPosition::new), cave.getWorm().getGirth().get(rng, x, z, data), true, CAVE_AIR);
|
||||
|
||||
|
||||
// TODO decorate somehow
|
||||
public int getSize(IrisData data) {
|
||||
return getRealCave(data).getWorm().getMaxDistance();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user