From 261c786a10fced8cc0cfa236fe82836249c1ace8 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Fri, 27 Aug 2021 02:32:57 -0400 Subject: [PATCH] Fix vacuum --- .../command/what/CommandIrisWhatFeatures.java | 2 +- .../com/volmit/iris/engine/IrisComplex.java | 49 ++++++++++++++----- .../com/volmit/iris/engine/IrisEngine.java | 6 +-- .../iris/engine/mantle/EngineMantle.java | 7 ++- .../components/MantleFeatureComponent.java | 9 ++-- .../components/MantleJigsawComponent.java | 2 +- .../components/MantleObjectComponent.java | 47 +++++++----------- .../object/dimensional/IrisDimension.java | 35 ------------- .../volmit/iris/util/mantle/MantleFlag.java | 3 +- 9 files changed, 72 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatFeatures.java b/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatFeatures.java index bd93f2018..e1cbaadd3 100644 --- a/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatFeatures.java +++ b/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatFeatures.java @@ -52,7 +52,7 @@ public class CommandIrisWhatFeatures extends MortarCommand { if (IrisToolbelt.isIrisWorld(c.getWorld())) { int m = 1; - for (IrisFeaturePositional i : IrisToolbelt.access(c.getWorld()).getEngine().getMantle().getFeaturesInChunk(c)) { + for (IrisFeaturePositional i : IrisToolbelt.access(c.getWorld()).getEngine().getMantle().forEachFeature(c)) { sender.sendMessage("#" + m++ + " " + new JSONObject(new Gson().toJson(i)).toString(4)); } } else { diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 364f82bfe..765bb63fd 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -76,6 +76,7 @@ public class IrisComplex implements DataProvider { private ProceduralStream overlayStream; private ProceduralStream heightFluidStream; private ProceduralStream trueHeightStream; + private ProceduralStream trueHeightStreamNoFeatures; private ProceduralStream slopeStream; private ProceduralStream topSurfaceStream; private ProceduralStream rngStream; @@ -217,16 +218,12 @@ public class IrisComplex implements DataProvider { }, Interpolated.DOUBLE).clamp(0, engine.getHeight()).cache2D(cacheSize); slopeStream = heightStream.slope(3).cache2D(cacheSize); objectChanceStream = ProceduralStream.ofDouble((x, z) -> { - if (engine.getDimension().hasFeatures(engine)) { - AtomicDouble str = new AtomicDouble(1D); - for (IrisFeaturePositional i : engine.getMantle().forEachFeature(x, z)) { - str.set(Math.min(str.get(), i.getObjectChanceModifier(x, z, rng, getData()))); - } - - return str.get(); + AtomicDouble str = new AtomicDouble(1D); + for (IrisFeaturePositional i : engine.getMantle().forEachFeature(x, z)) { + str.set(Math.min(str.get(), i.getObjectChanceModifier(x, z, rng, getData()))); } - return 1D; + return str.get(); }); trueBiomeStream = focus != null ? ProceduralStream.of((x, y) -> focus, Interpolated.of(a -> 0D, b -> focus)).convertAware2D((b, x, z) -> { @@ -343,6 +340,38 @@ public class IrisComplex implements DataProvider { return m; }, Interpolated.INT).cache2D(cacheSize); + + trueHeightStreamNoFeatures = ProceduralStream.of((x, z) -> { + int rx = (int) Math.round(engine.modifyX(x)); + int rz = (int) Math.round(engine.modifyZ(z)); + int heightf = (int) Math.round(getHeightStreamNoFeatures().get(rx, rz)); + int m = heightf; + + if (engine.getDimension().isCarved(getData(), rx, m, rz, ((IrisTerrainNormalActuator) engine.getTerrainActuator()).getRng(), heightf)) { + m--; + + while (engine.getDimension().isCarved(getData(), rx, m, rz, ((IrisTerrainNormalActuator) engine.getTerrainActuator()).getRng(), heightf)) { + m--; + } + } + + if (engine.getDimension().isCaves()) { + KList caves = ((IrisCaveModifier) engine.getCaveModifier()).genCaves(rx, rz, 0, 0, null); + boolean again = true; + + while (again) { + again = false; + for (CaveResult i : caves) { + if (i.getCeiling() > m && i.getFloor() < m) { + m = i.getFloor(); + again = true; + } + } + } + } + + return m; + }, Interpolated.INT).cache2D(cacheSize); baseBiomeIDStream = trueBiomeStream.convertAware2D((b, x, z) -> { UUID d = regionIDStream.get(x, z); return new UUID(b.getLoadKey().hashCode() * 818223L, @@ -427,9 +456,7 @@ public class IrisComplex implements DataProvider { AtomicDouble noise = new AtomicDouble(h + fluidHeight + overlayStream.get(x, z)); if (features) { - List p = engine.getMantle().forEachFeature(x, z); - - for (IrisFeaturePositional i : p) { + for (IrisFeaturePositional i : engine.getMantle().forEachFeature(x, z)) { noise.set(i.filter(x, z, noise.get(), rng, getData())); } } diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 2deecbe4a..8017f960e 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -417,10 +417,8 @@ public class IrisEngine implements Engine { } } else { getMantle().generateMatter(x >> 4, z >> 4, multicore); - burst().burst(multicore, - () -> getTerrainActuator().actuate(x, z, vblocks, multicore), - () -> getBiomeActuator().actuate(x, z, vbiomes, multicore) - ); + getTerrainActuator().actuate(x, z, vblocks, multicore); + getBiomeActuator().actuate(x, z, vbiomes, multicore); burst().burst(multicore, () -> getCaveModifier().modify(x, z, vblocks, multicore), () -> getDecorantActuator().actuate(x, z, blocks, multicore), diff --git a/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 5ce97bce4..bfcfa56dc 100644 --- a/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -34,6 +34,7 @@ import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.mantle.MantleChunk; +import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.MultiBurst; import org.bukkit.Chunk; @@ -206,6 +207,8 @@ public interface EngineMantle extends IObjectPlacer { post.clear(); burst().burst(multicore, px); } + + getMantle().flag(x, z, MantleFlag.REAL, true); } default void generateMantleComponent(MantleWriter writer, int x, int z, MantleComponent c, Consumer post, MantleChunk mc) { @@ -246,10 +249,6 @@ public interface EngineMantle extends IObjectPlacer { default KList forEachFeature(double x, double z) { KList pos = new KList<>(); - if (!getEngine().getDimension().hasFeatures(getEngine())) { - return pos; - } - for (IrisFeaturePositional i : getEngine().getDimension().getSpecificFeatures()) { if (i.shouldFilter(x, z, getEngine().getComplex().getRng(), getData())) { pos.add(i); diff --git a/src/main/java/com/volmit/iris/engine/mantle/components/MantleFeatureComponent.java b/src/main/java/com/volmit/iris/engine/mantle/components/MantleFeatureComponent.java index eb7f29da5..a94b14bbb 100644 --- a/src/main/java/com/volmit/iris/engine/mantle/components/MantleFeatureComponent.java +++ b/src/main/java/com/volmit/iris/engine/mantle/components/MantleFeatureComponent.java @@ -64,9 +64,12 @@ public class MantleFeatureComponent extends IrisMantleComponent { } private void placeZone(MantleWriter writer, RNG rng, int cx, int cz, IrisFeaturePotential i) { - int x = (cx << 4) + rng.nextInt(16); - int z = (cz << 4) + rng.nextInt(16); - writer.setData(x, 0, z, new IrisFeaturePositional(x, z, i.getZone())); + if(i.hasZone(rng, cx, cz)) + { + int x = (cx << 4) + rng.nextInt(16); + int z = (cz << 4) + rng.nextInt(16); + writer.setData(x, 0, z, new IrisFeaturePositional(x, z, i.getZone())); + } } private KList getFeatures() { diff --git a/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java b/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java index 98ea2c5c2..7ffe30a96 100644 --- a/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java +++ b/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java @@ -118,6 +118,6 @@ public class MantleJigsawComponent extends IrisMantleComponent { new IrisFeaturePositional(position.getX(), position.getZ(), structure.getFeature())); } - post.accept(() -> new PlannedStructure(structure, position, rng).place(writer, getMantle(), post)); + new PlannedStructure(structure, position, rng).place(writer, getMantle(), post); } } diff --git a/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java b/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java index 13f32ca9b..d73b4c82f 100644 --- a/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java +++ b/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java @@ -90,40 +90,31 @@ public class MantleObjectComponent extends IrisMantleComponent { if (v == null) { return; } - int xx = rng.i(x, x + 16); - int zz = rng.i(z, z + 16); + int xx = rng.i(x, x + 15); + int zz = rng.i(z, z + 15); int id = rng.i(0, Integer.MAX_VALUE); - Runnable r = () -> { - int h = v.place(xx, -1, zz, writer, objectPlacement, rng, - (b) -> writer.setData(b.getX(), b.getY(), b.getZ(), - v.getLoadKey() + "@" + id), null, getData()); - if (objectPlacement.usesFeatures()) { - if (objectPlacement.isVacuum()) { + int h = v.place(xx, -1, zz, writer, objectPlacement, rng, + (b) -> writer.setData(b.getX(), b.getY(), b.getZ(), + v.getLoadKey() + "@" + id), null, getData()); + if (objectPlacement.usesFeatures() && h >= 0) { + if (objectPlacement.isVacuum()) { + double a = Math.max(v.getW(), v.getD()); + IrisFeature f = new IrisFeature(); + f.setConvergeToHeight(h); + f.setBlockRadius(a); + f.setInterpolationRadius(objectPlacement.getVacuumInterpolationRadius()); + f.setInterpolator(objectPlacement.getVacuumInterpolationMethod()); + f.setStrength(1D); + writer.setData(xx, 0, zz, new IrisFeaturePositional(xx, zz, f)); + } - double a = Math.max(v.getW(), v.getD()); - IrisFeature f = new IrisFeature(); - f.setConvergeToHeight(h - (v.getH() >> 1)); - f.setBlockRadius(a); - f.setInterpolationRadius(objectPlacement.getVacuumInterpolationRadius()); - f.setInterpolator(objectPlacement.getVacuumInterpolationMethod()); - f.setStrength(1D); - writer.setData(xx, 0, zz, new IrisFeaturePositional(xx, zz, f)); - } - - for (IrisFeaturePotential j : objectPlacement.getAddFeatures()) { - if (j.hasZone(rng, xx >> 4, zz >> 4)) { - writer.setData(xx, 0, zz, new IrisFeaturePositional(xx, zz, j.getZone())); - } + for (IrisFeaturePotential j : objectPlacement.getAddFeatures()) { + if (j.hasZone(rng, xx >> 4, zz >> 4)) { + writer.setData(xx, 0, zz, new IrisFeaturePositional(xx, zz, j.getZone())); } } - }; - - if (objectPlacement.usesFeatures()) { - r.run(); - } else { - post.accept(r); } } } diff --git a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java index 9ef203694..5ed5eb8ce 100644 --- a/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java +++ b/src/main/java/com/volmit/iris/engine/object/dimensional/IrisDimension.java @@ -519,41 +519,6 @@ public class IrisDimension extends IrisRegistrant { return changed; } - public boolean hasFeatures(DataProvider data) { - return featuresUsed.aquire(() -> { - if (getFeatures().isNotEmpty() || getSpecificFeatures().isNotEmpty()) { - return true; - } - - for (IrisRegion i : getAllRegions(data)) { - if (i.getFeatures().isNotEmpty()) { - return true; - } - - for (IrisObjectPlacement j : i.getObjects()) { - if (j.isVacuum()) { - return true; - } - } - - for (IrisBiome j : i.getAllBiomes(data)) { - if (j.getFeatures().isNotEmpty()) { - return true; - } - - for (IrisObjectPlacement k : i.getObjects()) { - if (k.isVacuum()) { - return true; - } - } - } - } - - Iris.verbose("Not using parallax noise features (they arent used in this dimension)"); - return false; - }); - } - @Override public String getFolderName() { return "dimensions"; diff --git a/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java b/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java index f608be664..4bad65e26 100644 --- a/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java +++ b/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java @@ -25,7 +25,8 @@ public enum MantleFlag { UPDATE, JIGSAW, FEATURE, - INITIAL_SPAWNED; + INITIAL_SPAWNED, + REAL; static StateList getStateList() { return new StateList(MantleFlag.values());