mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 02:36:59 +00:00
Now on hotload: Post Processing!
This commit is contained in:
parent
0ecde9531e
commit
84e81e9ce0
@ -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");
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
|
37
src/main/java/com/volmit/iris/object/IrisPostProcessor.java
Normal file
37
src/main/java/com/volmit/iris/object/IrisPostProcessor.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user