From 84e81e9ce0445eadbcbdfbaf2d258d47bc7286fb Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 29 Jul 2020 00:53:30 -0400 Subject: [PATCH] Now on hotload: Post Processing! --- src/main/java/com/volmit/iris/Iris.java | 25 +++++++- .../generator/PostBlockChunkGenerator.java | 63 ++++++++++++------- .../com/volmit/iris/object/IrisDimension.java | 52 ++++++++++++++- .../volmit/iris/object/IrisPostProcessor.java | 37 +++++++++++ .../volmit/iris/util/IrisPostBlockFilter.java | 3 + 5 files changed, 153 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/volmit/iris/object/IrisPostProcessor.java diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 33a38cf75..49af8d8c5 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -31,6 +31,12 @@ import org.zeroturnaround.zip.ZipUtil; import com.google.gson.Gson; import com.volmit.iris.generator.IrisChunkGenerator; +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; +import com.volmit.iris.layer.post.PostWaterlogger; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisGenerator; @@ -44,11 +50,13 @@ import com.volmit.iris.util.BoardProvider; import com.volmit.iris.util.BoardSettings; import com.volmit.iris.util.CNG; import com.volmit.iris.util.Cuboid; +import com.volmit.iris.util.Cuboid.CuboidDirection; import com.volmit.iris.util.Desc; import com.volmit.iris.util.Direction; import com.volmit.iris.util.Form; import com.volmit.iris.util.GroupedExecutor; import com.volmit.iris.util.IO; +import com.volmit.iris.util.IrisPostBlockFilter; import com.volmit.iris.util.J; import com.volmit.iris.util.JSONException; import com.volmit.iris.util.JSONObject; @@ -60,7 +68,6 @@ import com.volmit.iris.util.O; import com.volmit.iris.util.RNG; import com.volmit.iris.util.RollingSequence; import com.volmit.iris.util.ScoreDirection; -import com.volmit.iris.util.Cuboid.CuboidDirection; import com.volmit.iris.wand.WandController; public class Iris extends JavaPlugin implements BoardProvider @@ -73,6 +80,7 @@ public class Iris extends JavaPlugin implements BoardProvider private static String last = ""; private BoardManager manager; private RollingSequence hits = new RollingSequence(20); + public static KList> postProcessors; public Iris() { @@ -85,6 +93,7 @@ public class Iris extends JavaPlugin implements BoardProvider hotloader = new IrisHotloadManager(); data = new IrisDataManager(getDataFolder()); wand = new WandController(); + postProcessors = loadPostProcessors(); manager = new BoardManager(this, BoardSettings.builder().boardProvider(this).scoreDirection(ScoreDirection.UP).build()); J.a(() -> { @@ -148,6 +157,20 @@ public class Iris extends JavaPlugin implements BoardProvider return lines; } + private static KList> loadPostProcessors() + { + KList> g = new KList>(); + + g.add(PostFloatingNibDeleter.class); + g.add(PostNibSmoother.class); + g.add(PostPotholeFiller.class); + g.add(PostSlabber.class); + g.add(PostWallPatcher.class); + g.add(PostWaterlogger.class); + + return g; + } + public void writeDocs() throws IOException, JSONException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { JarScanner j = new JarScanner(getFile(), "ninja.bytecode.iris.object"); diff --git a/src/main/java/com/volmit/iris/generator/PostBlockChunkGenerator.java b/src/main/java/com/volmit/iris/generator/PostBlockChunkGenerator.java index 976247d86..c1140429b 100644 --- a/src/main/java/com/volmit/iris/generator/PostBlockChunkGenerator.java +++ b/src/main/java/com/volmit/iris/generator/PostBlockChunkGenerator.java @@ -6,12 +6,6 @@ import org.bukkit.World; import org.bukkit.block.data.BlockData; import com.volmit.iris.Iris; -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; -import com.volmit.iris.layer.post.PostWaterlogger; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.IPostBlockAccess; @@ -34,7 +28,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp private int currentPostX; private int currentPostZ; private ChunkData currentData; - private KList filters; + private KList availableFilters; private String postKey; private ReentrantLock lock; private int minPhase; @@ -43,7 +37,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp public PostBlockChunkGenerator(String dimensionName, int threads) { super(dimensionName, threads); - filters = new KList<>(); + availableFilters = new KList<>(); postKey = "post-" + dimensionName; lock = new ReentrantLock(); } @@ -51,23 +45,20 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp public void onInit(World world, RNG rng) { super.onInit(world, rng); - filters.add(new PostNibSmoother(this)); - filters.add(new PostFloatingNibDeleter(this)); - filters.add(new PostPotholeFiller(this)); - filters.add(new PostWallPatcher(this)); - filters.add(new PostSlabber(this)); - filters.add(new PostWaterlogger(this, 2)); - setMinPhase(0); - setMaxPhase(0); - - for(IrisPostBlockFilter i : filters) + for(Class i : Iris.postProcessors) { - setMinPhase(Math.min(getMinPhase(), i.getPhase())); - setMaxPhase(Math.max(getMaxPhase(), i.getPhase())); - } + try + { + availableFilters.add(i.getConstructor(PostBlockChunkGenerator.class).newInstance(this)); + } - Iris.info("Post Processing: " + filters.size() + " filters. Phases: " + getMinPhase() + " - " + getMaxPhase()); + catch(Throwable e) + { + Iris.error("Failed to initialize post processor: " + i.getCanonicalName()); + fail(e); + } + } } @Override @@ -75,16 +66,16 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp { super.onGenerate(random, x, z, data, grid); - if(!getDimension().isPostProcess()) + if(!getDimension().isPostProcessing()) { return; } + KList filters = getDimension().getPostBlockProcessors(this); currentData = data; currentPostX = x; currentPostZ = z; int rx, i, j; - PrecisionStopwatch p = PrecisionStopwatch.start(); for(int h = getMinPhase(); h <= getMaxPhase(); h++) @@ -124,6 +115,30 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp getMetrics().getPost().put(p.getMilliseconds()); } + public IrisPostBlockFilter createProcessor(String processor, int phase) + { + for(IrisPostBlockFilter i : availableFilters) + { + if(i.getKey().equals(processor)) + { + try + { + return i.getClass().getConstructor(PostBlockChunkGenerator.class, int.class).newInstance(this, phase); + } + + catch(Throwable e) + { + Iris.error("Failed initialize find post processor: " + processor); + fail(e); + } + } + } + + Iris.error("Failed to find post processor: " + processor); + fail(new RuntimeException("Failed to find post processor: " + processor)); + return null; + } + @Override public void updateHeight(int x, int z, int h) { diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index 8f92a2bfc..740f5d45b 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -5,10 +5,13 @@ import java.util.concurrent.locks.ReentrantLock; import org.bukkit.World.Environment; import org.bukkit.block.data.BlockData; +import com.volmit.iris.Iris; +import com.volmit.iris.generator.PostBlockChunkGenerator; import com.volmit.iris.util.BlockDataTools; import com.volmit.iris.util.CNG; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; +import com.volmit.iris.util.IrisPostBlockFilter; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; @@ -57,8 +60,12 @@ public class IrisDimension extends IrisRegistrant private boolean decorate = true; @DontObfuscate - @Desc("Use post processing features. Usually for production only as there is a gen speed cost.") - private boolean postProcess = true; + @Desc("Use post processing or not") + private boolean postProcessing = true; + + @DontObfuscate + @Desc("Post Processors") + private KList postProcessors = getDefaultPostProcessors(); @DontObfuscate @Desc("The ceiling dimension. Leave blank for normal sky.") @@ -168,6 +175,7 @@ public class IrisDimension extends IrisRegistrant private transient ReentrantLock fluidLock = new ReentrantLock(); private transient KList rockData; private transient KList fluidData; + private transient KList cacheFilters; private transient CNG rockLayerGenerator; private transient CNG fluidLayerGenerator; private transient CNG coordFracture; @@ -176,6 +184,32 @@ public class IrisDimension extends IrisRegistrant private transient Double rad; private transient boolean inverted; + public KList getPostBlockProcessors(PostBlockChunkGenerator g) + { + if(cacheFilters == null) + { + cacheFilters = new KList<>(); + + for(IrisPostProcessor i : getPostProcessors()) + { + cacheFilters.add(g.createProcessor(i.getProcessor(), i.getPhase())); + } + + g.setMinPhase(0); + g.setMaxPhase(0); + + for(IrisPostBlockFilter i : cacheFilters) + { + g.setMinPhase(Math.min(g.getMinPhase(), i.getPhase())); + g.setMaxPhase(Math.max(g.getMaxPhase(), i.getPhase())); + } + + Iris.info("Post Processing: " + cacheFilters.size() + " filters. Phases: " + g.getMinPhase() + " - " + g.getMaxPhase()); + } + + return cacheFilters; + } + public CNG getCoordFracture(RNG rng, int signature) { if(coordFracture == null) @@ -187,6 +221,20 @@ public class IrisDimension extends IrisRegistrant return coordFracture; } + private KList getDefaultPostProcessors() + { + KList p = new KList(); + + p.add(new IrisPostProcessor("nib-smoother")); + p.add(new IrisPostProcessor("floating-block-remover")); + p.add(new IrisPostProcessor("pothole-filler")); + p.add(new IrisPostProcessor("wall-painter")); + p.add(new IrisPostProcessor("slabber")); + p.add(new IrisPostProcessor("waterlogger", 1)); + + return p; + } + public BlockData getRock(RNG rng, double x, double y, double z) { if(getRockData().size() == 1) diff --git a/src/main/java/com/volmit/iris/object/IrisPostProcessor.java b/src/main/java/com/volmit/iris/object/IrisPostProcessor.java new file mode 100644 index 000000000..42601053c --- /dev/null +++ b/src/main/java/com/volmit/iris/object/IrisPostProcessor.java @@ -0,0 +1,37 @@ +package com.volmit.iris.object; + +import com.volmit.iris.util.Desc; +import com.volmit.iris.util.DontObfuscate; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Desc("Represents a post processor") +@Data +@EqualsAndHashCode(callSuper = false) +public class IrisPostProcessor +{ + @DontObfuscate + @Desc("The phase to run this filter in. Filters in the same phase iterate across x z chunks all at once per block. Seperate phases run another entire iteration across the chunk after the previous phase has finished.") + private int phase = 0; + + @DontObfuscate + @Desc("The processor to use. Take a look at the list of processors in docs.") + private String processor = ""; + + public IrisPostProcessor() + { + this(""); + } + + public IrisPostProcessor(String f, int p) + { + this.phase = p; + this.processor = f; + } + + public IrisPostProcessor(String f) + { + this(f, 0); + } +} diff --git a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java index 63ccfd8e8..8724babf4 100644 --- a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java +++ b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java @@ -7,6 +7,7 @@ import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Slab; import com.volmit.iris.generator.PostBlockChunkGenerator; +import com.volmit.iris.layer.post.Post; import lombok.Data; @@ -15,6 +16,7 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess { public PostBlockChunkGenerator gen; private int phase; + private String key; private KList queue; public IrisPostBlockFilter(PostBlockChunkGenerator gen, int phase) @@ -22,6 +24,7 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess this.gen = gen; this.phase = phase; queue = new KList<>(); + key = getClass().getDeclaredAnnotation(Post.class).value(); } public IrisPostBlockFilter(PostBlockChunkGenerator gen)