mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 10:43:14 +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.google.gson.Gson;
|
||||||
import com.volmit.iris.generator.IrisChunkGenerator;
|
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.IrisBiome;
|
||||||
import com.volmit.iris.object.IrisDimension;
|
import com.volmit.iris.object.IrisDimension;
|
||||||
import com.volmit.iris.object.IrisGenerator;
|
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.BoardSettings;
|
||||||
import com.volmit.iris.util.CNG;
|
import com.volmit.iris.util.CNG;
|
||||||
import com.volmit.iris.util.Cuboid;
|
import com.volmit.iris.util.Cuboid;
|
||||||
|
import com.volmit.iris.util.Cuboid.CuboidDirection;
|
||||||
import com.volmit.iris.util.Desc;
|
import com.volmit.iris.util.Desc;
|
||||||
import com.volmit.iris.util.Direction;
|
import com.volmit.iris.util.Direction;
|
||||||
import com.volmit.iris.util.Form;
|
import com.volmit.iris.util.Form;
|
||||||
import com.volmit.iris.util.GroupedExecutor;
|
import com.volmit.iris.util.GroupedExecutor;
|
||||||
import com.volmit.iris.util.IO;
|
import com.volmit.iris.util.IO;
|
||||||
|
import com.volmit.iris.util.IrisPostBlockFilter;
|
||||||
import com.volmit.iris.util.J;
|
import com.volmit.iris.util.J;
|
||||||
import com.volmit.iris.util.JSONException;
|
import com.volmit.iris.util.JSONException;
|
||||||
import com.volmit.iris.util.JSONObject;
|
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.RNG;
|
||||||
import com.volmit.iris.util.RollingSequence;
|
import com.volmit.iris.util.RollingSequence;
|
||||||
import com.volmit.iris.util.ScoreDirection;
|
import com.volmit.iris.util.ScoreDirection;
|
||||||
import com.volmit.iris.util.Cuboid.CuboidDirection;
|
|
||||||
import com.volmit.iris.wand.WandController;
|
import com.volmit.iris.wand.WandController;
|
||||||
|
|
||||||
public class Iris extends JavaPlugin implements BoardProvider
|
public class Iris extends JavaPlugin implements BoardProvider
|
||||||
@ -73,6 +80,7 @@ public class Iris extends JavaPlugin implements BoardProvider
|
|||||||
private static String last = "";
|
private static String last = "";
|
||||||
private BoardManager manager;
|
private BoardManager manager;
|
||||||
private RollingSequence hits = new RollingSequence(20);
|
private RollingSequence hits = new RollingSequence(20);
|
||||||
|
public static KList<Class<? extends IrisPostBlockFilter>> postProcessors;
|
||||||
|
|
||||||
public Iris()
|
public Iris()
|
||||||
{
|
{
|
||||||
@ -85,6 +93,7 @@ public class Iris extends JavaPlugin implements BoardProvider
|
|||||||
hotloader = new IrisHotloadManager();
|
hotloader = new IrisHotloadManager();
|
||||||
data = new IrisDataManager(getDataFolder());
|
data = new IrisDataManager(getDataFolder());
|
||||||
wand = new WandController();
|
wand = new WandController();
|
||||||
|
postProcessors = loadPostProcessors();
|
||||||
manager = new BoardManager(this, BoardSettings.builder().boardProvider(this).scoreDirection(ScoreDirection.UP).build());
|
manager = new BoardManager(this, BoardSettings.builder().boardProvider(this).scoreDirection(ScoreDirection.UP).build());
|
||||||
J.a(() ->
|
J.a(() ->
|
||||||
{
|
{
|
||||||
@ -148,6 +157,20 @@ public class Iris extends JavaPlugin implements BoardProvider
|
|||||||
return lines;
|
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
|
public void writeDocs() throws IOException, JSONException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException
|
||||||
{
|
{
|
||||||
JarScanner j = new JarScanner(getFile(), "ninja.bytecode.iris.object");
|
JarScanner j = new JarScanner(getFile(), "ninja.bytecode.iris.object");
|
||||||
|
@ -6,12 +6,6 @@ import org.bukkit.World;
|
|||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
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.object.IrisDimension;
|
||||||
import com.volmit.iris.util.CaveResult;
|
import com.volmit.iris.util.CaveResult;
|
||||||
import com.volmit.iris.util.IPostBlockAccess;
|
import com.volmit.iris.util.IPostBlockAccess;
|
||||||
@ -34,7 +28,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
|||||||
private int currentPostX;
|
private int currentPostX;
|
||||||
private int currentPostZ;
|
private int currentPostZ;
|
||||||
private ChunkData currentData;
|
private ChunkData currentData;
|
||||||
private KList<IrisPostBlockFilter> filters;
|
private KList<IrisPostBlockFilter> availableFilters;
|
||||||
private String postKey;
|
private String postKey;
|
||||||
private ReentrantLock lock;
|
private ReentrantLock lock;
|
||||||
private int minPhase;
|
private int minPhase;
|
||||||
@ -43,7 +37,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
|||||||
public PostBlockChunkGenerator(String dimensionName, int threads)
|
public PostBlockChunkGenerator(String dimensionName, int threads)
|
||||||
{
|
{
|
||||||
super(dimensionName, threads);
|
super(dimensionName, threads);
|
||||||
filters = new KList<>();
|
availableFilters = new KList<>();
|
||||||
postKey = "post-" + dimensionName;
|
postKey = "post-" + dimensionName;
|
||||||
lock = new ReentrantLock();
|
lock = new ReentrantLock();
|
||||||
}
|
}
|
||||||
@ -51,23 +45,20 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
|||||||
public void onInit(World world, RNG rng)
|
public void onInit(World world, RNG rng)
|
||||||
{
|
{
|
||||||
super.onInit(world, 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);
|
for(Class<? extends IrisPostBlockFilter> i : Iris.postProcessors)
|
||||||
setMaxPhase(0);
|
|
||||||
|
|
||||||
for(IrisPostBlockFilter i : filters)
|
|
||||||
{
|
{
|
||||||
setMinPhase(Math.min(getMinPhase(), i.getPhase()));
|
try
|
||||||
setMaxPhase(Math.max(getMaxPhase(), i.getPhase()));
|
{
|
||||||
|
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
|
@Override
|
||||||
@ -75,16 +66,16 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
|||||||
{
|
{
|
||||||
super.onGenerate(random, x, z, data, grid);
|
super.onGenerate(random, x, z, data, grid);
|
||||||
|
|
||||||
if(!getDimension().isPostProcess())
|
if(!getDimension().isPostProcessing())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KList<IrisPostBlockFilter> filters = getDimension().getPostBlockProcessors(this);
|
||||||
currentData = data;
|
currentData = data;
|
||||||
currentPostX = x;
|
currentPostX = x;
|
||||||
currentPostZ = z;
|
currentPostZ = z;
|
||||||
int rx, i, j;
|
int rx, i, j;
|
||||||
|
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
|
|
||||||
for(int h = getMinPhase(); h <= getMaxPhase(); h++)
|
for(int h = getMinPhase(); h <= getMaxPhase(); h++)
|
||||||
@ -124,6 +115,30 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp
|
|||||||
getMetrics().getPost().put(p.getMilliseconds());
|
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
|
@Override
|
||||||
public void updateHeight(int x, int z, int h)
|
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.World.Environment;
|
||||||
import org.bukkit.block.data.BlockData;
|
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.BlockDataTools;
|
||||||
import com.volmit.iris.util.CNG;
|
import com.volmit.iris.util.CNG;
|
||||||
import com.volmit.iris.util.Desc;
|
import com.volmit.iris.util.Desc;
|
||||||
import com.volmit.iris.util.DontObfuscate;
|
import com.volmit.iris.util.DontObfuscate;
|
||||||
|
import com.volmit.iris.util.IrisPostBlockFilter;
|
||||||
import com.volmit.iris.util.KList;
|
import com.volmit.iris.util.KList;
|
||||||
import com.volmit.iris.util.RNG;
|
import com.volmit.iris.util.RNG;
|
||||||
|
|
||||||
@ -57,8 +60,12 @@ public class IrisDimension extends IrisRegistrant
|
|||||||
private boolean decorate = true;
|
private boolean decorate = true;
|
||||||
|
|
||||||
@DontObfuscate
|
@DontObfuscate
|
||||||
@Desc("Use post processing features. Usually for production only as there is a gen speed cost.")
|
@Desc("Use post processing or not")
|
||||||
private boolean postProcess = true;
|
private boolean postProcessing = true;
|
||||||
|
|
||||||
|
@DontObfuscate
|
||||||
|
@Desc("Post Processors")
|
||||||
|
private KList<IrisPostProcessor> postProcessors = getDefaultPostProcessors();
|
||||||
|
|
||||||
@DontObfuscate
|
@DontObfuscate
|
||||||
@Desc("The ceiling dimension. Leave blank for normal sky.")
|
@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 ReentrantLock fluidLock = new ReentrantLock();
|
||||||
private transient KList<BlockData> rockData;
|
private transient KList<BlockData> rockData;
|
||||||
private transient KList<BlockData> fluidData;
|
private transient KList<BlockData> fluidData;
|
||||||
|
private transient KList<IrisPostBlockFilter> cacheFilters;
|
||||||
private transient CNG rockLayerGenerator;
|
private transient CNG rockLayerGenerator;
|
||||||
private transient CNG fluidLayerGenerator;
|
private transient CNG fluidLayerGenerator;
|
||||||
private transient CNG coordFracture;
|
private transient CNG coordFracture;
|
||||||
@ -176,6 +184,32 @@ public class IrisDimension extends IrisRegistrant
|
|||||||
private transient Double rad;
|
private transient Double rad;
|
||||||
private transient boolean inverted;
|
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)
|
public CNG getCoordFracture(RNG rng, int signature)
|
||||||
{
|
{
|
||||||
if(coordFracture == null)
|
if(coordFracture == null)
|
||||||
@ -187,6 +221,20 @@ public class IrisDimension extends IrisRegistrant
|
|||||||
return coordFracture;
|
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)
|
public BlockData getRock(RNG rng, double x, double y, double z)
|
||||||
{
|
{
|
||||||
if(getRockData().size() == 1)
|
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 org.bukkit.block.data.type.Slab;
|
||||||
|
|
||||||
import com.volmit.iris.generator.PostBlockChunkGenerator;
|
import com.volmit.iris.generator.PostBlockChunkGenerator;
|
||||||
|
import com.volmit.iris.layer.post.Post;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ -15,6 +16,7 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess
|
|||||||
{
|
{
|
||||||
public PostBlockChunkGenerator gen;
|
public PostBlockChunkGenerator gen;
|
||||||
private int phase;
|
private int phase;
|
||||||
|
private String key;
|
||||||
private KList<Runnable> queue;
|
private KList<Runnable> queue;
|
||||||
|
|
||||||
public IrisPostBlockFilter(PostBlockChunkGenerator gen, int phase)
|
public IrisPostBlockFilter(PostBlockChunkGenerator gen, int phase)
|
||||||
@ -22,6 +24,7 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess
|
|||||||
this.gen = gen;
|
this.gen = gen;
|
||||||
this.phase = phase;
|
this.phase = phase;
|
||||||
queue = new KList<>();
|
queue = new KList<>();
|
||||||
|
key = getClass().getDeclaredAnnotation(Post.class).value();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IrisPostBlockFilter(PostBlockChunkGenerator gen)
|
public IrisPostBlockFilter(PostBlockChunkGenerator gen)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user