From 0ecde9531e31dcf4b08bf9934e197b8f3a339fcd Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 29 Jul 2020 00:23:48 -0400 Subject: [PATCH] Fix post --- .../generator/PostBlockChunkGenerator.java | 76 ++++++++++++++----- .../java/com/volmit/iris/layer/post/Post.java | 14 ++++ ...leter.java => PostFloatingNibDeleter.java} | 12 ++- ...ppleSmoother.java => PostNibSmoother.java} | 12 ++- .../iris/layer/post/PostPotholeFiller.java | 8 +- .../volmit/iris/layer/post/PostSlabber.java | 17 ++++- .../iris/layer/post/PostWallPatcher.java | 17 ++++- .../iris/layer/post/PostWaterlogger.java | 52 +++++++------ .../iris/object/IrisBiomePaletteLayer.java | 15 ++-- .../volmit/iris/util/IrisPostBlockFilter.java | 40 +++++++++- 10 files changed, 200 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/volmit/iris/layer/post/Post.java rename src/main/java/com/volmit/iris/layer/post/{PostFloatingNippleDeleter.java => PostFloatingNibDeleter.java} (77%) rename src/main/java/com/volmit/iris/layer/post/{PostNippleSmoother.java => PostNibSmoother.java} (77%) diff --git a/src/main/java/com/volmit/iris/generator/PostBlockChunkGenerator.java b/src/main/java/com/volmit/iris/generator/PostBlockChunkGenerator.java index d278ac1e5..976247d86 100644 --- a/src/main/java/com/volmit/iris/generator/PostBlockChunkGenerator.java +++ b/src/main/java/com/volmit/iris/generator/PostBlockChunkGenerator.java @@ -6,8 +6,8 @@ import org.bukkit.World; import org.bukkit.block.data.BlockData; import com.volmit.iris.Iris; -import com.volmit.iris.layer.post.PostFloatingNippleDeleter; -import com.volmit.iris.layer.post.PostNippleSmoother; +import com.volmit.iris.layer.post.PostFloatingNibDeleter; +import com.volmit.iris.layer.post.PostNibSmoother; import com.volmit.iris.layer.post.PostPotholeFiller; import com.volmit.iris.layer.post.PostSlabber; import com.volmit.iris.layer.post.PostWallPatcher; @@ -20,6 +20,11 @@ import com.volmit.iris.util.KList; import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.RNG; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator implements IPostBlockAccess { protected boolean generatingCeiling = false; @@ -32,6 +37,8 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp private KList filters; private String postKey; private ReentrantLock lock; + private int minPhase; + private int maxPhase; public PostBlockChunkGenerator(String dimensionName, int threads) { @@ -44,12 +51,23 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp public void onInit(World world, RNG rng) { super.onInit(world, rng); - filters.add(new PostNippleSmoother(this)); - filters.add(new PostFloatingNippleDeleter(this)); + filters.add(new PostNibSmoother(this)); + filters.add(new PostFloatingNibDeleter(this)); filters.add(new PostPotholeFiller(this)); - filters.add(new PostSlabber(this)); filters.add(new PostWallPatcher(this)); - filters.add(new PostWaterlogger(this)); + filters.add(new PostSlabber(this)); + filters.add(new PostWaterlogger(this, 2)); + + setMinPhase(0); + setMaxPhase(0); + + for(IrisPostBlockFilter i : filters) + { + setMinPhase(Math.min(getMinPhase(), i.getPhase())); + setMaxPhase(Math.max(getMaxPhase(), i.getPhase())); + } + + Iris.info("Post Processing: " + filters.size() + " filters. Phases: " + getMinPhase() + " - " + getMaxPhase()); } @Override @@ -69,29 +87,39 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp PrecisionStopwatch p = PrecisionStopwatch.start(); - for(i = 0; i < 16; i++) + for(int h = getMinPhase(); h <= getMaxPhase(); h++) { - rx = (x * 16) + i; - - for(j = 0; j < 16; j++) + for(i = 0; i < 16; i++) { - int rxx = rx; - int rzz = (z * 16) + j; + rx = (x << 4) + i; - getAccelerant().queue(postKey, () -> + for(j = 0; j < 16; j++) { + int rxx = rx; + int rzz = (z << 4) + j; + for(IrisPostBlockFilter f : filters) { - int rxxx = rxx; - int rzzx = rzz; - - f.onPost(rxxx, rzzx); + if(f.getPhase() == h) + { + f.onPost(rxx, rzz); + } } - }); + } + } + + for(IrisPostBlockFilter f : filters) + { + if(f.getPhase() == h) + { + while(f.getQueue().size() > 0) + { + f.getQueue().pop().run(); + } + } } } - getAccelerant().waitFor(postKey); p.end(); getMetrics().getPost().put(p.getMilliseconds()); } @@ -99,7 +127,15 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp @Override public void updateHeight(int x, int z, int h) { - getCacheHeightMap()[(z << 4) | x] = h; + if(x >> 4 == currentPostX && z >> 4 == currentPostZ) + { + getCacheHeightMap()[((z & 15) << 4) | (x & 15)] = h; + } + + else + { + Iris.error("Invalid Heightmap set! Chunk Currently at " + currentPostX + "," + currentPostZ + ". Attempted to place at " + (x >> 4) + " " + (z >> 4) + " which is bad."); + } } @Override diff --git a/src/main/java/com/volmit/iris/layer/post/Post.java b/src/main/java/com/volmit/iris/layer/post/Post.java new file mode 100644 index 000000000..f9fcac318 --- /dev/null +++ b/src/main/java/com/volmit/iris/layer/post/Post.java @@ -0,0 +1,14 @@ +package com.volmit.iris.layer.post; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.*; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target(TYPE) +public @interface Post +{ + String value(); +} diff --git a/src/main/java/com/volmit/iris/layer/post/PostFloatingNippleDeleter.java b/src/main/java/com/volmit/iris/layer/post/PostFloatingNibDeleter.java similarity index 77% rename from src/main/java/com/volmit/iris/layer/post/PostFloatingNippleDeleter.java rename to src/main/java/com/volmit/iris/layer/post/PostFloatingNibDeleter.java index 7fda60402..cb287ca20 100644 --- a/src/main/java/com/volmit/iris/layer/post/PostFloatingNippleDeleter.java +++ b/src/main/java/com/volmit/iris/layer/post/PostFloatingNibDeleter.java @@ -6,13 +6,19 @@ import com.volmit.iris.generator.PostBlockChunkGenerator; import com.volmit.iris.util.BlockDataTools; import com.volmit.iris.util.IrisPostBlockFilter; -public class PostFloatingNippleDeleter extends IrisPostBlockFilter +@Post("floating-block-remover") +public class PostFloatingNibDeleter extends IrisPostBlockFilter { private static final BlockData AIR = BlockDataTools.getBlockData("AIR"); - public PostFloatingNippleDeleter(PostBlockChunkGenerator gen) + public PostFloatingNibDeleter(PostBlockChunkGenerator gen, int phase) { - super(gen); + super(gen, phase); + } + + public PostFloatingNibDeleter(PostBlockChunkGenerator gen) + { + this(gen, 0); } @Override diff --git a/src/main/java/com/volmit/iris/layer/post/PostNippleSmoother.java b/src/main/java/com/volmit/iris/layer/post/PostNibSmoother.java similarity index 77% rename from src/main/java/com/volmit/iris/layer/post/PostNippleSmoother.java rename to src/main/java/com/volmit/iris/layer/post/PostNibSmoother.java index 239f5f0f1..bfe53d0a6 100644 --- a/src/main/java/com/volmit/iris/layer/post/PostNippleSmoother.java +++ b/src/main/java/com/volmit/iris/layer/post/PostNibSmoother.java @@ -6,11 +6,17 @@ import org.bukkit.block.data.BlockData; import com.volmit.iris.generator.PostBlockChunkGenerator; import com.volmit.iris.util.IrisPostBlockFilter; -public class PostNippleSmoother extends IrisPostBlockFilter +@Post("nib-smoother") +public class PostNibSmoother extends IrisPostBlockFilter { - public PostNippleSmoother(PostBlockChunkGenerator gen) + public PostNibSmoother(PostBlockChunkGenerator gen, int phase) { - super(gen); + super(gen, phase); + } + + public PostNibSmoother(PostBlockChunkGenerator gen) + { + this(gen, 0); } @Override diff --git a/src/main/java/com/volmit/iris/layer/post/PostPotholeFiller.java b/src/main/java/com/volmit/iris/layer/post/PostPotholeFiller.java index 678886b24..05887987f 100644 --- a/src/main/java/com/volmit/iris/layer/post/PostPotholeFiller.java +++ b/src/main/java/com/volmit/iris/layer/post/PostPotholeFiller.java @@ -3,11 +3,17 @@ package com.volmit.iris.layer.post; import com.volmit.iris.generator.PostBlockChunkGenerator; import com.volmit.iris.util.IrisPostBlockFilter; +@Post("pothole-filler") public class PostPotholeFiller extends IrisPostBlockFilter { + public PostPotholeFiller(PostBlockChunkGenerator gen, int phase) + { + super(gen, phase); + } + public PostPotholeFiller(PostBlockChunkGenerator gen) { - super(gen); + this(gen, 0); } @Override diff --git a/src/main/java/com/volmit/iris/layer/post/PostSlabber.java b/src/main/java/com/volmit/iris/layer/post/PostSlabber.java index e8d8cdff6..baaf31937 100644 --- a/src/main/java/com/volmit/iris/layer/post/PostSlabber.java +++ b/src/main/java/com/volmit/iris/layer/post/PostSlabber.java @@ -7,16 +7,22 @@ import com.volmit.iris.generator.PostBlockChunkGenerator; import com.volmit.iris.util.IrisPostBlockFilter; import com.volmit.iris.util.RNG; +@Post("slabber") public class PostSlabber extends IrisPostBlockFilter { public static final Material AIR = Material.AIR; public static final Material WATER = Material.WATER; private RNG rng; + public PostSlabber(PostBlockChunkGenerator gen, int phase) + { + super(gen, phase); + rng = gen.getMasterRandom().nextParallelRNG(166456); + } + public PostSlabber(PostBlockChunkGenerator gen) { - super(gen); - rng = gen.getMasterRandom().nextParallelRNG(1239456); + this(gen, 0); } @Override @@ -41,8 +47,11 @@ public class PostSlabber extends IrisPostBlockFilter if(isAir(x, h + 2, z) || getPostBlock(x, h + 2, z).getMaterial().equals(WATER)) { - setPostBlock(x, h + 1, z, d); - updateHeight(x, z, h + 1); + queue(() -> + { + setPostBlock(x, h + 1, z, d); + updateHeight(x, z, h + 1); + }); } } } diff --git a/src/main/java/com/volmit/iris/layer/post/PostWallPatcher.java b/src/main/java/com/volmit/iris/layer/post/PostWallPatcher.java index 77467ab47..396a27fc6 100644 --- a/src/main/java/com/volmit/iris/layer/post/PostWallPatcher.java +++ b/src/main/java/com/volmit/iris/layer/post/PostWallPatcher.java @@ -8,15 +8,21 @@ import com.volmit.iris.object.IrisBiome; import com.volmit.iris.util.IrisPostBlockFilter; import com.volmit.iris.util.RNG; +@Post("wall-painter") public class PostWallPatcher extends IrisPostBlockFilter { public static final Material AIR = Material.AIR; private RNG rng; + public PostWallPatcher(PostBlockChunkGenerator gen, int phase) + { + super(gen, phase); + rng = gen.getMasterRandom().nextParallelRNG(1239456); + } + public PostWallPatcher(PostBlockChunkGenerator gen) { - super(gen); - rng = gen.getMasterRandom().nextParallelRNG(1239456); + this(gen, 0); } @Override @@ -40,8 +46,11 @@ public class PostWallPatcher extends IrisPostBlockFilter if(s != null) { - setPostBlock(x, h + 1, z, s); - updateHeight(x, z, h + 1); + if(!s.getMaterial().equals(AIR)) + { + setPostBlock(x, h + 1, z, s); + updateHeight(x, z, h + 1); + } } for(int i = h; i > h - max; i--) diff --git a/src/main/java/com/volmit/iris/layer/post/PostWaterlogger.java b/src/main/java/com/volmit/iris/layer/post/PostWaterlogger.java index c32863c4a..271eacfdf 100644 --- a/src/main/java/com/volmit/iris/layer/post/PostWaterlogger.java +++ b/src/main/java/com/volmit/iris/layer/post/PostWaterlogger.java @@ -1,14 +1,23 @@ package com.volmit.iris.layer.post; +import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Waterlogged; -import com.volmit.iris.Iris; import com.volmit.iris.generator.PostBlockChunkGenerator; +import com.volmit.iris.util.BlockDataTools; import com.volmit.iris.util.IrisPostBlockFilter; +@Post("waterlogger") public class PostWaterlogger extends IrisPostBlockFilter { + private static final BlockData WATER = BlockDataTools.getBlockData("WATER"); + + public PostWaterlogger(PostBlockChunkGenerator gen, int phase) + { + super(gen, phase); + } + public PostWaterlogger(PostBlockChunkGenerator gen) { super(gen); @@ -23,32 +32,31 @@ public class PostWaterlogger extends IrisPostBlockFilter if(b instanceof Waterlogged) { Waterlogged ww = (Waterlogged) b; - boolean w = ww.isWaterlogged(); - if(isWater(x, h + 1, z)) + if(ww.isWaterlogged()) + { + return; + } + + if(isWaterOrWaterlogged(x, h + 1, z) && !ww.isWaterlogged()) { ww.setWaterlogged(true); - } - - else if(h < 98) - { - Iris.info("Data is " + getPostBlock(x, h + 1, z).getAsString()); - } - - else if(isWater(x + 1, h, z) || isWater(x - 1, h, z) || isWater(x, h, z + 1) || isWater(x, h, z - 1)) - { - ww.setWaterlogged(true); - } - - else - { - ww.setWaterlogged(false); - } - - if(ww.isWaterlogged() != w) - { setPostBlock(x, h, z, ww); } + + else if(!ww.isWaterlogged() && (isWaterOrWaterlogged(x + 1, h, z) || isWaterOrWaterlogged(x - 1, h, z) || isWaterOrWaterlogged(x, h, z + 1) || isWaterOrWaterlogged(x, h, z - 1))) + { + ww.setWaterlogged(true); + setPostBlock(x, h, z, ww); + } + } + + else if(b.getMaterial().equals(Material.AIR) && h <= gen.getFluidHeight()) + { + if((isWaterOrWaterlogged(x + 1, h, z) || isWaterOrWaterlogged(x - 1, h, z) || isWaterOrWaterlogged(x, h, z + 1) || isWaterOrWaterlogged(x, h, z - 1))) + { + setPostBlock(x, h, z, WATER); + } } } } diff --git a/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java b/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java index 35350aa7c..43e215927 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java +++ b/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java @@ -59,6 +59,16 @@ public class IrisBiomePaletteLayer cacheGenerator(rng); } + if(getBlockData().isEmpty()) + { + return null; + } + + if(getBlockData().size() == 1) + { + return getBlockData().get(0); + } + if(layerGenerator != null) { if(dispersion.equals(Dispersion.SCATTER)) @@ -72,11 +82,6 @@ public class IrisBiomePaletteLayer } } - if(getBlockData().isEmpty()) - { - return null; - } - return getBlockData().get(0); } diff --git a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java index 7b306fda5..63ccfd8e8 100644 --- a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java +++ b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java @@ -2,16 +2,31 @@ package com.volmit.iris.util; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Levelled; +import org.bukkit.block.data.Waterlogged; +import org.bukkit.block.data.type.Slab; import com.volmit.iris.generator.PostBlockChunkGenerator; +import lombok.Data; + +@Data public abstract class IrisPostBlockFilter implements IPostBlockAccess { public PostBlockChunkGenerator gen; + private int phase; + private KList queue; + + public IrisPostBlockFilter(PostBlockChunkGenerator gen, int phase) + { + this.gen = gen; + this.phase = phase; + queue = new KList<>(); + } public IrisPostBlockFilter(PostBlockChunkGenerator gen) { - this.gen = gen; + this(gen, 0); } public abstract void onPost(int x, int z); @@ -46,18 +61,41 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess return d.getMaterial().equals(Material.AIR) || d.getMaterial().equals(Material.CAVE_AIR); } + public boolean isSlab(int x, int y, int z) + { + BlockData d = getPostBlock(x, y, z); + return d instanceof Slab; + } + public boolean isWater(int x, int y, int z) { BlockData d = getPostBlock(x, y, z); return d.getMaterial().equals(Material.WATER); } + public boolean isWaterOrWaterlogged(int x, int y, int z) + { + BlockData d = getPostBlock(x, y, z); + return d.getMaterial().equals(Material.WATER) || (d instanceof Waterlogged && ((Waterlogged) d).isWaterlogged()); + } + + public boolean isLiquid(int x, int y, int z) + { + BlockData d = getPostBlock(x, y, z); + return d instanceof Levelled; + } + @Override public KList caveFloors(int x, int z) { return gen.caveFloors(x, z); } + public void queue(Runnable a) + { + queue.add(a); + } + @Override public void updateHeight(int x, int z, int h) {