Now on hotload: Post Processing!

This commit is contained in:
Daniel Mills 2020-07-29 00:53:30 -04:00
parent 0ecde9531e
commit 84e81e9ce0
5 changed files with 153 additions and 27 deletions

View File

@ -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<Class<? extends IrisPostBlockFilter>> 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<Class<? extends IrisPostBlockFilter>> loadPostProcessors()
{
KList<Class<? extends IrisPostBlockFilter>> g = new KList<Class<? extends IrisPostBlockFilter>>();
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");

View File

@ -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<IrisPostBlockFilter> filters;
private KList<IrisPostBlockFilter> 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<? extends IrisPostBlockFilter> 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<IrisPostBlockFilter> 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)
{

View File

@ -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<IrisPostProcessor> 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<BlockData> rockData;
private transient KList<BlockData> fluidData;
private transient KList<IrisPostBlockFilter> 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<IrisPostBlockFilter> 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<IrisPostProcessor> getDefaultPostProcessors()
{
KList<IrisPostProcessor> p = new KList<IrisPostProcessor>();
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)

View File

@ -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);
}
}

View File

@ -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<Runnable> 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)