mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-01 07:25:51 +00:00
allow carving recursion
This commit is contained in:
parent
113f25dab8
commit
ccc3bab8e0
@ -58,21 +58,21 @@ public class MantleCarvingComponent extends IrisMantleComponent {
|
||||
|
||||
@ChunkCoordinates
|
||||
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() {
|
||||
var dimension = getDimension();
|
||||
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)) {
|
||||
max = Math.max(max, i.getCarving().getMaxRange(getData()));
|
||||
max = Math.max(max, i.getCarving().getMaxRange(getData(), 0));
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -61,21 +61,25 @@ public class IrisCarving {
|
||||
|
||||
|
||||
@BlockCoordinates
|
||||
public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z) {
|
||||
doCarving(writer, rng, engine, x, y, z, -1);
|
||||
public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int depth) {
|
||||
doCarving(writer, rng, engine, x, y, z, depth, -1);
|
||||
}
|
||||
|
||||
@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()) {
|
||||
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()) {
|
||||
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 nextRecursion = recursion + 1;
|
||||
|
||||
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) {
|
||||
max = Math.max(max, i.getSize(data));
|
||||
if (recursion > i.getMaxRecursion()) continue;
|
||||
max = Math.max(max, i.getSize(data, nextRecursion));
|
||||
}
|
||||
|
||||
if (elipsoids.isNotEmpty()) {
|
||||
|
@ -66,10 +66,10 @@ public class IrisCave extends IrisRegistrant {
|
||||
}
|
||||
|
||||
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());
|
||||
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());
|
||||
|
||||
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);
|
||||
@ -108,7 +108,7 @@ public class IrisCave extends IrisRegistrant {
|
||||
|
||||
}
|
||||
|
||||
public int getMaxSize(IrisData data) {
|
||||
return getWorm().getMaxDistance() + fork.getMaxRange(data);
|
||||
public int getMaxSize(IrisData data, int depth) {
|
||||
return getWorm().getMaxDistance() + fork.getMaxRange(data, depth);
|
||||
}
|
||||
}
|
||||
|
@ -50,6 +50,10 @@ public class IrisCavePlacer implements IRare {
|
||||
@Desc("The cave to place")
|
||||
@RegistryListResource(IrisCave.class)
|
||||
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")
|
||||
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.")
|
||||
@ -60,10 +64,10 @@ public class IrisCavePlacer implements IRare {
|
||||
}
|
||||
|
||||
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()) {
|
||||
return;
|
||||
}
|
||||
@ -92,18 +96,18 @@ public class IrisCavePlacer implements IRare {
|
||||
}
|
||||
|
||||
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) {
|
||||
e.printStackTrace();
|
||||
fail.set(true);
|
||||
}
|
||||
}
|
||||
|
||||
public int getSize(IrisData data) {
|
||||
public int getSize(IrisData data, int depth) {
|
||||
IrisCave cave = getRealCave(data);
|
||||
|
||||
if (cave != null) {
|
||||
return cave.getMaxSize(data);
|
||||
return cave.getMaxSize(data, depth);
|
||||
}
|
||||
|
||||
return 32;
|
||||
|
@ -93,10 +93,10 @@ public class IrisRavine extends IrisRegistrant {
|
||||
}
|
||||
|
||||
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) -> {
|
||||
});
|
||||
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 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--) {
|
||||
if (i % ribThickness == 0) {
|
||||
@ -184,7 +184,7 @@ public class IrisRavine extends IrisRegistrant {
|
||||
|
||||
}
|
||||
|
||||
public int getMaxSize(IrisData data) {
|
||||
return getWorm().getMaxDistance() + fork.getMaxRange(data);
|
||||
public int getMaxSize(IrisData data, int depth) {
|
||||
return getWorm().getMaxDistance() + fork.getMaxRange(data, depth);
|
||||
}
|
||||
}
|
||||
|
@ -50,16 +50,20 @@ public class IrisRavinePlacer implements IRare {
|
||||
@Desc("The ravine to place")
|
||||
@RegistryListResource(IrisRavine.class)
|
||||
private String ravine;
|
||||
@MinNumber(1)
|
||||
@MaxNumber(256)
|
||||
@Desc("The maximum recursion depth")
|
||||
private int maxRecursion = 100;
|
||||
|
||||
public IrisRavine getRealRavine(IrisData data) {
|
||||
return ravineCache.aquire(() -> data.getRavineLoader().load(getRavine()));
|
||||
}
|
||||
|
||||
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()) {
|
||||
return;
|
||||
}
|
||||
@ -80,14 +84,14 @@ public class IrisRavinePlacer implements IRare {
|
||||
try {
|
||||
int xx = x + 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) {
|
||||
e.printStackTrace();
|
||||
fail.set(true);
|
||||
}
|
||||
}
|
||||
|
||||
public int getSize(IrisData data) {
|
||||
return getRealRavine(data).getMaxSize(data);
|
||||
public int getSize(IrisData data, int depth) {
|
||||
return getRealRavine(data).getMaxSize(data, depth);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user