make caves more deterministic

This commit is contained in:
Julian Krings 2025-06-24 19:37:37 +02:00
parent cca0bed482
commit cf8243a000
No known key found for this signature in database
GPG Key ID: 208C6E08C3B718D2
6 changed files with 30 additions and 30 deletions

View File

@ -62,31 +62,31 @@ public class IrisCarving {
@BlockCoordinates @BlockCoordinates
public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int depth) { 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); doCarving(writer, rng, new RNG(engine.getSeedManager().getCarve()), engine, x, y, z, depth, -1);
} }
@BlockCoordinates @BlockCoordinates
public void doCarving(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) { public void doCarving(MantleWriter writer, RNG rng, RNG base, Engine engine, int x, int y, int z, int recursion, int waterHint) {
int nextRecursion = recursion + 1; int nextRecursion = recursion + 1;
if (caves.isNotEmpty()) { if (caves.isNotEmpty()) {
for (IrisCavePlacer i : caves) { for (IrisCavePlacer i : caves) {
if (recursion > i.getMaxRecursion()) continue; if (recursion > i.getMaxRecursion()) continue;
i.generateCave(writer, rng, engine, x, y, z, nextRecursion, waterHint); i.generateCave(writer, rng, base, engine, x, y, z, nextRecursion, waterHint);
} }
} }
if (ravines.isNotEmpty()) { if (ravines.isNotEmpty()) {
for (IrisRavinePlacer i : ravines) { for (IrisRavinePlacer i : ravines) {
if (recursion > i.getMaxRecursion()) continue; if (recursion > i.getMaxRecursion()) continue;
i.generateRavine(writer, rng, engine, x, y, z, nextRecursion, waterHint); i.generateRavine(writer, rng, base, engine, x, y, z, nextRecursion, waterHint);
} }
} }
if (spheres.isNotEmpty()) { if (spheres.isNotEmpty()) {
for (IrisSphere i : spheres) { for (IrisSphere i : spheres) {
if (rng.nextInt(i.getRarity()) == 0) { if (rng.nextInt(i.getRarity()) == 0) {
i.generate(rng, engine, writer, x, y, z); i.generate(base, engine, writer, x, y, z);
} }
} }
} }
@ -94,7 +94,7 @@ public class IrisCarving {
if (elipsoids.isNotEmpty()) { if (elipsoids.isNotEmpty()) {
for (IrisElipsoid i : elipsoids) { for (IrisElipsoid i : elipsoids) {
if (rng.nextInt(i.getRarity()) == 0) { if (rng.nextInt(i.getRarity()) == 0) {
i.generate(rng, engine, writer, x, y, z); i.generate(base, engine, writer, x, y, z);
} }
} }
} }
@ -102,7 +102,7 @@ public class IrisCarving {
if (pyramids.isNotEmpty()) { if (pyramids.isNotEmpty()) {
for (IrisPyramid i : pyramids) { for (IrisPyramid i : pyramids) {
if (rng.nextInt(i.getRarity()) == 0) { if (rng.nextInt(i.getRarity()) == 0) {
i.generate(rng, engine, writer, x, y, z); i.generate(base, engine, writer, x, y, z);
} }
} }
} }

View File

@ -71,12 +71,12 @@ 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, 0, -1, true); generate(writer, rng, new RNG(engine.getSeedManager().getCarve()), engine, x, y, z, 0, -1, true);
} }
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint, boolean breakSurface) { public void generate(MantleWriter writer, RNG rng, RNG base, Engine engine, int x, int y, int z, int recursion, int waterHint, boolean breakSurface) {
double girth = getWorm().getGirth().get(rng, x, z, engine.getData()); double girth = getWorm().getGirth().get(base.nextParallelRNG(465156), x, z, engine.getData());
KList<IrisPosition> points = getWorm().generate(rng, engine.getData(), writer, verticalRange, x, y, z, breakSurface, girth + 9); KList<IrisPosition> points = getWorm().generate(base.nextParallelRNG(784684), engine.getData(), writer, verticalRange, x, y, z, breakSurface, girth + 9);
int highestWater = Math.max(waterHint, -1); int highestWater = Math.max(waterHint, -1);
if (highestWater == -1) { if (highestWater == -1) {
@ -92,16 +92,16 @@ public class IrisCave extends IrisRegistrant {
} }
int h = Math.min(Math.max(highestWater, waterHint), engine.getDimension().getFluidHeight()); int h = Math.min(highestWater, engine.getDimension().getFluidHeight());
for (IrisPosition i : points) { for (IrisPosition i : points) {
fork.doCarving(writer, rng, engine, i.getX(), i.getY(), i.getZ(), recursion, h); fork.doCarving(writer, rng, base, 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);
MatterCavern w = new MatterCavern(true, customBiome, (byte) 1); MatterCavern w = new MatterCavern(true, customBiome, (byte) 1);
CNG cng = shape.getNoise(rng, engine); CNG cng = shape.getNoise(base.nextParallelRNG(8131545), engine);
KSet<IrisPosition> mask = shape.getMasked(rng, engine); KSet<IrisPosition> mask = shape.getMasked(rng, engine);
writer.setNoiseMasked(points, writer.setNoiseMasked(points,
girth, cng.noise(x, y, z), cng, mask, true, girth, cng.noise(x, y, z), cng, mask, true,

View File

@ -64,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, 0, -1); generateCave(mantle, rng, new RNG(engine.getSeedManager().getCarve()), engine, x, y, z, 0, -1);
} }
public void generateCave(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) { public void generateCave(MantleWriter mantle, RNG rng, RNG base, Engine engine, int x, int y, int z, int recursion, int waterHint) {
if (fail.get()) { if (fail.get()) {
return; return;
} }
@ -86,13 +86,13 @@ public class IrisCavePlacer implements IRare {
} }
if (y == -1) { if (y == -1) {
int h = (int) caveStartHeight.get(rng, x, z, data); int h = (int) caveStartHeight.get(base, x, z, data);
int ma = breakSurface ? h : (int) (engine.getComplex().getHeightStream().get(x, z) - 9); int ma = breakSurface ? h : (int) (engine.getComplex().getHeightStream().get(x, z) - 9);
y = Math.min(h, ma); y = Math.min(h, ma);
} }
try { try {
cave.generate(mantle, rng, engine, x + rng.nextInt(15), y, z + rng.nextInt(15), recursion, waterHint, breakSurface); cave.generate(mantle, rng, base, engine, x + rng.nextInt(15), y, z + rng.nextInt(15), recursion, waterHint, breakSurface);
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
fail.set(true); fail.set(true);

View File

@ -93,13 +93,13 @@ 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, 0, -1); generate(writer, rng, new RNG(engine.getSeedManager().getCarve()), engine, x, y, z, 0, -1);
} }
public void generate(MantleWriter writer, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) { public void generate(MantleWriter writer, RNG rng, RNG base, 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, true, 0); KList<IrisPosition> pos = getWorm().generate(base.nextParallelRNG(879615), engine.getData(), writer, null, x, y, z, true, 0);
CNG dg = depthStyle.getGenerator().createNoCache(rng, engine.getData()); CNG dg = depthStyle.getGenerator().create(base.nextParallelRNG(7894156), engine.getData());
CNG bw = baseWidthStyle.getGenerator().createNoCache(rng, engine.getData()); CNG bw = baseWidthStyle.getGenerator().create(base.nextParallelRNG(15315456), engine.getData());
int highestWater = Math.max(waterHint, -1); int highestWater = Math.max(waterHint, -1);
boolean water = false; boolean water = false;
@ -134,7 +134,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(), recursion, Math.max(highestWater, waterHint)); fork.doCarving(writer, rng, base, engine, p.getX(), rng.i(surface - depth, surface), p.getZ(), recursion, highestWater);
for (int i = surface + depth; i >= surface; i--) { for (int i = surface + depth; i >= surface; i--) {
if (i % ribThickness == 0) { if (i % ribThickness == 0) {

View File

@ -60,10 +60,10 @@ public class IrisRavinePlacer implements IRare {
} }
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, 0, -1); generateRavine(mantle, rng, new RNG(engine.getSeedManager().getCarve()), engine, x, y, z, 0, -1);
} }
public void generateRavine(MantleWriter mantle, RNG rng, Engine engine, int x, int y, int z, int recursion, int waterHint) { public void generateRavine(MantleWriter mantle, RNG rng, RNG base, Engine engine, int x, int y, int z, int recursion, int waterHint) {
if (fail.get()) { if (fail.get()) {
return; return;
} }
@ -84,7 +84,7 @@ 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, recursion, waterHint); ravine.generate(mantle, rng, base, engine, xx, y, zz, recursion, waterHint);
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
fail.set(true); fail.set(true);

View File

@ -71,9 +71,9 @@ public class IrisWorm {
IrisPosition start = new IrisPosition(x, y, z); IrisPosition start = new IrisPosition(x, y, z);
KList<IrisPosition> pos = new KList<>(); KList<IrisPosition> pos = new KList<>();
KSet<IrisPosition> check = allowLoops ? null : new KSet<>(); KSet<IrisPosition> check = allowLoops ? null : new KSet<>();
CNG gx = xStyle.getGenerator().createNoCache(new RNG(rng.lmax()), data); CNG gx = xStyle.getGenerator().create(rng.nextParallelRNG(14567), data);
CNG gy = yStyle.getGenerator().createNoCache(new RNG(rng.lmax()), data); CNG gy = yStyle.getGenerator().create(rng.nextParallelRNG(64789), data);
CNG gz = zStyle.getGenerator().createNoCache(new RNG(rng.lmax()), data); CNG gz = zStyle.getGenerator().create(rng.nextParallelRNG(34790), data);
while (itr-- > 0) { while (itr-- > 0) {
IrisPosition current = new IrisPosition(Math.round(cx), Math.round(cy), Math.round(cz)); IrisPosition current = new IrisPosition(Math.round(cx), Math.round(cy), Math.round(cz));