mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-01 15:36:45 +00:00
allow carving recursion
This commit is contained in:
parent
113f25dab8
commit
ccc3bab8e0
@ -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;
|
||||||
|
@ -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()) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user