9
0
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:
cyberpwn
2021-08-27 05:32:40 -04:00
parent 0a930db7d6
commit 524b63e88c
5 changed files with 95 additions and 24 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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) {

View File

@@ -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();
}
}