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();