diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 7f4b848b7..a94fd7dda 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -44,7 +44,7 @@
-
+
@@ -67,6 +67,10 @@
+
+
+
+
@@ -123,10 +127,10 @@
-
+
-
+
@@ -143,22 +147,22 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
diff --git a/src/main/java/com/volmit/iris/object/IrisCarveLayer.java b/src/main/java/com/volmit/iris/object/IrisCarveLayer.java
index 83863d3bf..0f9f13ea5 100644
--- a/src/main/java/com/volmit/iris/object/IrisCarveLayer.java
+++ b/src/main/java/com/volmit/iris/object/IrisCarveLayer.java
@@ -34,6 +34,12 @@ public class IrisCarveLayer
@Desc("The max height")
private int maxHeight = 220;
+ @MinNumber(0.0)
+ @MaxNumber(1.0)
+ @DontObfuscate
+ @Desc("The full percentage means the 4D opacity of this carver will decay from 100% to 0% at the min & max vertical ranges. Setting the percent to 1.0 will make a very drastic & charp change at the edge of the vertical min & max. Where as 0.15 means only 15% of the vertical range will actually be 100% opacity.")
+ private double fullPercent = 0.5;
+
@MaxNumber(512)
@MinNumber(-128)
@DontObfuscate
@@ -55,7 +61,19 @@ public class IrisCarveLayer
return false;
}
- double opacity = Math.pow(IrisInterpolation.sinCenter(M.lerpInverse(getMinHeight(), getMaxHeight(), y)), 4);
+ double innerRange = fullPercent * (maxHeight - minHeight);
+ double opacity = 1D;
+
+ if(y <= minHeight+innerRange)
+ {
+ opacity = IrisInterpolation.bezier(M.lerpInverse(getMinHeight(), minHeight+innerRange, y));
+ }
+
+ else if(y >=maxHeight - innerRange)
+ {
+ opacity = IrisInterpolation.bezier(1D - M.lerpInverse(maxHeight-innerRange, getMaxHeight(), y));
+ }
+
return cng.aquire(() -> getStyle().create(rng.nextParallelRNG(-2340 * getMaxHeight() * getMinHeight()))).fitDouble(0D, 1D, x, y, z) * opacity > getThreshold();
}
}
diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java
index f255a4b4f..e7b41f704 100644
--- a/src/main/java/com/volmit/iris/object/IrisDimension.java
+++ b/src/main/java/com/volmit/iris/object/IrisDimension.java
@@ -1,5 +1,6 @@
package com.volmit.iris.object;
+import net.royawesome.jlibnoise.Noise;
import org.bukkit.Material;
import org.bukkit.World.Environment;
import org.bukkit.block.data.BlockData;
@@ -62,6 +63,10 @@ public class IrisDimension extends IrisRegistrant
@Desc("Improves the biome grid variation by shuffling the cell grid more depending on the seed. This makes biomes across multiple seeds look far different than before.")
private boolean aggressiveBiomeReshuffle = false;
+ @DontObfuscate
+ @Desc("Instead of a flat bottom, applies a clamp (using this noise style) to the bottom instead of a flat bottom. Useful for carving out center-dimensions in a dimension composite world.")
+ private IrisShapedGeneratorStyle undercarriage = null;
+
@DontObfuscate
@Desc("Upon joining this world, Iris will send a resource pack request to the client. If they have previously selected yes, it will auto-switch depending on which dimension they go to.")
private String resourcePack = "";
@@ -367,6 +372,22 @@ public class IrisDimension extends IrisRegistrant
return rad.aquire(() -> Math.toRadians(dimensionAngleDeg));
}
+ public boolean isCarved(int x, int y, int z, RNG rng, int terrainHeight)
+ {
+ if(isCarving() && terrainHeight > getFluidHeight() || y < terrainHeight)
+ {
+ for(IrisCarveLayer j : getCarveLayers())
+ {
+ if(j.isCarved(rng, x, y, z))
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
public double sinRotate()
{
return sinr.aquire(() -> Math.sin(getDimensionAngle()));
diff --git a/src/main/java/com/volmit/iris/object/IrisShapedGeneratorStyle.java b/src/main/java/com/volmit/iris/object/IrisShapedGeneratorStyle.java
index 6cfc1a738..c9a17af42 100644
--- a/src/main/java/com/volmit/iris/object/IrisShapedGeneratorStyle.java
+++ b/src/main/java/com/volmit/iris/object/IrisShapedGeneratorStyle.java
@@ -36,7 +36,6 @@ public class IrisShapedGeneratorStyle
@Required
@MinNumber(-256)
@MaxNumber(256)
-
@DontObfuscate
@Desc("The max block value")
private int max = 0;
diff --git a/src/main/java/com/volmit/iris/v2/TestGen.java b/src/main/java/com/volmit/iris/v2/TestGen.java
index 94176bf5a..459df0030 100644
--- a/src/main/java/com/volmit/iris/v2/TestGen.java
+++ b/src/main/java/com/volmit/iris/v2/TestGen.java
@@ -13,6 +13,6 @@ public class TestGen
public static void gen(Player p)
{
p.teleport(new Location(new WorldCreator("t/" + UUID.randomUUID().toString())
- .generator(EngineCompositeGenerator.newStudioWorld("overworld")).createWorld(), 0, 70, 0));
+ .generator(EngineCompositeGenerator.newStudioWorld("iris")).createWorld(), 0, 70, 0));
}
}
diff --git a/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java b/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
index a8cee5173..53b973d3c 100644
--- a/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
+++ b/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
@@ -8,9 +8,12 @@ import com.volmit.iris.v2.scaffold.hunk.Hunk;
import com.volmit.iris.v2.scaffold.parallel.MultiBurst;
import lombok.Getter;
import lombok.Setter;
+import net.minecraft.server.v1_16_R2.*;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
+import java.util.Iterator;
+
public class IrisEngine implements Engine
{
@Getter
@@ -43,8 +46,16 @@ public class IrisEngine implements Engine
})
);
+ generateStructureReferences();
+ generateStructures();
getFramework().getEngineParallax().insertParallax(x, z, blocks);
- System.out.println("Regions: " + getParallax().getRegionCount() + ", Chunks: " + getParallax().getChunkCount());
getParallax().cleanup();
}
+
+ private void generateStructureReferences() {
+
+ }
+
+ private void generateStructures() {
+ }
}
diff --git a/src/main/java/com/volmit/iris/v2/generator/IrisEngineCompound.java b/src/main/java/com/volmit/iris/v2/generator/IrisEngineCompound.java
index b741883a7..49d1f03d5 100644
--- a/src/main/java/com/volmit/iris/v2/generator/IrisEngineCompound.java
+++ b/src/main/java/com/volmit/iris/v2/generator/IrisEngineCompound.java
@@ -37,8 +37,11 @@ public class IrisEngineCompound implements EngineCompound {
@Getter
private final MultiBurst burster;
+ private IrisDimension root;
+
public IrisEngineCompound(World world, IrisDimension rootDimension, IrisDataManager data, int maximumThreads)
{
+ this.root = rootDimension;
Iris.info("Initializing Engine Composite for " + world.getName());
this.world = world;
engineMetadata = EngineData.load(getEngineMetadataFile());
@@ -91,6 +94,11 @@ public class IrisEngineCompound implements EngineCompound {
return new File(world.getWorldFolder(), "iris/engine-metadata.json");
}
+ @Override
+ public IrisDimension getRootDimension() {
+ return root;
+ }
+
@Override
public void generate(int x, int z, Hunk blocks, Hunk biomes)
{
diff --git a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisTerrainActuator.java b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisTerrainActuator.java
index f6a5f8023..68aaa1733 100644
--- a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisTerrainActuator.java
+++ b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisTerrainActuator.java
@@ -1,29 +1,34 @@
package com.volmit.iris.v2.generator.actuator;
+import com.volmit.iris.noise.CNG;
import com.volmit.iris.object.IrisBiome;
-import com.volmit.iris.object.IrisBiomePaletteLayer;
+import com.volmit.iris.object.IrisCarveLayer;
+import com.volmit.iris.object.IrisNoiseGenerator;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.RNG;
import com.volmit.iris.v2.scaffold.engine.Engine;
import com.volmit.iris.v2.scaffold.engine.EngineAssignedActuator;
import com.volmit.iris.v2.scaffold.hunk.Hunk;
import org.bukkit.Material;
-import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
public class IrisTerrainActuator extends EngineAssignedActuator
{
private static final BlockData AIR = Material.AIR.createBlockData();
+ private static final BlockData BEDROCK = Material.BEDROCK.createBlockData();
+ private static final BlockData CAVE_AIR = Material.CAVE_AIR.createBlockData();
private final RNG rng;
+ private final boolean hasUnder;
public IrisTerrainActuator(Engine engine) {
super(engine, "Terrain");
rng = new RNG(engine.getWorld().getSeed());
+ hasUnder = getDimension().getUndercarriage() != null && !getDimension().getUndercarriage().getGenerator().isFlat();
}
@Override
public void onActuate(int x, int z, Hunk h) {
- int i,zf, depth, realX, realZ,hf, he;
+ int i,zf, depth, realX, realZ,hf, he, b;
IrisBiome biome;
KList blocks;
@@ -33,13 +38,30 @@ public class IrisTerrainActuator extends EngineAssignedActuator
{
realX = xf + x;
realZ = zf + z;
+ b = hasUnder ? (int) Math.round(getDimension().getUndercarriage().get(rng, realX, realZ)) : 0;
he = (int) Math.round(Math.min(h.getHeight(), getComplex().getHeightStream().get(realX, realZ)));
hf = (int) Math.round(Math.max(Math.min(h.getHeight(), getDimension().getFluidHeight()), he));
biome = getComplex().getTrueBiomeStream().get(realX, realZ);
blocks = null;
- for(i = hf; i >= 0; i--)
+ if(hf < b)
{
+ continue;
+ }
+
+ for(i = hf; i >= b; i--)
+ {
+ if(i == b && getDimension().isBedrock())
+ {
+ h.set(xf, i, zf, BEDROCK);
+ continue;
+ }
+
+ if(getDimension().isCarved(realX, i, realZ, rng, he))
+ {
+ continue;
+ }
+
if(i > he && i <= hf)
{
h.set(xf, i, zf, getComplex().getFluidStream().get(realX, +realZ));
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompound.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompound.java
index a20221e4c..55242c46a 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompound.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompound.java
@@ -1,5 +1,6 @@
package com.volmit.iris.v2.scaffold.engine;
+import com.volmit.iris.object.IrisDimension;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -10,6 +11,8 @@ import com.volmit.iris.v2.scaffold.parallel.MultiBurst;
public interface EngineCompound extends Listener
{
+ public IrisDimension getRootDimension();
+
public void generate(int x, int z, Hunk blocks, Hunk biomes);
public World getWorld();