diff --git a/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java b/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java index 4ae977893..f3365893d 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java @@ -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; + } } diff --git a/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java b/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java index cf0567b29..208fc27d2 100644 --- a/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java +++ b/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java @@ -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); } } diff --git a/src/main/java/com/volmit/iris/engine/object/carving/IrisCarving.java b/src/main/java/com/volmit/iris/engine/object/carving/IrisCarving.java index 4ca08713e..a38194edc 100644 --- a/src/main/java/com/volmit/iris/engine/object/carving/IrisCarving.java +++ b/src/main/java/com/volmit/iris/engine/object/carving/IrisCarving.java @@ -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 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; + } } diff --git a/src/main/java/com/volmit/iris/engine/object/carving/IrisCave.java b/src/main/java/com/volmit/iris/engine/object/carving/IrisCave.java index 44924e5fb..97d4a7d9c 100644 --- a/src/main/java/com/volmit/iris/engine/object/carving/IrisCave.java +++ b/src/main/java/com/volmit/iris/engine/object/carving/IrisCave.java @@ -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 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) { diff --git a/src/main/java/com/volmit/iris/engine/object/carving/IrisCavePlacer.java b/src/main/java/com/volmit/iris/engine/object/carving/IrisCavePlacer.java index fedf5ce84..6840f4085 100644 --- a/src/main/java/com/volmit/iris/engine/object/carving/IrisCavePlacer.java +++ b/src/main/java/com/volmit/iris/engine/object/carving/IrisCavePlacer.java @@ -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 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 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(); } }