diff --git a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java index b15d07f64..0c08a4416 100644 --- a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java @@ -110,7 +110,15 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp { while(f.getQueue().size() > 0) { - f.getQueue().pop().run(); + try + { + f.getQueue().pop().run(); + } + + catch(Throwable e) + { + + } } } } 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 57feb0aec..d28c563f7 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java @@ -162,9 +162,11 @@ public class GenLayerCave extends GenLayer Material e = data.getType(y + 3); Material f = data.getType(y - 1); - if(can(a) && canAir(c) && canAir(f) && canWater(d) && canWater(e)) + if(can(a) && canAir(c) && canAir(f) && canWater(d) && canAir(d) && canWater(e)) { data.set(y, CAVE_AIR); + data.set(y + 1, CAVE_AIR); + data.set(y + 2, CAVE_AIR); return true; } @@ -173,7 +175,7 @@ public class GenLayerCave extends GenLayer public boolean canAir(Material m) { - return (m.isSolid() || m.equals(Material.AIR) || m.equals(Material.CAVE_AIR)) && !m.equals(Material.BEDROCK); + return (m.isSolid() || (BlockDataTools.isDecorant(m)) || m.equals(Material.AIR) || m.equals(Material.CAVE_AIR)) && !m.equals(Material.BEDROCK); } public boolean canWater(Material m) diff --git a/src/main/java/com/volmit/iris/object/IrisGenerator.java b/src/main/java/com/volmit/iris/object/IrisGenerator.java index 389776a78..637ef272d 100644 --- a/src/main/java/com/volmit/iris/object/IrisGenerator.java +++ b/src/main/java/com/volmit/iris/object/IrisGenerator.java @@ -1,10 +1,13 @@ package com.volmit.iris.object; import com.volmit.iris.Iris; +import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.util.CellGenerator; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.IrisInterpolation; import com.volmit.iris.util.KList; +import com.volmit.iris.util.RNG; import lombok.Data; import lombok.EqualsAndHashCode; @@ -22,6 +25,22 @@ public class IrisGenerator extends IrisRegistrant @Desc("The opacity, essentially a multiplier on the output.") private double opacity = 1; + @DontObfuscate + @Desc("The size of the cell fractures") + private double cellFractureZoom = 1D; + + @DontObfuscate + @Desc("Cell Fracture Coordinate Shuffling") + private double cellFractureShuffle = 12D; + + @DontObfuscate + @Desc("The height of fracture cells. Set to 0 to disable") + private double cellFractureHeight = 0D; + + @DontObfuscate + @Desc("How big are the cells (X,Z) relative to the veins that touch them. Between 0 and 1. 0.1 means thick veins, small cells.") + private double cellPercentSize = 0.75D; + @DontObfuscate @Desc("The offset to shift this noise x") private double offsetX = 0; @@ -58,6 +77,8 @@ public class IrisGenerator extends IrisRegistrant @Desc("The noise gen for cliff height.") private IrisNoiseGenerator cliffHeightGenerator = new IrisNoiseGenerator(); + private transient AtomicCache cellGen = new AtomicCache<>(); + public double getMax() { return opacity; @@ -68,6 +89,11 @@ public class IrisGenerator extends IrisRegistrant return cliffHeightMax > 0; } + public CellGenerator getCellGenerator(long seed) + { + return cellGen.aquire(() -> new CellGenerator(new RNG(seed + 239466))); + } + public double getHeight(double rx, double rz, long superSeed) { if(composite.isEmpty()) @@ -93,7 +119,21 @@ public class IrisGenerator extends IrisRegistrant Iris.warn("Nan value on gen: " + getLoadKey() + ": H = " + h + " TP = " + tp + " OPACITY = " + opacity + " ZOOM = " + zoom); } - return hasCliffs() ? cliff(rx, rz, v, superSeed + 294596 + hc) : v; + v = hasCliffs() ? cliff(rx, rz, v, superSeed + 294596 + hc) : v; + v = hasCellCracks() ? cell(rx, rz, v, superSeed + 48622 + hc) : v; + + return v; + } + + public double cell(double rx, double rz, double v, double superSeed) + { + getCellGenerator(seed + 46222).setShuffle(getCellFractureShuffle()); + return getCellGenerator(seed + 46222).getDistance(rx / getCellFractureZoom(), rz / getCellFractureZoom()) > getCellPercentSize() ? (v * getCellFractureHeight()) : v; + } + + private boolean hasCellCracks() + { + return getCellFractureHeight() != 0; } public double getCliffHeight(double rx, double rz, double superSeed) diff --git a/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java b/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java index bbd4b10e8..989967cb7 100644 --- a/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java +++ b/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java @@ -18,6 +18,10 @@ public class IrisNoiseGenerator @Desc("The coordinate input zoom") private double zoom = 1; + @DontObfuscate + @Desc("Reverse the output. So that noise = -noise + opacity") + private boolean negative = false; + @DontObfuscate @Desc("The output multiplier") private double opacity = 1; @@ -115,6 +119,7 @@ public class IrisNoiseGenerator } double n = getGenerator(superSeed).fitDoubleD(0, opacity, (x / zoom) + offsetX, (z / zoom) + offsetZ); + n = negative ? (-n + opacity) : n; n = (exponent != 1 ? n < 0 ? -Math.pow(-n, exponent) : Math.pow(n, exponent) : n) + offsetY; n = parametric ? IrisInterpolation.parametric(n, 1) : n; n = bezier ? IrisInterpolation.bezier(n) : n; diff --git a/src/main/java/com/volmit/iris/util/BlockDataTools.java b/src/main/java/com/volmit/iris/util/BlockDataTools.java index 5706627a4..730044fb2 100644 --- a/src/main/java/com/volmit/iris/util/BlockDataTools.java +++ b/src/main/java/com/volmit/iris/util/BlockDataTools.java @@ -13,14 +13,14 @@ public class BlockDataTools private static final KList nulls = new KList<>(); public static BlockData getBlockData(String bd) - {try { - if(bdc.containsKey(bd)) + try { - return bdc.get(bd).clone(); - } + if(bdc.containsKey(bd)) + { + return bdc.get(bd).clone(); + } - BlockData bdx = parseBlockData(bd); if(bdx == null) @@ -96,6 +96,11 @@ public class BlockDataTools public static boolean canPlaceOnto(Material mat, Material onto) { + if(onto.equals(Material.AIR) || onto.equals(Material.CAVE_AIR)) + { + return false; + } + if(onto.equals(Material.GRASS_BLOCK) && mat.equals(Material.DEAD_BUSH)) { return false; @@ -127,4 +132,62 @@ public class BlockDataTools return true; } + + public static boolean isDecorant(Material m) + { + //@builder + return m.equals(Material.GRASS) + || m.equals(Material.TALL_GRASS) + || m.equals(Material.CORNFLOWER) + || m.equals(Material.SUNFLOWER) + || m.equals(Material.CHORUS_FLOWER) + || m.equals(Material.POPPY) + || m.equals(Material.DANDELION) + || m.equals(Material.OXEYE_DAISY) + || m.equals(Material.ORANGE_TULIP) + || m.equals(Material.PINK_TULIP) + || m.equals(Material.RED_TULIP) + || m.equals(Material.WHITE_TULIP) + || m.equals(Material.LILAC) + || m.equals(Material.DEAD_BUSH) + || m.equals(Material.SWEET_BERRY_BUSH) + || m.equals(Material.ROSE_BUSH) + || m.equals(Material.WITHER_ROSE) + || m.equals(Material.ALLIUM) + || m.equals(Material.BLUE_ORCHID) + || m.equals(Material.LILY_OF_THE_VALLEY) + || m.equals(Material.CRIMSON_FUNGUS) + || m.equals(Material.WARPED_FUNGUS) + || m.equals(Material.RED_MUSHROOM) + || m.equals(Material.BROWN_MUSHROOM) + || m.equals(Material.CRIMSON_ROOTS) + || m.equals(Material.AZURE_BLUET) + || m.equals(Material.WEEPING_VINES) + || m.equals(Material.WEEPING_VINES_PLANT) + || m.equals(Material.WARPED_ROOTS) + || m.equals(Material.NETHER_SPROUTS) + || m.equals(Material.TWISTING_VINES) + || m.equals(Material.TWISTING_VINES_PLANT) + || m.equals(Material.SUGAR_CANE) + || m.equals(Material.WHEAT) + || m.equals(Material.POTATOES) + || m.equals(Material.CARROTS) + || m.equals(Material.BEETROOTS) + || m.equals(Material.NETHER_WART) + || m.equals(Material.SEA_PICKLE) + || m.equals(Material.SEAGRASS) + || m.equals(Material.ACACIA_BUTTON) + || m.equals(Material.BIRCH_BUTTON) + || m.equals(Material.CRIMSON_BUTTON) + || m.equals(Material.DARK_OAK_BUTTON) + || m.equals(Material.JUNGLE_BUTTON) + || m.equals(Material.OAK_BUTTON) + || m.equals(Material.POLISHED_BLACKSTONE_BUTTON) + || m.equals(Material.SPRUCE_BUTTON) + || m.equals(Material.STONE_BUTTON) + || m.equals(Material.WARPED_BUTTON) + || m.equals(Material.TORCH) + || m.equals(Material.SOUL_TORCH); + //@done + } } diff --git a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java index 2a49b5306..efadf2ce8 100644 --- a/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java +++ b/src/main/java/com/volmit/iris/util/IrisPostBlockFilter.java @@ -17,7 +17,7 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess public PostBlockChunkGenerator gen; private int phase; private String key; - private KList queue; + private KList queue = new KList<>(); public IrisPostBlockFilter(PostBlockChunkGenerator gen, int phase) { @@ -67,24 +67,7 @@ public abstract class IrisPostBlockFilter implements IPostBlockAccess public boolean hasGravity(int x, int y, int z) { BlockData d = getPostBlock(x, y, z); - 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); + 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)