allow carving recursion

This commit is contained in:
Julian Krings 2025-06-09 23:25:33 +02:00
parent 113f25dab8
commit ccc3bab8e0
No known key found for this signature in database
GPG Key ID: 208C6E08C3B718D2
6 changed files with 47 additions and 32 deletions

View File

@ -58,21 +58,21 @@ 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, getEngineMantle().getEngine(), cx << 4, -1, cz << 4); carving.doCarving(writer, rng, getEngineMantle().getEngine(), cx << 4, -1, cz << 4, 0);
} }
private int computeRadius() { private int computeRadius() {
var dimension = getDimension(); var dimension = getDimension();
int max = 0; int max = 0;
max = Math.max(max, dimension.getCarving().getMaxRange(getData())); max = Math.max(max, dimension.getCarving().getMaxRange(getData(), 0));
for (var i : dimension.getAllRegions(this::getData)) { for (var i : dimension.getAllRegions(this::getData)) {
max = Math.max(max, i.getCarving().getMaxRange(getData())); max = Math.max(max, i.getCarving().getMaxRange(getData(), 0));
} }
for (var i : dimension.getAllBiomes(this::getData)) { for (var i : dimension.getAllBiomes(this::getData)) {
max = Math.max(max, i.getCarving().getMaxRange(getData())); max = Math.max(max, i.getCarving().getMaxRange(getData(), 0));
} }
return max; return max;

View File

@ -61,21 +61,25 @@ public class IrisCarving {
@BlockCoordinates @BlockCoordinates
public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) { public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int depth) {
doCarving(writer, rng, engine, x, y, z, -1); doCarving(writer, rng, engine, x, y, z, depth, -1);
} }
@BlockCoordinates @BlockCoordinates
public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int waterHint) { public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) {
int nextRecursion = recursion + 1;
if (caves.isNotEmpty()) { if (caves.isNotEmpty()) {
for (IrisCavePlacer i : caves) { for (IrisCavePlacer i : caves) {
i.generateCave(writer, rng, engine, x, y, z, waterHint); if (recursion > i.getMaxRecursion()) continue;
i.generateCave(writer, rng, engine, x, y, z, nextRecursion, waterHint);
} }
} }
if (ravines.isNotEmpty()) { if (ravines.isNotEmpty()) {
for (IrisRavinePlacer i : ravines) { for (IrisRavinePlacer i : ravines) {
i.generateRavine(writer, rng, engine, x, y, z, waterHint); if (recursion > i.getMaxRecursion()) continue;
i.generateRavine(writer, rng, engine, x, y, z, nextRecursion, waterHint);
} }
} }
@ -104,15 +108,18 @@ public class IrisCarving {
} }
} }
public int getMaxRange(IrisData data) { public int getMaxRange(IrisData data, int recursion) {
int max = 0; int max = 0;
int nextRecursion = recursion + 1;
for (IrisCavePlacer i : caves) { for (IrisCavePlacer i : caves) {
max = Math.max(max, i.getSize(data)); if (recursion > i.getMaxRecursion()) continue;
max = Math.max(max, i.getSize(data, nextRecursion));
} }
for (IrisRavinePlacer i : ravines) { for (IrisRavinePlacer i : ravines) {
max = Math.max(max, i.getSize(data)); if (recursion > i.getMaxRecursion()) continue;
max = Math.max(max, i.getSize(data, nextRecursion));
} }
if (elipsoids.isNotEmpty()) { if (elipsoids.isNotEmpty()) {

View File

@ -66,10 +66,10 @@ public class IrisCave extends IrisRegistrant {
} }
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) { public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) {
generate(writer, rng, engine, x, y, z, -1); generate(writer, rng, engine, x, y, z, 0, -1);
} }
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int waterHint) { public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) {
double girth = getWorm().getGirth().get(rng, x, z, engine.getData()); double girth = getWorm().getGirth().get(rng, x, z, engine.getData());
KList<IrisPosition> points = getWorm().generate(rng, engine.getData(), writer, verticalRange, x, y, z, (at) -> { KList<IrisPosition> points = getWorm().generate(rng, engine.getData(), writer, verticalRange, x, y, z, (at) -> {
@ -92,7 +92,7 @@ public class IrisCave extends IrisRegistrant {
int h = Math.min(Math.max(highestWater, waterHint), engine.getDimension().getFluidHeight()); int h = Math.min(Math.max(highestWater, waterHint), engine.getDimension().getFluidHeight());
for (IrisPosition i : points) { for (IrisPosition i : points) {
fork.doCarving(writer, rng, engine, i.getX(), i.getY(), i.getZ(), h); fork.doCarving(writer, rng, engine, i.getX(), i.getY(), i.getZ(), recursion, h);
} }
MatterCavern c = new MatterCavern(true, customBiome, (byte) 0); MatterCavern c = new MatterCavern(true, customBiome, (byte) 0);
@ -108,7 +108,7 @@ public class IrisCave extends IrisRegistrant {
} }
public int getMaxSize(IrisData data) { public int getMaxSize(IrisData data, int depth) {
return getWorm().getMaxDistance() + fork.getMaxRange(data); return getWorm().getMaxDistance() + fork.getMaxRange(data, depth);
} }
} }

View File

@ -50,6 +50,10 @@ public class IrisCavePlacer implements IRare {
@Desc("The cave to place") @Desc("The cave to place")
@RegistryListResource(IrisCave.class) @RegistryListResource(IrisCave.class)
private String cave; private String cave;
@MinNumber(1)
@MaxNumber(256)
@Desc("The maximum recursion depth")
private int maxRecursion = 16;
@Desc("If set to true, this cave is allowed to break the surface") @Desc("If set to true, this cave is allowed to break the surface")
private boolean breakSurface = true; 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.") @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.")
@ -60,10 +64,10 @@ public class IrisCavePlacer implements IRare {
} }
public void generateCave(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z) { public void generateCave(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z) {
generateCave(mantle, rng, engine, x, y, z, -1); generateCave(mantle, rng, engine, x, y, z, 0, -1);
} }
public void generateCave(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z, int waterHint) { public void generateCave(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) {
if (fail.get()) { if (fail.get()) {
return; return;
} }
@ -92,18 +96,18 @@ public class IrisCavePlacer implements IRare {
} }
try { try {
cave.generate(mantle, rng, engine, x + rng.nextInt(15), y, z + rng.nextInt(15), waterHint); cave.generate(mantle, rng, engine, x + rng.nextInt(15), y, z + rng.nextInt(15), recursion, waterHint);
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
fail.set(true); fail.set(true);
} }
} }
public int getSize(IrisData data) { public int getSize(IrisData data, int depth) {
IrisCave cave = getRealCave(data); IrisCave cave = getRealCave(data);
if (cave != null) { if (cave != null) {
return cave.getMaxSize(data); return cave.getMaxSize(data, depth);
} }
return 32; return 32;

View File

@ -93,10 +93,10 @@ public class IrisRavine extends IrisRegistrant {
} }
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) { public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) {
generate(writer, rng, engine, x, y, z, -1); generate(writer, rng, engine, x, y, z, 0, -1);
} }
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int waterHint) { public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) {
KList<IrisPosition> pos = getWorm().generate(rng, engine.getData(), writer, null, x, y, z, (at) -> { KList<IrisPosition> pos = getWorm().generate(rng, engine.getData(), writer, null, x, y, z, (at) -> {
}); });
CNG dg = depthStyle.getGenerator().createNoCache(rng, engine.getData()); CNG dg = depthStyle.getGenerator().createNoCache(rng, engine.getData());
@ -135,7 +135,7 @@ public class IrisRavine extends IrisRegistrant {
int width = (int) Math.round(bw.fitDouble(baseWidthStyle.getMin(), baseWidthStyle.getMax(), p.getX(), p.getZ())); int width = (int) Math.round(bw.fitDouble(baseWidthStyle.getMin(), baseWidthStyle.getMax(), p.getX(), p.getZ()));
int surface = (int) Math.round(rsurface - depth * 0.45); int surface = (int) Math.round(rsurface - depth * 0.45);
fork.doCarving(writer, rng, engine, p.getX(), rng.i(surface - depth, surface), p.getZ(), Math.max(highestWater, waterHint)); fork.doCarving(writer, rng, engine, p.getX(), rng.i(surface - depth, surface), p.getZ(), recursion, Math.max(highestWater, waterHint));
for (int i = surface + depth; i >= surface; i--) { for (int i = surface + depth; i >= surface; i--) {
if (i % ribThickness == 0) { if (i % ribThickness == 0) {
@ -184,7 +184,7 @@ public class IrisRavine extends IrisRegistrant {
} }
public int getMaxSize(IrisData data) { public int getMaxSize(IrisData data, int depth) {
return getWorm().getMaxDistance() + fork.getMaxRange(data); return getWorm().getMaxDistance() + fork.getMaxRange(data, depth);
} }
} }

View File

@ -50,16 +50,20 @@ public class IrisRavinePlacer implements IRare {
@Desc("The ravine to place") @Desc("The ravine to place")
@RegistryListResource(IrisRavine.class) @RegistryListResource(IrisRavine.class)
private String ravine; private String ravine;
@MinNumber(1)
@MaxNumber(256)
@Desc("The maximum recursion depth")
private int maxRecursion = 100;
public IrisRavine getRealRavine(IrisData data) { public IrisRavine getRealRavine(IrisData data) {
return ravineCache.aquire(() -> data.getRavineLoader().load(getRavine())); return ravineCache.aquire(() -> data.getRavineLoader().load(getRavine()));
} }
public void generateRavine(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z) { public void generateRavine(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z) {
generateRavine(mantle, rng, engine, x, y, z, -1); generateRavine(mantle, rng, engine, x, y, z, 0, -1);
} }
public void generateRavine(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z, int waterHint) { public void generateRavine(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) {
if (fail.get()) { if (fail.get()) {
return; return;
} }
@ -80,14 +84,14 @@ public class IrisRavinePlacer implements IRare {
try { try {
int xx = x + rng.nextInt(15); int xx = x + rng.nextInt(15);
int zz = z + rng.nextInt(15); int zz = z + rng.nextInt(15);
ravine.generate(mantle, rng, engine, xx, y, zz, waterHint); ravine.generate(mantle, rng, engine, xx, y, zz, recursion, waterHint);
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
fail.set(true); fail.set(true);
} }
} }
public int getSize(IrisData data) { public int getSize(IrisData data, int depth) {
return getRealRavine(data).getMaxSize(data); return getRealRavine(data).getMaxSize(data, depth);
} }
} }