From 633fea8c682db4de3fe9531dcd3f60104f94b33a Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 16 Aug 2020 21:21:19 -0400 Subject: [PATCH 1/7] Merge BiomeChunkGenerator -> TerrainChunkGenerator --- .../volmit/iris/gen/BiomeChunkGenerator.java | 242 ------------------ .../iris/gen/ParallelChunkGenerator.java | 2 +- .../iris/gen/TerrainChunkGenerator.java | 217 +++++++++++++++- 3 files changed, 216 insertions(+), 245 deletions(-) delete mode 100644 src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java diff --git a/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java b/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java deleted file mode 100644 index ba2de4812..000000000 --- a/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.volmit.iris.gen; - -import org.bukkit.World; - -import com.volmit.iris.Iris; -import com.volmit.iris.gen.layer.GenLayerBiome; -import com.volmit.iris.noise.CNG; -import com.volmit.iris.object.InferredType; -import com.volmit.iris.object.IrisBiome; -import com.volmit.iris.object.IrisBiomeGeneratorLink; -import com.volmit.iris.object.IrisDimension; -import com.volmit.iris.object.IrisGenerator; -import com.volmit.iris.object.IrisRegion; -import com.volmit.iris.util.BiomeResult; -import com.volmit.iris.util.ChronoLatch; -import com.volmit.iris.util.IrisInterpolation; -import com.volmit.iris.util.IrisLock; -import com.volmit.iris.util.KList; -import com.volmit.iris.util.KMap; -import com.volmit.iris.util.M; -import com.volmit.iris.util.RNG; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = false) -public abstract class BiomeChunkGenerator extends DimensionChunkGenerator -{ - protected IrisLock regLock; - private KMap generators; - private KMap ceilingGenerators; - protected GenLayerBiome glBiome; - protected CNG masterFracture; - protected ChronoLatch cwarn = new ChronoLatch(1000); - - public BiomeChunkGenerator(String dimensionName) - { - super(dimensionName); - generators = new KMap<>(); - ceilingGenerators = new KMap<>(); - regLock = new IrisLock("BiomeChunkGenerator"); - } - - public void onInit(World world, RNG rng) - { - super.onInit(world, rng); - loadGenerators(); - glBiome = new GenLayerBiome(this, masterRandom.nextParallelRNG(1)); - masterFracture = CNG.signature(rng.nextParallelRNG(13)).scale(0.12); - } - - @Override - public void onHotload() - { - super.onHotload(); - loadGenerators(); - glBiome = new GenLayerBiome(this, masterRandom.nextParallelRNG(1)); - } - - public void registerGenerator(IrisGenerator g, IrisDimension dim) - { - KMap generators = dim.isInverted() ? ceilingGenerators : this.generators; - - regLock.lock(); - if(g.getLoadKey() == null || generators.containsKey(g.getLoadKey())) - { - regLock.unlock(); - return; - } - - regLock.unlock(); - generators.put(g.getLoadKey(), g); - } - - protected KMap getGenerators() - { - return getDimension().isInverted() ? ceilingGenerators : generators; - } - - protected double getBiomeHeight(double rx, double rz, int x, int z) - { - double h = 0; - - for(IrisGenerator i : getGenerators().values()) - { - h += interpolateGenerator(rx, rz, i); - } - - return h; - } - - protected double interpolateGenerator(double rx, double rz, IrisGenerator gen) - { - double hi = IrisInterpolation.getNoise(gen.getInterpolationFunction(), (int) Math.round(rx), (int) Math.round(rz), gen.getInterpolationScale(), (xx, zz) -> - { - try - { - IrisBiome b = sampleBiome((int) xx, (int) zz).getBiome(); - - for(IrisBiomeGeneratorLink i : b.getGenerators()) - { - if(i.getGenerator().equals(gen.getLoadKey())) - { - return i.getMax(); - } - } - - } - - catch(Throwable e) - { - e.printStackTrace(); - Iris.warn("Failed to sample hi biome at " + rx + " " + rz + " using the generator " + gen.getLoadKey()); - } - return 0; - }); - - double lo = IrisInterpolation.getNoise(gen.getInterpolationFunction(), (int) Math.round(rx), (int) Math.round(rz), gen.getInterpolationScale(), (xx, zz) -> - { - try - { - IrisBiome b = sampleBiome((int) xx, (int) zz).getBiome(); - - for(IrisBiomeGeneratorLink i : b.getGenerators()) - { - if(i.getGenerator().equals(gen.getLoadKey())) - { - return i.getMin(); - } - } - } - - catch(Throwable e) - { - e.printStackTrace(); - Iris.warn("Failed to sample lo biome at " + rx + " " + rz + " using the generator " + gen.getLoadKey()); - } - - return 0; - }); - - return M.lerp(lo, hi, gen.getHeight(rx, rz, world.getSeed() + 239945)); - } - - protected void loadGenerators() - { - generators.clear(); - ceilingGenerators.clear(); - loadGenerators(((CeilingChunkGenerator) this).getFloorDimension()); - loadGenerators(((CeilingChunkGenerator) this).getCeilingDimension()); - } - - protected void loadGenerators(IrisDimension dim) - { - if(dim == null) - { - return; - } - - KList touch = new KList<>(); - KList loadQueue = new KList<>(); - - for(String i : dim.getRegions()) - { - IrisRegion r = loadRegion(i); - - if(r != null) - { - loadQueue.addAll(r.getLandBiomes()); - loadQueue.addAll(r.getSeaBiomes()); - loadQueue.addAll(r.getShoreBiomes()); - loadQueue.addAll(r.getRidgeBiomeKeys()); - loadQueue.addAll(r.getSpotBiomeKeys()); - } - } - - while(!loadQueue.isEmpty()) - { - String next = loadQueue.pop(); - - if(!touch.contains(next)) - { - touch.add(next); - IrisBiome biome = loadBiome(next); - biome.getGenerators().forEach((i) -> registerGenerator(i.getCachedGenerator(this), dim)); - loadQueue.addAll(biome.getChildren()); - } - } - } - - public IrisRegion sampleRegion(int x, int z) - { - - double wx = getModifiedX(x, z); - double wz = getModifiedZ(x, z); - return glBiome.getRegion(wx, wz); - } - - public BiomeResult sampleBiome(int x, int z) - { - return getCache().getRawBiome(x, z, () -> - { - if(!getDimension().getFocus().equals("")) - { - IrisBiome biome = loadBiome(getDimension().getFocus()); - - for(String i : getDimension().getRegions()) - { - IrisRegion reg = loadRegion(i); - - if(reg.getLandBiomes().contains(biome.getLoadKey())) - { - biome.setInferredType(InferredType.LAND); - break; - } - - if(reg.getSeaBiomes().contains(biome.getLoadKey())) - { - biome.setInferredType(InferredType.SEA); - break; - } - - if(reg.getShoreBiomes().contains(biome.getLoadKey())) - { - biome.setInferredType(InferredType.SHORE); - break; - } - } - - return new BiomeResult(biome, 0); - } - - double wx = getModifiedX(x, z); - double wz = getModifiedZ(x, z); - IrisRegion region = glBiome.getRegion(wx, wz); - BiomeResult res = glBiome.generateRegionData(wx, wz, x, z, region); - - return res; - }); - } -} diff --git a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java index 2cfad7565..1b1fb40bc 100644 --- a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java @@ -17,7 +17,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) -public abstract class ParallelChunkGenerator extends BiomeChunkGenerator +public abstract class ParallelChunkGenerator extends DimensionChunkGenerator { private GroupedExecutor accelerant; private int threads; diff --git a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java index a061eb110..a1204c955 100644 --- a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java @@ -7,21 +7,31 @@ import org.bukkit.block.data.Bisected; import org.bukkit.block.data.Bisected.Half; import org.bukkit.block.data.BlockData; +import com.volmit.iris.Iris; import com.volmit.iris.gen.atomics.AtomicSliver; +import com.volmit.iris.gen.layer.GenLayerBiome; import com.volmit.iris.gen.layer.GenLayerCarve; import com.volmit.iris.gen.layer.GenLayerCave; +import com.volmit.iris.noise.CNG; import com.volmit.iris.object.DecorationPart; import com.volmit.iris.object.InferredType; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBiomeDecorator; +import com.volmit.iris.object.IrisBiomeGeneratorLink; import com.volmit.iris.object.IrisDepositGenerator; +import com.volmit.iris.object.IrisDimension; +import com.volmit.iris.object.IrisGenerator; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.B; import com.volmit.iris.util.BiomeMap; import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.CaveResult; +import com.volmit.iris.util.ChronoLatch; import com.volmit.iris.util.HeightMap; +import com.volmit.iris.util.IrisInterpolation; +import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KList; +import com.volmit.iris.util.KMap; import com.volmit.iris.util.M; import com.volmit.iris.util.RNG; @@ -37,15 +47,28 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator private GenLayerCave glCave; private GenLayerCarve glCarve; private RNG rockRandom; + protected IrisLock regLock; + private KMap generators; + private KMap ceilingGenerators; + protected GenLayerBiome glBiome; + protected CNG masterFracture; + protected ChronoLatch cwarn = new ChronoLatch(1000); public TerrainChunkGenerator(String dimensionName, int threads) { super(dimensionName, threads); + generators = new KMap<>(); + ceilingGenerators = new KMap<>(); + regLock = new IrisLock("BiomeChunkGenerator"); } + @Override public void onInit(World world, RNG rng) { super.onInit(world, rng); + loadGenerators(); + glBiome = new GenLayerBiome(this, masterRandom.nextParallelRNG(1)); + masterFracture = CNG.signature(rng.nextParallelRNG(13)).scale(0.12); rockRandom = getMasterRandom().nextParallelRNG(2858678); glCave = new GenLayerCave(this, rng.nextParallelRNG(238948)); glCarve = new GenLayerCarve(this, rng.nextParallelRNG(968346576)); @@ -549,10 +572,14 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator return sampleTrueBiome(x, z, getTerrainHeight(x, z)); } - @Override public IrisRegion sampleRegion(int x, int z) { - return getCache().getRegion(x, z, () -> super.sampleRegion(x, z)); + return getCache().getRegion(x, z, () -> + { + double wx = getModifiedX(x, z); + double wz = getModifiedZ(x, z); + return glBiome.getRegion(wx, wz); + }); } public BiomeResult sampleTrueBiome(int x, int z, double noise) @@ -616,4 +643,190 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator { return Math.max(getTerrainHeight(x, z), getFluidHeight()); } + + //////////////////// + // BIOME METHODS + /////////////////// + + @Override + public void onHotload() + { + super.onHotload(); + loadGenerators(); + glBiome = new GenLayerBiome(this, masterRandom.nextParallelRNG(1)); + } + + public void registerGenerator(IrisGenerator g, IrisDimension dim) + { + KMap generators = dim.isInverted() ? ceilingGenerators : this.generators; + + regLock.lock(); + if(g.getLoadKey() == null || generators.containsKey(g.getLoadKey())) + { + regLock.unlock(); + return; + } + + regLock.unlock(); + generators.put(g.getLoadKey(), g); + } + + protected KMap getGenerators() + { + return getDimension().isInverted() ? ceilingGenerators : generators; + } + + protected double getBiomeHeight(double rx, double rz, int x, int z) + { + double h = 0; + + for(IrisGenerator i : getGenerators().values()) + { + h += interpolateGenerator(rx, rz, i); + } + + return h; + } + + protected double interpolateGenerator(double rx, double rz, IrisGenerator gen) + { + double hi = IrisInterpolation.getNoise(gen.getInterpolationFunction(), (int) Math.round(rx), (int) Math.round(rz), gen.getInterpolationScale(), (xx, zz) -> + { + try + { + IrisBiome b = sampleBiome((int) xx, (int) zz).getBiome(); + + for(IrisBiomeGeneratorLink i : b.getGenerators()) + { + if(i.getGenerator().equals(gen.getLoadKey())) + { + return i.getMax(); + } + } + + } + + catch(Throwable e) + { + e.printStackTrace(); + Iris.warn("Failed to sample hi biome at " + rx + " " + rz + " using the generator " + gen.getLoadKey()); + } + return 0; + }); + + double lo = IrisInterpolation.getNoise(gen.getInterpolationFunction(), (int) Math.round(rx), (int) Math.round(rz), gen.getInterpolationScale(), (xx, zz) -> + { + try + { + IrisBiome b = sampleBiome((int) xx, (int) zz).getBiome(); + + for(IrisBiomeGeneratorLink i : b.getGenerators()) + { + if(i.getGenerator().equals(gen.getLoadKey())) + { + return i.getMin(); + } + } + } + + catch(Throwable e) + { + e.printStackTrace(); + Iris.warn("Failed to sample lo biome at " + rx + " " + rz + " using the generator " + gen.getLoadKey()); + } + + return 0; + }); + + return M.lerp(lo, hi, gen.getHeight(rx, rz, world.getSeed() + 239945)); + } + + protected void loadGenerators() + { + generators.clear(); + ceilingGenerators.clear(); + loadGenerators(((CeilingChunkGenerator) this).getFloorDimension()); + loadGenerators(((CeilingChunkGenerator) this).getCeilingDimension()); + } + + protected void loadGenerators(IrisDimension dim) + { + if(dim == null) + { + return; + } + + KList touch = new KList<>(); + KList loadQueue = new KList<>(); + + for(String i : dim.getRegions()) + { + IrisRegion r = loadRegion(i); + + if(r != null) + { + loadQueue.addAll(r.getLandBiomes()); + loadQueue.addAll(r.getSeaBiomes()); + loadQueue.addAll(r.getShoreBiomes()); + loadQueue.addAll(r.getRidgeBiomeKeys()); + loadQueue.addAll(r.getSpotBiomeKeys()); + } + } + + while(!loadQueue.isEmpty()) + { + String next = loadQueue.pop(); + + if(!touch.contains(next)) + { + touch.add(next); + IrisBiome biome = loadBiome(next); + biome.getGenerators().forEach((i) -> registerGenerator(i.getCachedGenerator(this), dim)); + loadQueue.addAll(biome.getChildren()); + } + } + } + + public BiomeResult sampleBiome(int x, int z) + { + return getCache().getRawBiome(x, z, () -> + { + if(!getDimension().getFocus().equals("")) + { + IrisBiome biome = loadBiome(getDimension().getFocus()); + + for(String i : getDimension().getRegions()) + { + IrisRegion reg = loadRegion(i); + + if(reg.getLandBiomes().contains(biome.getLoadKey())) + { + biome.setInferredType(InferredType.LAND); + break; + } + + if(reg.getSeaBiomes().contains(biome.getLoadKey())) + { + biome.setInferredType(InferredType.SEA); + break; + } + + if(reg.getShoreBiomes().contains(biome.getLoadKey())) + { + biome.setInferredType(InferredType.SHORE); + break; + } + } + + return new BiomeResult(biome, 0); + } + + double wx = getModifiedX(x, z); + double wz = getModifiedZ(x, z); + IrisRegion region = glBiome.getRegion(wx, wz); + BiomeResult res = glBiome.generateRegionData(wx, wz, x, z, region); + + return res; + }); + } } From 81f6ce26d422b780429361a0241252a091c03143 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 16 Aug 2020 21:26:27 -0400 Subject: [PATCH 2/7] Stop overlocking --- .../com/volmit/iris/gen/ContextualChunkGenerator.java | 9 --------- .../java/com/volmit/iris/gen/ParallelChunkGenerator.java | 5 ----- .../java/com/volmit/iris/gen/TerrainChunkGenerator.java | 4 ---- 3 files changed, 18 deletions(-) diff --git a/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java index 7c2398809..8de9bf5db 100644 --- a/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java @@ -34,7 +34,6 @@ import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisStructure; import com.volmit.iris.util.B; import com.volmit.iris.util.ChronoLatch; -import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.J; import com.volmit.iris.util.M; import com.volmit.iris.util.PrecisionStopwatch; @@ -59,7 +58,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements protected ChronoLatch tickLatch; protected ChronoLatch pushLatch; protected IrisMetrics metrics; - protected IrisLock hlock; protected World world; protected int generated; protected int ticks; @@ -74,7 +72,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements tickLatch = new ChronoLatch(650); perSecond = new ChronoLatch(1000); hlast = M.ms(); - hlock = new IrisLock("HotLock"); cache = new AtomicMulticache(); CNG.creates = 0; generated = 0; @@ -318,7 +315,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @Override public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid) { - hlock.lock(); setHotloadable(false); if(!dev) { @@ -330,7 +326,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements if(failing) { - hlock.unlock(); return generateChunkDataFailure(world, no, x, z, biomeGrid); } @@ -359,7 +354,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements Iris.instance.hit(hits); metrics.getLoss().put(sx.getMilliseconds() - s.getMilliseconds()); setHotloadable(true); - hlock.unlock(); return c; } @@ -369,7 +363,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements } setHotloadable(true); - hlock.unlock(); return generateChunkDataFailure(world, no, x, z, biomeGrid); } @@ -380,12 +373,10 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements return; } - hlock.lock(); if(world != null) { checkHotload(world); } - hlock.unlock(); } private void checkHotload(World world) diff --git a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java index 1b1fb40bc..af82c9150 100644 --- a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java @@ -8,7 +8,6 @@ import com.volmit.iris.gen.atomics.AtomicSliverMap; import com.volmit.iris.util.BiomeMap; import com.volmit.iris.util.GroupedExecutor; import com.volmit.iris.util.HeightMap; -import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.RNG; @@ -23,7 +22,6 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator private int threads; protected int cacheX; protected int cacheZ; - private IrisLock genlock; protected boolean cachingAllowed; public ParallelChunkGenerator(String dimensionName, int threads) @@ -32,7 +30,6 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator cacheX = 0; cacheZ = 0; this.threads = threads; - genlock = new IrisLock("ParallelGenLock"); cachingAllowed = false; } @@ -67,7 +64,6 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) { - genlock.lock(); cacheX = x; cacheZ = z; getCache().targetChunk(cacheX, cacheZ); @@ -101,7 +97,6 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator getMetrics().getTerrain().put(p.getMilliseconds()); p = PrecisionStopwatch.start(); onPostGenerate(random, x, z, data, grid, height, biomeMap); - genlock.unlock(); } protected void onClose() diff --git a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java index a1204c955..7523a9a99 100644 --- a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java @@ -644,10 +644,6 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator return Math.max(getTerrainHeight(x, z), getFluidHeight()); } - //////////////////// - // BIOME METHODS - /////////////////// - @Override public void onHotload() { From af227512106a8c8fce4e4858f9d8c645e5836d60 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 16 Aug 2020 22:08:57 -0400 Subject: [PATCH 3/7] Remove Ceiling Gen & Post Block Sep --- .../iris/gen/CeilingChunkGenerator.java | 154 ------------------ .../volmit/iris/gen/IrisChunkGenerator.java | 12 +- .../iris/gen/ParallaxChunkGenerator.java | 9 +- .../iris/gen/PostBlockChunkGenerator.java | 119 ++++++++------ .../iris/gen/TerrainChunkGenerator.java | 10 +- .../iris/gen/post/PostFloatingNibDeleter.java | 9 +- .../volmit/iris/gen/post/PostNibSmoother.java | 9 +- .../iris/gen/post/PostPotholeFiller.java | 6 +- .../com/volmit/iris/gen/post/PostSlabber.java | 11 +- .../volmit/iris/gen/post/PostWallPatcher.java | 9 +- .../volmit/iris/gen/post/PostWaterlogger.java | 17 +- .../com/volmit/iris/object/IrisDimension.java | 11 -- .../volmit/iris/util/IPostBlockAccess.java | 5 +- .../volmit/iris/util/IrisPostBlockFilter.java | 47 +++--- 14 files changed, 137 insertions(+), 291 deletions(-) delete mode 100644 src/main/java/com/volmit/iris/gen/CeilingChunkGenerator.java diff --git a/src/main/java/com/volmit/iris/gen/CeilingChunkGenerator.java b/src/main/java/com/volmit/iris/gen/CeilingChunkGenerator.java deleted file mode 100644 index c22757fbd..000000000 --- a/src/main/java/com/volmit/iris/gen/CeilingChunkGenerator.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.volmit.iris.gen; - -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; - -import com.volmit.iris.object.IrisDimension; -import com.volmit.iris.util.InvertedBiomeGrid; -import com.volmit.iris.util.RNG; - -public abstract class CeilingChunkGenerator extends PostBlockChunkGenerator -{ - protected boolean generatingCeiling = false; - protected boolean ceilingCached = false; - protected IrisDimension cacheCeiling = null; - protected IrisDimension cacheFloor = null; - - public CeilingChunkGenerator(String dimensionName, int threads) - { - super(dimensionName, threads); - } - - @Override - protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) - { - targetFloor(); - generate(random, x, z, data, grid); - - if(getFloorDimension().isMirrorCeiling()) - { - writeInverted(copy(data), data); - } - - else if(getCeilingDimension() != null) - { - ChunkData ceiling = createChunkData(world); - InvertedBiomeGrid ceilingGrid = new InvertedBiomeGrid(grid); - targetCeiling(); - generate(random, x, z, ceiling, ceilingGrid); - writeInverted(ceiling, data); - } - } - - @Override - public void onHotload() - { - super.onHotload(); - ceilingCached = false; - cacheCeiling = null; - cacheFloor = null; - getCache().targetChunk(0, 0); - } - - private void targetFloor() - { - generatingCeiling = false; - } - - private void targetCeiling() - { - generatingCeiling = true; - } - - private void generate(RNG random, int x, int z, ChunkData ceiling, BiomeGrid grid) - { - super.onGenerate(random, x, z, ceiling, grid); - } - - @Override - public IrisDimension getDimension() - { - return generatingCeiling ? getCeilingDimension() : getFloorDimension(); - } - - public IrisDimension getFloorDimension() - { - if(cacheFloor != null) - { - return cacheFloor; - } - - return cacheFloor = super.getDimension(); - } - - public IrisDimension getCeilingDimension() - { - if(ceilingCached) - { - return cacheCeiling; - } - - if(getFloorDimension().getCeiling().isEmpty()) - { - return null; - } - - IrisDimension c = loadDimension(getFloorDimension().getCeiling()); - - if(c != null) - { - c.setInverted(true); - } - - ceilingCached = true; - cacheCeiling = c; - - return c; - } - - public void writeInverted(ChunkData data, ChunkData into) - { - for(int i = 0; i < 16; i++) - { - for(int j = 0; j < data.getMaxHeight(); j++) - { - for(int k = 0; k < 16; k++) - { - BlockData b = data.getBlockData(i, j, k); - - if(b == null || b.getMaterial().equals(Material.AIR)) - { - continue; - } - - into.setBlock(i, data.getMaxHeight() - j, k, b); - } - } - } - } - - public ChunkData copy(ChunkData d) - { - ChunkData copy = createChunkData(world); - - for(int i = 0; i < 16; i++) - { - for(int j = 0; j < d.getMaxHeight(); j++) - { - for(int k = 0; k < 16; k++) - { - BlockData b = d.getBlockData(i, j, k); - - if(b == null || b.getMaterial().equals(Material.AIR)) - { - continue; - } - - copy.setBlock(i, j, k, b); - } - } - } - - return copy; - } -} diff --git a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java index 9cf163988..9e6bc29f1 100644 --- a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java @@ -30,7 +30,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) -public class IrisChunkGenerator extends CeilingChunkGenerator implements IrisContext +public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisContext { private Method initLighting; private IrisLock lock; @@ -139,11 +139,8 @@ public class IrisChunkGenerator extends CeilingChunkGenerator implements IrisCon try { parallaxMap.saveAll(); - ceilingParallaxMap.saveAll(); parallaxMap.getLoadedChunks().clear(); parallaxMap.getLoadedRegions().clear(); - ceilingParallaxMap.getLoadedChunks().clear(); - ceilingParallaxMap.getLoadedRegions().clear(); } catch(IOException e) @@ -152,7 +149,6 @@ public class IrisChunkGenerator extends CeilingChunkGenerator implements IrisCon } setAvailableFilters(null); - setCeilingSliverCache(null); setSliverCache(null); Iris.info("Closing Iris Dimension " + getWorld().getName()); } @@ -217,14 +213,8 @@ public class IrisChunkGenerator extends CeilingChunkGenerator implements IrisCon bytes += i.guessMemoryUsage(); } - for(AtomicRegionData i : ceilingParallaxMap.getLoadedRegions().values()) - { - bytes += i.guessMemoryUsage(); - } - bytes += getCache().getSize() * 65; bytes += parallaxMap.getLoadedChunks().size() * 256 * 4 * 460; - bytes += ceilingParallaxMap.getLoadedChunks().size() * 256 * 4 * 460; bytes += getSliverBuffer() * 220; bytes += 823 * getData().getObjectLoader().getTotalStorage(); diff --git a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java index 23f5e6bbd..172f9b263 100644 --- a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java @@ -37,8 +37,6 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple { protected KMap sliverCache; protected AtomicWorldData parallaxMap; - protected KMap ceilingSliverCache; - protected AtomicWorldData ceilingParallaxMap; private MasterLock masterLock; private IrisLock lock = new IrisLock("ParallaxLock"); private IrisLock lockq = new IrisLock("ParallaxQueueLock"); @@ -48,7 +46,6 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple { super(dimensionName, threads); sliverCache = new KMap<>(); - ceilingSliverCache = new KMap<>(); sliverBuffer = 0; masterLock = new MasterLock(); } @@ -57,12 +54,11 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple { super.onInit(world, rng); parallaxMap = new AtomicWorldData(world, "floor"); - ceilingParallaxMap = new AtomicWorldData(world, "ceiling"); } protected KMap getSliverCache() { - return getDimension().isInverted() ? ceilingSliverCache : sliverCache; + return sliverCache; } protected void onClose() @@ -72,7 +68,6 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple try { parallaxMap.unloadAll(true); - ceilingParallaxMap.unloadAll(true); } catch(IOException e) @@ -150,7 +145,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple public AtomicWorldData getParallaxMap() { - return getDimension().isInverted() ? ceilingParallaxMap : parallaxMap; + return parallaxMap; } public AtomicSliverMap getParallaxChunk(int x, int z) diff --git a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java index 31fcf0698..17980f0b8 100644 --- a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java @@ -4,7 +4,6 @@ import org.bukkit.World; import org.bukkit.block.data.BlockData; import com.volmit.iris.Iris; -import com.volmit.iris.object.IrisDimension; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.IPostBlockAccess; import com.volmit.iris.util.IrisLock; @@ -18,36 +17,35 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) -public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator implements IPostBlockAccess { - protected boolean generatingCeiling = false; - protected boolean ceilingCached = false; - protected IrisDimension cacheCeiling = null; - protected IrisDimension cacheFloor = null; - private int currentPostX; - private int currentPostZ; - private ChunkData currentData; +public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator implements IPostBlockAccess +{ private KList availableFilters; private String postKey; private IrisLock lock; private int minPhase; private int maxPhase; - public PostBlockChunkGenerator(String dimensionName, int threads) { + public PostBlockChunkGenerator(String dimensionName, int threads) + { super(dimensionName, threads); availableFilters = new KList<>(); postKey = "post-" + dimensionName; lock = new IrisLock("PostChunkGenerator"); } - public void onInit(World world, RNG rng) { + public void onInit(World world, RNG rng) + { super.onInit(world, rng); - for (Class i : Iris.postProcessors) { - try { + for(Class i : Iris.postProcessors) + { + try + { availableFilters.add(i.getConstructor(PostBlockChunkGenerator.class).newInstance(this)); } - catch (Throwable e) { + catch(Throwable e) + { Iris.error("Failed to initialize post processor: " + i.getCanonicalName()); fail(e); } @@ -55,33 +53,39 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp } @Override - protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) { + protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) + { super.onGenerate(random, x, z, data, grid); - if (!getDimension().isPostProcessing()) { + 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++) { - for (i = 0; i < 16; i++) { + for(int h = getMinPhase(); h <= getMaxPhase(); h++) + { + for(i = 0; i < 16; i++) + { rx = (x << 4) + i; - for (j = 0; j < 16; j++) { + for(j = 0; j < 16; j++) + { int rxx = rx; int rzz = (z << 4) + j; int hh = h; - getAccelerant().queue("post", () -> { - for (IrisPostBlockFilter f : filters) { - if (f.getPhase() == hh) { - f.onPost(rxx, rzz); + getAccelerant().queue("post", () -> + { + for(IrisPostBlockFilter f : filters) + { + if(f.getPhase() == hh) + { + f.onPost(rxx, rzz, x, z, data); } } }); @@ -90,14 +94,19 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp getAccelerant().waitFor("post"); - for (IrisPostBlockFilter f : filters) { - if (f.getPhase() == h) { - while (f.getQueue().size() > 0) { - try { + for(IrisPostBlockFilter f : filters) + { + if(f.getPhase() == h) + { + while(f.getQueue().size() > 0) + { + try + { f.getQueue().pop().run(); } - catch (Throwable e) { + catch(Throwable e) + { } } @@ -109,15 +118,19 @@ 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); + 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) { + catch(Throwable e) + { Iris.error("Failed initialize find post processor: " + processor); fail(e); } @@ -130,13 +143,16 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp } @Override - public void updateHeight(int x, int z, int h) { + public void updateHeight(int x, int z, int h) + { getCache().updateHeight(x, z, h); } @Override - public BlockData getPostBlock(int x, int y, int z) { - if (x >> 4 == currentPostX && z >> 4 == currentPostZ) { + public BlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) + { + if(x >> 4 == currentPostX && z >> 4 == currentPostZ) + { lock.lock(); BlockData d = currentData.getBlockData(x & 15, y, z & 15); lock.unlock(); @@ -147,31 +163,36 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp } @Override - public void setPostBlock(int x, int y, int z, BlockData d) { - if (x >> 4 == currentPostX && z >> 4 == currentPostZ) { + public void setPostBlock(int x, int y, int z, BlockData d, int currentPostX, int currentPostZ, ChunkData currentData) + { + if(x >> 4 == currentPostX && z >> 4 == currentPostZ) + { lock.lock(); currentData.setBlock(x & 15, y, z & 15, d); lock.unlock(); } - else { - Iris.warn("Post Block Overdraw: " + currentPostX + "," + currentPostZ + " into " + (x >> 4) + ", " - + (z >> 4)); + else + { + Iris.warn("Post Block Overdraw: " + currentPostX + "," + currentPostZ + " into " + (x >> 4) + ", " + (z >> 4)); } } @Override - public int highestTerrainOrFluidBlock(int x, int z) { + public int highestTerrainOrFluidBlock(int x, int z) + { return getHighest(x, z, false); } @Override - public int highestTerrainBlock(int x, int z) { + public int highestTerrainBlock(int x, int z) + { return getHighest(x, z, true); } @Override - public KList caveFloors(int x, int z) { + public KList caveFloors(int x, int z) + { return getCaves(x, z); } } diff --git a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java index 7523a9a99..1d3cecdc3 100644 --- a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java @@ -49,7 +49,6 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator private RNG rockRandom; protected IrisLock regLock; private KMap generators; - private KMap ceilingGenerators; protected GenLayerBiome glBiome; protected CNG masterFracture; protected ChronoLatch cwarn = new ChronoLatch(1000); @@ -58,7 +57,6 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator { super(dimensionName, threads); generators = new KMap<>(); - ceilingGenerators = new KMap<>(); regLock = new IrisLock("BiomeChunkGenerator"); } @@ -654,7 +652,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator public void registerGenerator(IrisGenerator g, IrisDimension dim) { - KMap generators = dim.isInverted() ? ceilingGenerators : this.generators; + KMap generators = this.generators; regLock.lock(); if(g.getLoadKey() == null || generators.containsKey(g.getLoadKey())) @@ -669,7 +667,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator protected KMap getGenerators() { - return getDimension().isInverted() ? ceilingGenerators : generators; + return generators; } protected double getBiomeHeight(double rx, double rz, int x, int z) @@ -740,9 +738,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator protected void loadGenerators() { generators.clear(); - ceilingGenerators.clear(); - loadGenerators(((CeilingChunkGenerator) this).getFloorDimension()); - loadGenerators(((CeilingChunkGenerator) this).getCeilingDimension()); + loadGenerators(getDimension()); } protected void loadGenerators(IrisDimension dim) diff --git a/src/main/java/com/volmit/iris/gen/post/PostFloatingNibDeleter.java b/src/main/java/com/volmit/iris/gen/post/PostFloatingNibDeleter.java index 6826396d8..d7164b42d 100644 --- a/src/main/java/com/volmit/iris/gen/post/PostFloatingNibDeleter.java +++ b/src/main/java/com/volmit/iris/gen/post/PostFloatingNibDeleter.java @@ -1,6 +1,7 @@ package com.volmit.iris.gen.post; import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.gen.PostBlockChunkGenerator; import com.volmit.iris.util.B; @@ -22,7 +23,7 @@ public class PostFloatingNibDeleter extends IrisPostBlockFilter } @Override - public void onPost(int x, int z) + public void onPost(int x, int z, int currentPostX, int currentPostZ, ChunkData currentData) { int g = 0; int h = highestTerrainBlock(x, z); @@ -41,13 +42,13 @@ public class PostFloatingNibDeleter extends IrisPostBlockFilter g += hc < h - 1 ? 1 : 0; g += hd < h - 1 ? 1 : 0; - if(g == 4 && isAir(x, h - 1, z)) + if(g == 4 && isAir(x, h - 1, z, currentPostX, currentPostZ, currentData)) { - setPostBlock(x, h, z, AIR); + setPostBlock(x, h, z, AIR, currentPostX, currentPostZ, currentData); for(int i = h - 1; i > 0; i--) { - if(!isAir(x, i, z)) + if(!isAir(x, i, z, currentPostX, currentPostZ, currentData)) { updateHeight(x, z, i); break; diff --git a/src/main/java/com/volmit/iris/gen/post/PostNibSmoother.java b/src/main/java/com/volmit/iris/gen/post/PostNibSmoother.java index 06a85f5b3..e482b729f 100644 --- a/src/main/java/com/volmit/iris/gen/post/PostNibSmoother.java +++ b/src/main/java/com/volmit/iris/gen/post/PostNibSmoother.java @@ -2,6 +2,7 @@ package com.volmit.iris.gen.post; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.gen.PostBlockChunkGenerator; import com.volmit.iris.util.IrisPostBlockFilter; @@ -20,7 +21,7 @@ public class PostNibSmoother extends IrisPostBlockFilter } @Override - public void onPost(int x, int z) + public void onPost(int x, int z, int currentPostX, int currentPostZ, ChunkData currentData) { int g = 0; int h = highestTerrainBlock(x, z); @@ -35,13 +36,13 @@ public class PostNibSmoother extends IrisPostBlockFilter if(g >= 3) { - BlockData bc = getPostBlock(x, h, z); - BlockData b = getPostBlock(x, h + 1, z); + BlockData bc = getPostBlock(x, h, z, currentPostX, currentPostZ, currentData); + BlockData b = getPostBlock(x, h + 1, z, currentPostX, currentPostZ, currentData); Material m = bc.getMaterial(); if(m.isSolid()) { - setPostBlock(x, h, z, b); + setPostBlock(x, h, z, b, currentPostX, currentPostZ, currentData); updateHeight(x, z, h - 1); } } diff --git a/src/main/java/com/volmit/iris/gen/post/PostPotholeFiller.java b/src/main/java/com/volmit/iris/gen/post/PostPotholeFiller.java index b3c87048b..215dc1b34 100644 --- a/src/main/java/com/volmit/iris/gen/post/PostPotholeFiller.java +++ b/src/main/java/com/volmit/iris/gen/post/PostPotholeFiller.java @@ -1,5 +1,7 @@ package com.volmit.iris.gen.post; +import org.bukkit.generator.ChunkGenerator.ChunkData; + import com.volmit.iris.gen.PostBlockChunkGenerator; import com.volmit.iris.util.IrisPostBlockFilter; @@ -17,7 +19,7 @@ public class PostPotholeFiller extends IrisPostBlockFilter } @Override - public void onPost(int x, int z) + public void onPost(int x, int z, int currentPostX, int currentPostZ, ChunkData currentData) { int g = 0; int h = highestTerrainBlock(x, z); @@ -32,7 +34,7 @@ public class PostPotholeFiller extends IrisPostBlockFilter if(g >= 3) { - setPostBlock(x, h + 1, z, getPostBlock(x, h, z)); + setPostBlock(x, h + 1, z, getPostBlock(x, h, z, currentPostX, currentPostZ, currentData), currentPostX, currentPostZ, currentData); updateHeight(x, z, h + 1); } } diff --git a/src/main/java/com/volmit/iris/gen/post/PostSlabber.java b/src/main/java/com/volmit/iris/gen/post/PostSlabber.java index 98eaae1a1..fb69fe5dc 100644 --- a/src/main/java/com/volmit/iris/gen/post/PostSlabber.java +++ b/src/main/java/com/volmit/iris/gen/post/PostSlabber.java @@ -2,6 +2,7 @@ package com.volmit.iris.gen.post; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.gen.PostBlockChunkGenerator; import com.volmit.iris.util.IrisPostBlockFilter; @@ -26,7 +27,7 @@ public class PostSlabber extends IrisPostBlockFilter } @Override - public void onPost(int x, int z) + public void onPost(int x, int z, int currentPostX, int currentPostZ, ChunkData currentData) { int h = highestTerrainBlock(x, z); int ha = highestTerrainBlock(x + 1, z); @@ -34,7 +35,7 @@ public class PostSlabber extends IrisPostBlockFilter int hc = highestTerrainBlock(x - 1, z); int hd = highestTerrainBlock(x, z - 1); - if((ha == h + 1 && isSolid(x + 1, ha, z)) || (hb == h + 1 && isSolid(x, hb, z + 1)) || (hc == h + 1 && isSolid(x - 1, hc, z)) || (hd == h + 1 && isSolid(x, hd, z - 1))) + if((ha == h + 1 && isSolid(x + 1, ha, z, currentPostX, currentPostZ, currentData)) || (hb == h + 1 && isSolid(x, hb, z + 1, currentPostX, currentPostZ, currentData)) || (hc == h + 1 && isSolid(x - 1, hc, z, currentPostX, currentPostZ, currentData)) || (hd == h + 1 && isSolid(x, hd, z - 1, currentPostX, currentPostZ, currentData))) { BlockData d = gen.sampleTrueBiome(x, z).getBiome().getSlab().get(rng, x, h, z); @@ -50,16 +51,16 @@ public class PostSlabber extends IrisPostBlockFilter return; } - if(isSnowLayer(x, h, z)) + if(isSnowLayer(x, h, z, currentPostX, currentPostZ, currentData)) { return; } - if(isAirOrWater(x, h + 2, z)) + if(isAirOrWater(x, h + 2, z, currentPostX, currentPostZ, currentData)) { queue(() -> { - setPostBlock(x, h + 1, z, d); + setPostBlock(x, h + 1, z, d, currentPostX, currentPostZ, currentData); updateHeight(x, z, h + 1); }); } diff --git a/src/main/java/com/volmit/iris/gen/post/PostWallPatcher.java b/src/main/java/com/volmit/iris/gen/post/PostWallPatcher.java index bc7b47f6a..cd15fdf6b 100644 --- a/src/main/java/com/volmit/iris/gen/post/PostWallPatcher.java +++ b/src/main/java/com/volmit/iris/gen/post/PostWallPatcher.java @@ -2,6 +2,7 @@ package com.volmit.iris.gen.post; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.gen.PostBlockChunkGenerator; import com.volmit.iris.object.IrisBiome; @@ -26,7 +27,7 @@ public class PostWallPatcher extends IrisPostBlockFilter } @Override - public void onPost(int x, int z) + public void onPost(int x, int z, int currentPostX, int currentPostZ, ChunkData currentData) { IrisBiome biome = gen.sampleTrueBiome(x, z).getBiome(); int h, ha, hb, hc, hd; @@ -48,7 +49,7 @@ public class PostWallPatcher extends IrisPostBlockFilter { if(!s.getMaterial().equals(AIR)) { - setPostBlock(x, h + 1, z, s); + setPostBlock(x, h + 1, z, s, currentPostX, currentPostZ, currentData); updateHeight(x, z, h + 1); } } @@ -64,12 +65,12 @@ public class PostWallPatcher extends IrisPostBlockFilter continue; } - if(isAirOrWater(x, i, z)) + if(isAirOrWater(x, i, z, currentPostX, currentPostZ, currentData)) { continue; } - setPostBlock(x, i, z, d); + setPostBlock(x, i, z, d, currentPostX, currentPostZ, currentData); } } } diff --git a/src/main/java/com/volmit/iris/gen/post/PostWaterlogger.java b/src/main/java/com/volmit/iris/gen/post/PostWaterlogger.java index 089633ae5..c9dae5ddb 100644 --- a/src/main/java/com/volmit/iris/gen/post/PostWaterlogger.java +++ b/src/main/java/com/volmit/iris/gen/post/PostWaterlogger.java @@ -3,6 +3,7 @@ package com.volmit.iris.gen.post; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Waterlogged; +import org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.gen.PostBlockChunkGenerator; import com.volmit.iris.util.B; @@ -24,10 +25,10 @@ public class PostWaterlogger extends IrisPostBlockFilter } @Override - public void onPost(int x, int z) + public void onPost(int x, int z, int currentPostX, int currentPostZ, ChunkData currentData) { int h = highestTerrainBlock(x, z); - BlockData b = getPostBlock(x, h, z); + BlockData b = getPostBlock(x, h, z, currentPostX, currentPostZ, currentData); if(b instanceof Waterlogged) { @@ -38,24 +39,24 @@ public class PostWaterlogger extends IrisPostBlockFilter return; } - if(isWaterOrWaterlogged(x, h + 1, z) && !ww.isWaterlogged()) + if(isWaterOrWaterlogged(x, h + 1, z, currentPostX, currentPostZ, currentData) && !ww.isWaterlogged()) { ww.setWaterlogged(true); - setPostBlock(x, h, z, ww); + setPostBlock(x, h, z, ww, currentPostX, currentPostZ, currentData); } - else if(!ww.isWaterlogged() && (isWaterOrWaterlogged(x + 1, h, z) || isWaterOrWaterlogged(x - 1, h, z) || isWaterOrWaterlogged(x, h, z + 1) || isWaterOrWaterlogged(x, h, z - 1))) + else if(!ww.isWaterlogged() && (isWaterOrWaterlogged(x + 1, h, z, currentPostX, currentPostZ, currentData) || isWaterOrWaterlogged(x - 1, h, z, currentPostX, currentPostZ, currentData) || isWaterOrWaterlogged(x, h, z + 1, currentPostX, currentPostZ, currentData) || isWaterOrWaterlogged(x, h, z - 1, currentPostX, currentPostZ, currentData))) { ww.setWaterlogged(true); - setPostBlock(x, h, z, ww); + setPostBlock(x, h, z, ww, currentPostX, currentPostZ, currentData); } } 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))) + if((isWaterOrWaterlogged(x + 1, h, z, currentPostX, currentPostZ, currentData) || isWaterOrWaterlogged(x - 1, h, z, currentPostX, currentPostZ, currentData) || isWaterOrWaterlogged(x, h, z + 1, currentPostX, currentPostZ, currentData) || isWaterOrWaterlogged(x, h, z - 1, currentPostX, currentPostZ, currentData))) { - setPostBlock(x, h, z, WATER); + setPostBlock(x, h, z, WATER, currentPostX, currentPostZ, currentData); } } } diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index 6327513d4..613397220 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -22,7 +22,6 @@ import com.volmit.iris.util.MaxNumber; import com.volmit.iris.util.MinNumber; import com.volmit.iris.util.RNG; import com.volmit.iris.util.RegistryListBiome; -import com.volmit.iris.util.RegistryListDimension; import com.volmit.iris.util.RegistryListRegion; import com.volmit.iris.util.Required; @@ -145,15 +144,6 @@ public class IrisDimension extends IrisRegistrant @Desc("Compatability filters") private KList compatability = getDefaultCompatability(); - @RegistryListDimension - @DontObfuscate - @Desc("The ceiling dimension. Leave blank for normal sky.") - private String ceiling = ""; - - @DontObfuscate - @Desc("Mirrors the generator floor into the ceiling. Think nether but worse...") - private boolean mirrorCeiling = false; - @Required @DontObfuscate @Desc("The world environment") @@ -289,7 +279,6 @@ public class IrisDimension extends IrisRegistrant private transient AtomicCache sinr = new AtomicCache<>(); private transient AtomicCache cosr = new AtomicCache<>(); private transient AtomicCache rad = new AtomicCache<>(); - private transient boolean inverted = false; public KList getPostBlockProcessors(PostBlockChunkGenerator g) { diff --git a/src/main/java/com/volmit/iris/util/IPostBlockAccess.java b/src/main/java/com/volmit/iris/util/IPostBlockAccess.java index ba3c314ed..631d341ad 100644 --- a/src/main/java/com/volmit/iris/util/IPostBlockAccess.java +++ b/src/main/java/com/volmit/iris/util/IPostBlockAccess.java @@ -1,12 +1,13 @@ package com.volmit.iris.util; import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator.ChunkData; public interface IPostBlockAccess { - public BlockData getPostBlock(int x, int y, int z); + public BlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData); - public void setPostBlock(int x, int y, int z, BlockData d); + public void setPostBlock(int x, int y, int z, BlockData d, int currentPostX, int currentPostZ, ChunkData currentData); public int highestTerrainOrFluidBlock(int x, int z); diff --git a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java index efadf2ce8..5140dd6f1 100644 --- a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java +++ b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java @@ -5,6 +5,7 @@ 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 org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.gen.PostBlockChunkGenerator; import com.volmit.iris.gen.post.Post; @@ -32,18 +33,18 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess this(gen, 0); } - public abstract void onPost(int x, int z); + public abstract void onPost(int x, int z, int currentPostX, int currentPostZ, ChunkData currentData); @Override - public BlockData getPostBlock(int x, int y, int z) + public BlockData getPostBlock(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - return gen.getPostBlock(x, y, z); + return gen.getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); } @Override - public void setPostBlock(int x, int y, int z, BlockData d) + public void setPostBlock(int x, int y, int z, BlockData d, int currentPostX, int currentPostZ, ChunkData currentData) { - gen.setPostBlock(x, y, z, d); + gen.setPostBlock(x, y, z, d, currentPostX, currentPostZ, currentData); } @Override @@ -58,57 +59,57 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess return gen.highestTerrainBlock(x, z); } - public boolean isAir(int x, int y, int z) + public boolean isAir(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.AIR) || d.getMaterial().equals(Material.CAVE_AIR); } - public boolean hasGravity(int x, int y, int z) + public boolean hasGravity(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.SAND) || d.getMaterial().equals(Material.RED_SAND) || d.getMaterial().equals(Material.BLACK_CONCRETE_POWDER) || d.getMaterial().equals(Material.BLUE_CONCRETE_POWDER) || d.getMaterial().equals(Material.BROWN_CONCRETE_POWDER) || d.getMaterial().equals(Material.CYAN_CONCRETE_POWDER) || d.getMaterial().equals(Material.GRAY_CONCRETE_POWDER) || d.getMaterial().equals(Material.GREEN_CONCRETE_POWDER) || d.getMaterial().equals(Material.LIGHT_BLUE_CONCRETE_POWDER) || d.getMaterial().equals(Material.LIGHT_GRAY_CONCRETE_POWDER) || d.getMaterial().equals(Material.LIME_CONCRETE_POWDER) || d.getMaterial().equals(Material.MAGENTA_CONCRETE_POWDER) || d.getMaterial().equals(Material.ORANGE_CONCRETE_POWDER) || d.getMaterial().equals(Material.PINK_CONCRETE_POWDER) || d.getMaterial().equals(Material.PURPLE_CONCRETE_POWDER) || d.getMaterial().equals(Material.RED_CONCRETE_POWDER) || d.getMaterial().equals(Material.WHITE_CONCRETE_POWDER) || d.getMaterial().equals(Material.YELLOW_CONCRETE_POWDER); } - public boolean isSolid(int x, int y, int z) + public boolean isSolid(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().isSolid(); } - public boolean isAirOrWater(int x, int y, int z) + public boolean isAirOrWater(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.WATER) || d.getMaterial().equals(Material.AIR) || d.getMaterial().equals(Material.CAVE_AIR); } - public boolean isSlab(int x, int y, int z) + public boolean isSlab(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d instanceof Slab; } - public boolean isSnowLayer(int x, int y, int z) + public boolean isSnowLayer(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.SNOW); } - public boolean isWater(int x, int y, int z) + public boolean isWater(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.WATER); } - public boolean isWaterOrWaterlogged(int x, int y, int z) + public boolean isWaterOrWaterlogged(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d.getMaterial().equals(Material.WATER) || (d instanceof Waterlogged && ((Waterlogged) d).isWaterlogged()); } - public boolean isLiquid(int x, int y, int z) + public boolean isLiquid(int x, int y, int z, int currentPostX, int currentPostZ, ChunkData currentData) { - BlockData d = getPostBlock(x, y, z); + BlockData d = getPostBlock(x, y, z, currentPostX, currentPostZ, currentData); return d instanceof Levelled; } From 8a7bc3c17d7340496f114b316053c2cbf34943fa Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 17 Aug 2020 00:26:21 -0400 Subject: [PATCH 4/7] Fixes --- .../volmit/iris/command/CommandIrisTC.java | 55 +++++++++++++ .../volmit/iris/command/CommandIrisWorld.java | 3 + .../volmit/iris/gen/IrisChunkGenerator.java | 7 -- .../iris/gen/TerrainChunkGenerator.java | 1 - .../iris/gen/atomics/AtomicMulticache.java | 82 ++++++++----------- .../volmit/iris/gen/layer/GenLayerCave.java | 4 +- .../com/volmit/iris/util/GroupedExecutor.java | 19 +---- .../volmit/iris/util/IrisInterpolation.java | 7 ++ 8 files changed, 103 insertions(+), 75 deletions(-) create mode 100644 src/main/java/com/volmit/iris/command/CommandIrisTC.java diff --git a/src/main/java/com/volmit/iris/command/CommandIrisTC.java b/src/main/java/com/volmit/iris/command/CommandIrisTC.java new file mode 100644 index 000000000..74b54bd67 --- /dev/null +++ b/src/main/java/com/volmit/iris/command/CommandIrisTC.java @@ -0,0 +1,55 @@ +package com.volmit.iris.command; + +import org.bukkit.World; +import org.bukkit.entity.Player; + +import com.volmit.iris.Iris; +import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.util.MortarCommand; +import com.volmit.iris.util.MortarSender; + +public class CommandIrisTC extends MortarCommand +{ + public CommandIrisTC() + { + super("ctc"); + setDescription("Change generator thread count"); + requiresPermission(Iris.perm.studio); + setCategory("World"); + } + + @Override + public boolean handle(MortarSender sender, String[] args) + { + if(sender.isPlayer()) + { + Player p = sender.player(); + World world = p.getWorld(); + + if(!(world.getGenerator() instanceof IrisChunkGenerator)) + { + sender.sendMessage("You must be in an iris world."); + return true; + } + + IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator(); + int m = Math.min(Math.max(Integer.valueOf(args[0]), 2), 256); + g.changeThreadCount(m); + sender.sendMessage("Thread count changed to " + m); + return true; + } + + else + { + sender.sendMessage("Players only."); + } + + return true; + } + + @Override + protected String getArgsUsage() + { + return "[thread-count]"; + } +} diff --git a/src/main/java/com/volmit/iris/command/CommandIrisWorld.java b/src/main/java/com/volmit/iris/command/CommandIrisWorld.java index debab4821..a97898545 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisWorld.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisWorld.java @@ -22,6 +22,9 @@ public class CommandIrisWorld extends MortarCommand @Command private CommandIrisHotload hotload; + @Command + private CommandIrisTC tc; + public CommandIrisWorld() { super("world", "wrld", "w"); diff --git a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java index 9e6bc29f1..462059f35 100644 --- a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java @@ -21,7 +21,6 @@ import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.Form; import com.volmit.iris.util.Function2; -import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KMap; import com.volmit.iris.util.RNG; @@ -33,7 +32,6 @@ import lombok.EqualsAndHashCode; public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisContext { private Method initLighting; - private IrisLock lock; private IrisBiome hb = null; private IrisRegion hr = null; private KMap b = new KMap<>(); @@ -41,19 +39,16 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC public IrisChunkGenerator(String dimensionName, int threads) { super(dimensionName, threads); - lock = new IrisLock("IrisChunkGenerator"); } public IrisChunkGenerator(String dimensionName) { super(dimensionName, 16); - lock = new IrisLock("IrisChunkGenerator"); } public IrisChunkGenerator(int tc) { super("", tc); - lock = new IrisLock("IrisChunkGenerator"); } public void hotload() @@ -73,9 +68,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC @Override protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) { - lock.lock(); super.onGenerate(random, x, z, data, grid); - lock.unlock(); } public void onInit(World world, RNG rng) diff --git a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java index 1d3cecdc3..242316386 100644 --- a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java @@ -697,7 +697,6 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator return i.getMax(); } } - } catch(Throwable e) diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicMulticache.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicMulticache.java index 6fe50feb7..0d1cb8ec1 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/AtomicMulticache.java +++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicMulticache.java @@ -16,9 +16,6 @@ public class AtomicMulticache private final KMap biome; private final KMap rawBiome; private final KMap region; - private int r = 0; - private int w = 0; - private int m = 0; public AtomicMulticache() { @@ -34,9 +31,6 @@ public class AtomicMulticache { this.x.set(x); this.z.set(z); - r = 0; - w = 0; - m = 0; if(!IrisSettings.get().sharedCaching || getSize() > 42000) { @@ -46,70 +40,58 @@ public class AtomicMulticache public double getHeight(int x, int z, Supplier g) { - return height.compute(pos(x, z), (k, v) -> + Long pos = pos(x, z); + Double r = height.get(pos); + + if(r == null) { - if(v == null) - { - m++; - w++; - return g.get(); - } + r = g.get(); + height.put(pos, r); + } - r++; - - return v; - }); + return r; } public IrisRegion getRegion(int x, int z, Supplier g) { - return region.compute(pos(x, z), (k, v) -> + Long pos = pos(x, z); + IrisRegion r = region.get(pos); + + if(r == null) { - if(v == null) - { - m++; - w++; - return g.get(); - } + r = g.get(); + region.put(pos, r); + } - r++; - - return v; - }); + return r; } public BiomeResult getBiome(int x, int z, Supplier g) { - return biome.compute(pos(x, z), (k, v) -> + Long pos = pos(x, z); + BiomeResult r = biome.get(pos); + + if(r == null) { - if(v == null) - { - m++; - w++; - return g.get(); - } + r = g.get(); + biome.put(pos, r); + } - r++; - - return v; - }); + return r; } public BiomeResult getRawBiome(int x, int z, Supplier g) { - return rawBiome.compute(pos(x, z), (k, v) -> + Long pos = pos(x, z); + BiomeResult r = rawBiome.get(pos); + + if(r == null) { - if(v == null) - { - m++; - w++; - return g.get(); - } + r = g.get(); + rawBiome.put(pos, r); + } - r++; - - return v; - }); + return r; } private long pos(int x, int z) diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java index 7cf096d8e..7539dd2cc 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java @@ -178,7 +178,7 @@ public class GenLayerCave extends GenLayer public boolean canAir(Material m) { - return (m.isSolid() || (B.isDecorant(m)) || m.equals(Material.AIR) || m.equals(B.mat("CAVE_AIR"))) && !m.equals(Material.BEDROCK); + return (B.isSolid(m) || (B.isDecorant(m)) || m.equals(Material.AIR) || m.equals(B.mat("CAVE_AIR"))) && !m.equals(Material.BEDROCK); } public boolean canWater(Material m) @@ -188,7 +188,7 @@ public class GenLayerCave extends GenLayer public boolean can(Material m) { - return m.isSolid() && !m.equals(Material.BEDROCK); + return B.isSolid(m) && !m.equals(Material.BEDROCK); } @Override diff --git a/src/main/java/com/volmit/iris/util/GroupedExecutor.java b/src/main/java/com/volmit/iris/util/GroupedExecutor.java index bafa9c0f8..459575254 100644 --- a/src/main/java/com/volmit/iris/util/GroupedExecutor.java +++ b/src/main/java/com/volmit/iris/util/GroupedExecutor.java @@ -12,13 +12,11 @@ public class GroupedExecutor { private int xc; private ExecutorService service; - private IrisLock lock; private KMap mirror; public GroupedExecutor(int threadLimit, int priority, String name) { xc = 1; - lock = new IrisLock("GX"); mirror = new KMap(); if(threadLimit == 1) @@ -79,8 +77,6 @@ public class GroupedExecutor while(true) { - J.sleep(0); - if(mirror.get(g) == 0) { break; @@ -97,13 +93,8 @@ public class GroupedExecutor public void queue(String q, NastyRunnable r) { - lock.lock(); - if(!mirror.containsKey(q)) - { - mirror.put(q, 0); - } - mirror.put(q, mirror.get(q) + 1); - lock.unlock(); + mirror.compute(q, (k, v) -> k == null || v == null ? 1 : v + 1); + service.execute(() -> { try @@ -116,9 +107,7 @@ public class GroupedExecutor } - lock.lock(); - mirror.put(q, mirror.get(q) - 1); - lock.unlock(); + mirror.compute(q, (k, v) -> v - 1); }); } @@ -126,7 +115,7 @@ public class GroupedExecutor { J.a(() -> { - J.sleep(10000); + J.sleep(100); service.shutdown(); }); } diff --git a/src/main/java/com/volmit/iris/util/IrisInterpolation.java b/src/main/java/com/volmit/iris/util/IrisInterpolation.java index 2c1bb72c9..4a6d665a5 100644 --- a/src/main/java/com/volmit/iris/util/IrisInterpolation.java +++ b/src/main/java/com/volmit/iris/util/IrisInterpolation.java @@ -132,6 +132,13 @@ public class IrisInterpolation return cubic(cubic(p00, p01, p02, p03, muy), cubic(p10, p11, p12, p13, muy), cubic(p20, p21, p22, p23, muy), cubic(p30, p31, p32, p33, muy), mux); } + public static double trilerp(double v1, double v2, double v3, double v4, double v5, double v6, double v7, double v8, double x, double y, double z) + { + double s = blerp(v1, v2, v3, v4, x, y); + double t = blerp(v5, v6, v7, v8, x, y); + return lerp(s, t, z); + } + public static double getBilinearNoise(int x, int z, double rad, NoiseProvider n) { int fx = (int) Math.floor(x / rad); From bb7e277f192b63a4124fbe121d61ed9357545ce1 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 17 Aug 2020 00:54:52 -0400 Subject: [PATCH 5/7] Fix placement --- src/main/java/com/volmit/iris/object/IrisObject.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/volmit/iris/object/IrisObject.java b/src/main/java/com/volmit/iris/object/IrisObject.java index af7664c66..9220b29db 100644 --- a/src/main/java/com/volmit/iris/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/object/IrisObject.java @@ -189,14 +189,11 @@ public class IrisObject extends IrisRegistrant for(IrisObjectReplace j : config.getEdit()) { - if(j.isExact()) + for(BlockData k : j.getFind()) { - for(BlockData k : j.getFind()) + if(j.isExact() ? k.matches(data) : k.getMaterial().equals(data.getMaterial())) { - if(j.isExact() ? k.matches(data) : k.getMaterial().equals(data.getMaterial())) - { - data = j.getReplace(rng, i.getX() + x, i.getY() + y, i.getZ() + z).clone(); - } + data = j.getReplace(rng, i.getX() + x, i.getY() + y, i.getZ() + z).clone(); } } } From 6153b25bc70a948075724764e545cddab116a7cb Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 17 Aug 2020 15:52:50 -0400 Subject: [PATCH 6/7] Fix noise --- src/main/java/com/volmit/iris/noise/CNG.java | 6 ++-- .../java/com/volmit/iris/noise/FastNoise.java | 10 +++--- .../com/volmit/iris/noise/WhiteNoise.java | 11 ++++-- .../com/volmit/iris/object/NoiseStyle.java | 35 +++++++------------ 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/volmit/iris/noise/CNG.java b/src/main/java/com/volmit/iris/noise/CNG.java index 1207b1ff4..109e4b4f6 100644 --- a/src/main/java/com/volmit/iris/noise/CNG.java +++ b/src/main/java/com/volmit/iris/noise/CNG.java @@ -31,6 +31,7 @@ public class CNG private final double opacity; private NoiseInjector injector; private RNG rng; + private boolean noscale; private int oct; private double patch; private double up; @@ -124,6 +125,7 @@ public class CNG public CNG(RNG random, NoiseType t, double opacity, int octaves) { creates++; + noscale = t.equals(NoiseType.WHITE); this.oct = octaves; this.rng = random; power = 1; @@ -332,8 +334,8 @@ public class CNG public double noise(double... dim) { - double scale = this.bakedScale * this.scale; - double f = (fracture != null ? (fracture.noise(dim) - 0.5) * fscale : 0D); + double scale = noscale ? 1 : this.bakedScale * this.scale; + double f = noscale ? 0 : (fracture != null ? (fracture.noise(dim) - 0.5) * fscale : 0D); double x = dim.length > 0 ? dim[0] + f : 0D; double y = dim.length > 1 ? dim[1] - f : 0D; double z = dim.length > 2 ? dim[2] - f : 0D; diff --git a/src/main/java/com/volmit/iris/noise/FastNoise.java b/src/main/java/com/volmit/iris/noise/FastNoise.java index 0841f2e88..464ceadfc 100644 --- a/src/main/java/com/volmit/iris/noise/FastNoise.java +++ b/src/main/java/com/volmit/iris/noise/FastNoise.java @@ -353,21 +353,21 @@ public class FastNoise private static double DValCoord2D(int seed, long x, long y) { - int n = seed; + long n = seed; n ^= X_PRIME_L * x; n ^= Y_PRIME_L * y; - return ((n * n * n * 604930000L) / 21474836480000D) % 2D; + return ((n * n * n * 60493L) / (double) Long.MAX_VALUE); } private static double DValCoord3D(int seed, long x, long y, long z) { - int n = seed; + long n = seed; n ^= X_PRIME_L * x; n ^= Y_PRIME_L * y; n ^= Z_PRIME_L * z; - return ((n * n * n * 604930000L) / 21474836480000D) % 2D; + return ((n * n * n * 60493L) / (double) Long.MAX_VALUE); } private static float ValCoord3D(int seed, int x, int y, int z) @@ -628,7 +628,7 @@ public class FastNoise { long i = Double.doubleToRawLongBits(f); - return i ^ (i >> 16); + return i ^ (i >> 32); } public float GetWhiteNoise(float x, float y, float z, float w) diff --git a/src/main/java/com/volmit/iris/noise/WhiteNoise.java b/src/main/java/com/volmit/iris/noise/WhiteNoise.java index 4d6bfd17a..869419e0d 100644 --- a/src/main/java/com/volmit/iris/noise/WhiteNoise.java +++ b/src/main/java/com/volmit/iris/noise/WhiteNoise.java @@ -9,21 +9,26 @@ public class WhiteNoise implements NoiseGenerator n = new FastNoise((int) seed); } + private double f(double m) + { + return m; + } + @Override public double noise(double x) { - return (n.GetWhiteNoise(Float.intBitsToFloat((int) Double.doubleToLongBits(x / 1000d)) % 1000000F, 0) / 2D) + 0.5D; + return (n.DGetWhiteNoise(f(x), 0d) / 2D) + 0.5D; } @Override public double noise(double x, double z) { - return (n.GetWhiteNoise(Float.intBitsToFloat((int) Double.doubleToLongBits(x / 1000d)) % 1000000F, Float.intBitsToFloat((int) Double.doubleToLongBits(z / 1000d)) % 1000000F) / 2D) + 0.5D; + return (n.DGetWhiteNoise(f(x), f(z)) / 2D) + 0.5D; } @Override public double noise(double x, double y, double z) { - return (n.GetWhiteNoise(Float.intBitsToFloat((int) Double.doubleToLongBits(x / 1000d)) % 1000000F, Float.intBitsToFloat((int) Double.doubleToLongBits(y / 1000d)) % 1000000F, Float.intBitsToFloat((int) Double.doubleToLongBits(z / 1000d)) % 1000000F) / 2D) + 0.5D; + return (n.DGetWhiteNoise(f(x), f(y), f(z)) / 2D) + 0.5D; } } diff --git a/src/main/java/com/volmit/iris/object/NoiseStyle.java b/src/main/java/com/volmit/iris/object/NoiseStyle.java index 88afc63c9..3826214eb 100644 --- a/src/main/java/com/volmit/iris/object/NoiseStyle.java +++ b/src/main/java/com/volmit/iris/object/NoiseStyle.java @@ -9,19 +9,12 @@ import com.volmit.iris.util.RNG; @Desc("Styles of noise") @DontObfuscate -public enum NoiseStyle { +public enum NoiseStyle +{ @Desc("White Noise is like static. Useful for block scattering but not terrain.") @DontObfuscate STATIC(rng -> new CNG(rng, NoiseType.WHITE, 1D, 1)), - @Desc("White Noise is like static. Useful for block scattering but not terrain. 4 Times finer.") - @DontObfuscate - STATIC_FINE(rng -> new CNG(rng, NoiseType.WHITE, 1D, 1).scale(4)), - - @Desc("White Noise is like static. Useful for block scattering but not terrain. 16 Times finer.") - @DontObfuscate - STATIC_ULTRA_FINE(rng -> new CNG(rng, NoiseType.WHITE, 1D, 1).scale(16)), - @Desc("Wispy Perlin-looking simplex noise. The 'iris' style noise.") @DontObfuscate IRIS(rng -> CNG.signature(rng).scale(1)), @@ -44,9 +37,7 @@ public enum NoiseStyle { @Desc("Very Detailed smoke using simplex fractured with fractal billow simplex at high octaves.") @DontObfuscate - FRACTAL_SMOKE(rng -> new CNG(rng, 1D, 1) - .fractureWith(new CNG(rng.nextParallelRNG(1), NoiseType.FRACTAL_BILLOW_SIMPLEX, 1D, 8).scale(0.2), 1000) - .scale(0.34)), + FRACTAL_SMOKE(rng -> new CNG(rng, 1D, 1).fractureWith(new CNG(rng.nextParallelRNG(1), NoiseType.FRACTAL_BILLOW_SIMPLEX, 1D, 8).scale(0.2), 1000).scale(0.34)), @Desc("Thinner Veins.") @DontObfuscate @@ -54,19 +45,15 @@ public enum NoiseStyle { @Desc("Cells of simplex noise") @DontObfuscate - SIMPLEX_CELLS(rng -> new CNG(rng.nextParallelRNG(1), NoiseType.SIMPLEX, 1D, 1).scale(1) - .fractureWith(new CNG(rng.nextParallelRNG(8), NoiseType.CELLULAR, 1D, 1).scale(1), 200)), + SIMPLEX_CELLS(rng -> new CNG(rng.nextParallelRNG(1), NoiseType.SIMPLEX, 1D, 1).scale(1).fractureWith(new CNG(rng.nextParallelRNG(8), NoiseType.CELLULAR, 1D, 1).scale(1), 200)), @Desc("Veins of simplex noise") @DontObfuscate - SIMPLEX_VASCULAR(rng -> new CNG(rng.nextParallelRNG(1), NoiseType.SIMPLEX, 1D, 1).scale(1) - .fractureWith(new CNG(rng.nextParallelRNG(8), NoiseType.VASCULAR, 1D, 1).scale(1), 200)), + SIMPLEX_VASCULAR(rng -> new CNG(rng.nextParallelRNG(1), NoiseType.SIMPLEX, 1D, 1).scale(1).fractureWith(new CNG(rng.nextParallelRNG(8), NoiseType.VASCULAR, 1D, 1).scale(1), 200)), @Desc("Very Detailed fluid using simplex fractured with fractal billow simplex at high octaves.") @DontObfuscate - FRACTAL_WATER(rng -> new CNG(rng, 1D, 1) - .fractureWith(new CNG(rng.nextParallelRNG(1), NoiseType.FRACTAL_FBM_SIMPLEX, 1D, 9).scale(0.03), 9900) - .scale(1.14)), + FRACTAL_WATER(rng -> new CNG(rng, 1D, 1).fractureWith(new CNG(rng.nextParallelRNG(1), NoiseType.FRACTAL_FBM_SIMPLEX, 1D, 9).scale(0.03), 9900).scale(1.14)), @Desc("Perlin. Like simplex but more natural") @DontObfuscate @@ -413,17 +400,21 @@ public enum NoiseStyle { VASCULAR_IRIS_HALF(rng -> CNG.signatureHalf(rng, NoiseType.VASCULAR)), ; + private CNGFactory f; - private NoiseStyle(CNGFactory f) { + private NoiseStyle(CNGFactory f) + { this.f = f; } - public CNG create(RNG seed) { + public CNG create(RNG seed) + { return f.create(seed).bake(); } - public IrisGeneratorStyle style() { + public IrisGeneratorStyle style() + { return new IrisGeneratorStyle(this); } } From 522aec1d3a536583bb6d7958acd1092aaffc2a54 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 17 Aug 2020 20:25:01 -0400 Subject: [PATCH 7/7] Fixes --- .../volmit/iris/command/CommandIrisMap.java | 2 +- .../volmit/iris/gen/layer/GenLayerBiome.java | 108 ++++++++++++------ .../com/volmit/iris/{ => gui}/NoiseView.java | 3 +- .../com/volmit/iris/object/IrisDimension.java | 6 + 4 files changed, 80 insertions(+), 39 deletions(-) rename src/main/java/com/volmit/iris/{ => gui}/NoiseView.java (99%) diff --git a/src/main/java/com/volmit/iris/command/CommandIrisMap.java b/src/main/java/com/volmit/iris/command/CommandIrisMap.java index babcb9aff..85b527670 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisMap.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisMap.java @@ -1,8 +1,8 @@ package com.volmit.iris.command; import com.volmit.iris.Iris; -import com.volmit.iris.NoiseView; import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.gui.NoiseView; import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarSender; diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java index f18c857fa..37912ae02 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java @@ -19,7 +19,8 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) -public class GenLayerBiome extends GenLayer { +public class GenLayerBiome extends GenLayer +{ private CNG regionGenerator; private CNG bridgeGenerator; private BiomeDataProvider seaProvider; @@ -30,7 +31,8 @@ public class GenLayerBiome extends GenLayer { private BiomeDataProvider skylandProvider; private DimensionChunkGenerator iris; - public GenLayerBiome(DimensionChunkGenerator iris, RNG rng) { + public GenLayerBiome(DimensionChunkGenerator iris, RNG rng) + { super(iris, rng); this.iris = iris; seaProvider = new BiomeDataProvider(this, InferredType.SEA, rng); @@ -39,14 +41,14 @@ public class GenLayerBiome extends GenLayer { caveProvider = new BiomeDataProvider(this, InferredType.CAVE, rng); islandProvider = new BiomeDataProvider(this, InferredType.ISLAND, rng); skylandProvider = new BiomeDataProvider(this, InferredType.SKYLAND, rng); - regionGenerator = iris.getDimension().getRegionStyle().create(rng.nextParallelRNG(1188519)).bake() - .scale(1D / iris.getDimension().getRegionZoom()); - bridgeGenerator = iris.getDimension().getContinentalStyle().create(rng.nextParallelRNG(1541462)).bake() - .scale(1D / iris.getDimension().getContinentZoom()); + regionGenerator = iris.getDimension().getRegionStyle().create(rng.nextParallelRNG(1188519)).bake().scale(1D / iris.getDimension().getRegionZoom()); + bridgeGenerator = iris.getDimension().getContinentalStyle().create(rng.nextParallelRNG(1541462)).bake().scale(1D / iris.getDimension().getContinentZoom()); } - public IrisRegion getRegion(double bx, double bz) { - if (iris.getDimension().getRegions().isEmpty()) { + public IrisRegion getRegion(double bx, double bz) + { + if(iris.getDimension().getRegions().isEmpty()) + { Iris.error("NO REGIONS!"); return null; } @@ -57,60 +59,84 @@ public class GenLayerBiome extends GenLayer { return regionGenerator.fitRarity(iris.getDimension().getAllRegions(iris), x, z); } - public BiomeResult generateData(double bx, double bz, int rawX, int rawZ) { + public BiomeResult generateData(double bx, double bz, int rawX, int rawZ) + { return generateRegionData(bx, bz, rawX, rawZ, getRegion(bx, bz)); } - public BiomeResult generateData(InferredType type, double bx, double bz, int rawX, int rawZ, - IrisRegion regionData) { + public BiomeResult generateData(InferredType type, double bx, double bz, int rawX, int rawZ, IrisRegion regionData) + { return getProvider(type).generateData(iris, bx, bz, rawX, rawZ, regionData); } - public BiomeDataProvider getProvider(InferredType type) { - if (type.equals(InferredType.SEA)) { + public BiomeDataProvider getProvider(InferredType type) + { + if(type.equals(InferredType.SEA)) + { return seaProvider; } - else if (type.equals(InferredType.LAND)) { + else if(type.equals(InferredType.LAND)) + { return landProvider; } - else if (type.equals(InferredType.SHORE)) { + else if(type.equals(InferredType.SHORE)) + { return shoreProvider; } - else if (type.equals(InferredType.CAVE)) { + else if(type.equals(InferredType.CAVE)) + { return caveProvider; } - else if (type.equals(InferredType.ISLAND)) { + else if(type.equals(InferredType.ISLAND)) + { return islandProvider; } - else if (type.equals(InferredType.SKYLAND)) { + else if(type.equals(InferredType.SKYLAND)) + { return skylandProvider; } - else { + else + { Iris.error("Cannot find a BiomeDataProvider for type " + type.name()); } return null; } - public BiomeResult generateRegionData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData) { + public BiomeResult generateRegionData(double bx, double bz, int rawX, int rawZ, IrisRegion regionData) + { return generateData(getType(bx, bz, regionData), bx, bz, rawX, rawZ, regionData); } - public InferredType getType(double bx, double bz, IrisRegion regionData) { + public InferredType getType(double bx, double bz, IrisRegion regionData) + { double x = bx; double z = bz; - return bridgeGenerator.fit(0, 1, x, z) == 0 ? InferredType.LAND : InferredType.SEA; + double c = iris.getDimension().getLandChance(); + + if(c >= 1) + { + return InferredType.LAND; + } + + if(c <= 0) + { + return InferredType.SEA; + } + + return bridgeGenerator.fitDouble(0, 1, x, z) < c ? InferredType.LAND : InferredType.SEA; } - public BiomeResult generateBiomeData(double bx, double bz, IrisRegion regionData, CNG cell, KList biomes, - InferredType inferredType) { - if (biomes.isEmpty()) { + public BiomeResult generateBiomeData(double bx, double bz, IrisRegion regionData, CNG cell, KList biomes, InferredType inferredType) + { + if(biomes.isEmpty()) + { return new BiomeResult(null, 0); } @@ -122,16 +148,20 @@ public class GenLayerBiome extends GenLayer { return implode(bx, bz, regionData, cell, new BiomeResult(biome, 1)); } - public BiomeResult generateImpureData(int rawX, int rawZ, InferredType type, IrisRegion regionData, - BiomeResult pureResult) { - for (IrisRegionRidge i : regionData.getRidgeBiomes()) { - if (i.getType().equals(type) && i.isRidge(rng, rawX, rawZ)) { + public BiomeResult generateImpureData(int rawX, int rawZ, InferredType type, IrisRegion regionData, BiomeResult pureResult) + { + for(IrisRegionRidge i : regionData.getRidgeBiomes()) + { + if(i.getType().equals(type) && i.isRidge(rng, rawX, rawZ)) + { return new BiomeResult(iris.loadBiome(i.getBiome()).infer(i.getAs(), type), 0.5); } } - for (IrisRegionSpot i : regionData.getSpotBiomes()) { - if (i.getType().equals(type) && i.isSpot(rng, rawX, rawZ)) { + for(IrisRegionSpot i : regionData.getSpotBiomes()) + { + if(i.getType().equals(type) && i.isSpot(rng, rawX, rawZ)) + { return new BiomeResult(iris.loadBiome(i.getBiome()).infer(i.getAs(), type), 0.5); } } @@ -139,20 +169,23 @@ public class GenLayerBiome extends GenLayer { return pureResult; } - public BiomeResult implode(double bx, double bz, IrisRegion regionData, CNG parentCell, BiomeResult parent) { + public BiomeResult implode(double bx, double bz, IrisRegion regionData, CNG parentCell, BiomeResult parent) + { return implode(bx, bz, regionData, parentCell, parent, 1); } - public BiomeResult implode(double bx, double bz, IrisRegion regionData, CNG parentCell, BiomeResult parent, - int hits) { - if (hits > IrisSettings.get().maxBiomeChildDepth) { + public BiomeResult implode(double bx, double bz, IrisRegion regionData, CNG parentCell, BiomeResult parent, int hits) + { + if(hits > IrisSettings.get().maxBiomeChildDepth) + { return parent; } double x = bx / iris.getDimension().getBiomeZoom(); double z = bz / iris.getDimension().getBiomeZoom(); - if (!parent.getBiome().getRealChildren(iris).isEmpty()) { + if(!parent.getBiome().getRealChildren(iris).isEmpty()) + { CNG childCell = parent.getBiome().getChildrenGenerator(rng, 123, parent.getBiome().getChildShrinkFactor()); KList chx = parent.getBiome().getRealChildren(iris).copy(); // TODO Cache chx.add(parent.getBiome()); @@ -166,7 +199,8 @@ public class GenLayerBiome extends GenLayer { } @Override - public double generate(double x, double z) { + public double generate(double x, double z) + { return 0; } } diff --git a/src/main/java/com/volmit/iris/NoiseView.java b/src/main/java/com/volmit/iris/gui/NoiseView.java similarity index 99% rename from src/main/java/com/volmit/iris/NoiseView.java rename to src/main/java/com/volmit/iris/gui/NoiseView.java index 13f32d2c3..b23f5af9a 100644 --- a/src/main/java/com/volmit/iris/NoiseView.java +++ b/src/main/java/com/volmit/iris/gui/NoiseView.java @@ -1,4 +1,4 @@ -package com.volmit.iris; +package com.volmit.iris.gui; import java.awt.Color; import java.awt.Dimension; @@ -24,6 +24,7 @@ import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.JViewport; +import com.volmit.iris.Iris; import com.volmit.iris.gen.IrisChunkGenerator; import com.volmit.iris.noise.CNG; import com.volmit.iris.object.NoiseStyle; diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index 613397220..ef11eb747 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -48,6 +48,12 @@ public class IrisDimension extends IrisRegistrant @Desc("The version of this dimension. Changing this will stop users from accidentally upgrading (and breaking their worlds).") private int version = 1; + @MinNumber(0) + @MaxNumber(1) + @DontObfuscate + @Desc("The land chance. Up to 1.0 for total land or 0.0 for total sea") + private double landChance = 0.625; + @DontObfuscate @Desc("The placement style of regions") private IrisGeneratorStyle regionStyle = NoiseStyle.CELLULAR_IRIS_DOUBLE.style();