diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index a8cbd353f..e37e65579 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -16,8 +16,8 @@
@@ -60,11 +60,11 @@
+
-
@@ -143,22 +143,22 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
@@ -171,9 +171,9 @@
-
+
-
+
\ No newline at end of file
diff --git a/src/main/java/com/volmit/iris/command/CommandIris.java b/src/main/java/com/volmit/iris/command/CommandIris.java
index c9633d384..0ada1fc27 100644
--- a/src/main/java/com/volmit/iris/command/CommandIris.java
+++ b/src/main/java/com/volmit/iris/command/CommandIris.java
@@ -7,6 +7,7 @@ import com.volmit.iris.util.Command;
import com.volmit.iris.util.KList;
import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender;
+import com.volmit.iris.v2.scaffold.engine.Hotloadable;
public class CommandIris extends MortarCommand
{
@@ -70,6 +71,13 @@ public class CommandIris extends MortarCommand
return true;
}
+ if(args.length == 1 && args[0].equalsIgnoreCase("hl!") && IrisSettings.get().allowExperimentalV2Generator)
+ {
+ ((Hotloadable)sender.player().getWorld().getGenerator()).hotload();
+ sender.sendMessage("Done!");
+ return true;
+ }
+
sender.sendMessage("Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software");
printHelp(sender);
return true;
diff --git a/src/main/java/com/volmit/iris/manager/IrisDataManager.java b/src/main/java/com/volmit/iris/manager/IrisDataManager.java
index 92264b4f9..61c8ed6df 100644
--- a/src/main/java/com/volmit/iris/manager/IrisDataManager.java
+++ b/src/main/java/com/volmit/iris/manager/IrisDataManager.java
@@ -184,7 +184,7 @@ public class IrisDataManager
}
}
- public void preferFolder(String name)
+ public IrisDataManager preferFolder(String name)
{
biomeLoader.preferFolder(name);
blockLoader.preferFolder(name);
@@ -194,6 +194,7 @@ public class IrisDataManager
dimensionLoader.preferFolder(name);
generatorLoader.preferFolder(name);
structureLoader.preferFolder(name);
+ return this;
}
public void clearLists()
diff --git a/src/main/java/com/volmit/iris/v2/TestGen.java b/src/main/java/com/volmit/iris/v2/TestGen.java
index 1107a9d53..cc80c2e08 100644
--- a/src/main/java/com/volmit/iris/v2/TestGen.java
+++ b/src/main/java/com/volmit/iris/v2/TestGen.java
@@ -25,6 +25,6 @@ public class TestGen
public static void gen(Player p)
{
p.teleport(new Location(new WorldCreator("t/" + UUID.randomUUID().toString())
- .generator(EngineCompositeGenerator.newStudioWorld("flat")).createWorld(), 0, 70, 0));
+ .generator(EngineCompositeGenerator.newStudioWorld("test")).createWorld(), 0, 70, 0));
}
}
diff --git a/src/main/java/com/volmit/iris/v2/generator/IrisComplex.java b/src/main/java/com/volmit/iris/v2/generator/IrisComplex.java
index ba52acd69..4ab38fbeb 100644
--- a/src/main/java/com/volmit/iris/v2/generator/IrisComplex.java
+++ b/src/main/java/com/volmit/iris/v2/generator/IrisComplex.java
@@ -53,7 +53,6 @@ public class IrisComplex implements DataProvider
private ProceduralStream terrainCeilingDecoration;
private ProceduralStream seaSurfaceDecoration;
private ProceduralStream shoreSurfaceDecoration;
- private ProceduralStream terrainStream;
private ProceduralStream rockStream;
private ProceduralStream fluidStream;
private ProceduralStream glassStream;
@@ -102,8 +101,7 @@ public class IrisComplex implements DataProvider
overlayStream = ProceduralStream.ofDouble((x, z) -> 0D);
engine.getDimension().getOverlayNoise().forEach((i) -> overlayStream.add((x, z) -> i.get(rng, x, z)));
rngStream = ProceduralStream.of((x, z) -> new RNG(((x.longValue()) << 32) | (z.longValue() & 0xffffffffL))
- .nextParallelRNG(engine.getWorld().getSeed()), Interpolated.RNG)
- .cache2D(64);
+ .nextParallelRNG(engine.getWorld().getSeed()), Interpolated.RNG);
chunkRngStream = rngStream.blockToChunkCoords();
rockStream = engine.getDimension().getRockPalette().getLayerGenerator(rng.nextRNG(), data).stream()
.select(engine.getDimension().getRockPalette().getBlockData(data));
@@ -112,17 +110,15 @@ public class IrisComplex implements DataProvider
regionStream = engine.getDimension().getRegionStyle().create(rng.nextRNG()).stream()
.zoom(engine.getDimension().getRegionZoom())
.selectRarity(engine.getDimension().getRegions())
- .convertCached((s) -> data.getRegionLoader().load(s))
- .cache2D(cacheSize);
- caveBiomeStream = regionStream.convertCached((r)
+ .convertCached((s) -> data.getRegionLoader().load(s)).cache2D(cacheSize);
+ caveBiomeStream = regionStream.convert((r)
-> engine.getDimension().getCaveBiomeStyle().create(rng.nextRNG()).stream()
.zoom(r.getCaveBiomeZoom())
.selectRarity(r.getCaveBiomes())
.convertCached((s) -> data.getBiomeLoader().load(s)
.setInferredType(InferredType.CAVE))
- ).convertAware2D(ProceduralStream::get)
- .cache2D(cacheSize);
- landBiomeStream = regionStream.convertCached((r)
+ ).convertAware2D(ProceduralStream::get).cache2D(cacheSize);
+ landBiomeStream = regionStream.convert((r)
-> engine.getDimension().getLandBiomeStyle().create(rng.nextRNG()).stream()
.zoom(r.getLandBiomeZoom())
.selectRarity(r.getLandBiomes())
@@ -130,7 +126,7 @@ public class IrisComplex implements DataProvider
.setInferredType(InferredType.LAND))
).convertAware2D(ProceduralStream::get)
.cache2D(cacheSize);
- seaBiomeStream = regionStream.convertCached((r)
+ seaBiomeStream = regionStream.convert((r)
-> engine.getDimension().getSeaBiomeStyle().create(rng.nextRNG()).stream()
.zoom(r.getSeaBiomeZoom())
.selectRarity(r.getSeaBiomes())
@@ -138,29 +134,27 @@ public class IrisComplex implements DataProvider
.setInferredType(InferredType.SEA))
).convertAware2D(ProceduralStream::get)
.cache2D(cacheSize);
- shoreBiomeStream = regionStream.convertCached((r)
+ shoreBiomeStream = regionStream.convert((r)
-> engine.getDimension().getShoreBiomeStyle().create(rng.nextRNG()).stream()
.zoom(r.getShoreBiomeZoom())
.selectRarity(r.getShoreBiomes())
.convertCached((s) -> data.getBiomeLoader().load(s)
.setInferredType(InferredType.SHORE))
- ).convertAware2D(ProceduralStream::get)
- .cache2D(cacheSize);
+ ).convertAware2D(ProceduralStream::get).cache2D(cacheSize);
bridgeStream = engine.getDimension().getContinentalStyle().create(rng.nextRNG()).stream()
.convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND);
baseBiomeStream = bridgeStream.convertAware2D((t, x, z) -> t.equals(InferredType.SEA)
? seaBiomeStream.get(x, z) : landBiomeStream.get(x, z))
.convertAware2D(this::implode).cache2D(cacheSize);
heightStream = baseBiomeStream.convertAware2D((b, x, z) -> getHeight(b, x, z, engine.getWorld().getSeed()))
- .roundDouble()
- .cache2D(cacheSize);
- slopeStream = heightStream.slope();
+ .roundDouble().cache2D(cacheSize);
+ slopeStream = heightStream.slope().cache2D(cacheSize);
trueBiomeStream = heightStream
.convertAware2D((h, x, z) ->
fixBiomeType(h, baseBiomeStream.get(x, z),
- regionStream.get(x, z), x, z, fluidHeight));
- trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative);
- heightFluidStream = heightStream.max(fluidHeight);
+ regionStream.get(x, z), x, z, fluidHeight)).cache2D(cacheSize);
+ trueBiomeDerivativeStream = trueBiomeStream.convert(IrisBiome::getDerivative).cache2D(cacheSize);
+ heightFluidStream = heightStream.max(fluidHeight).cache2D(cacheSize);
maxHeightStream = ProceduralStream.ofDouble((x, z) -> height);
terrainSurfaceDecoration = trueBiomeStream
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.NONE));
@@ -170,42 +164,9 @@ public class IrisComplex implements DataProvider
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SHORE_LINE));
seaSurfaceDecoration = trueBiomeStream
.convertAware2D((b, xx,zz) -> decorateFor(b, xx, zz, DecorationPart.SEA_SURFACE));
- terrainStream = ProceduralStream.of(this::fillTerrain, Interpolated.BLOCK_DATA);
//@done
}
- private BlockData fillTerrain(Double x, Double y, Double z)
- {
- double height = heightStream.get(x, z);
- IrisBiome biome = trueBiomeStream.get(x, z);
- int depth = (int) (Math.round(height) - y);
- int atDepth = 0;
-
- if(y > height && y <= fluidHeight)
- {
- return fluidStream.get(x, y, z);
- }
-
- if(depth < -1)
- {
- return AIR;
- }
-
- for(IrisBiomePaletteLayer i : biome.getLayers())
- {
- int th = i.getHeightGenerator(rng, data).fit(i.getMinHeight(), i.getMaxHeight(), x, z);
-
- if(atDepth + th >= depth)
- {
- return i.get(rng, x, y, z, data);
- }
-
- atDepth += th;
- }
-
- return rockStream.get(x, y, z);
- }
-
private IrisDecorator decorateFor(IrisBiome b, double x, double z, DecorationPart part)
{
RNG rngc = chunkRngStream.get(x, z);
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 c0d31f57f..ebffbbedc 100644
--- a/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
+++ b/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
@@ -1,5 +1,6 @@
package com.volmit.iris.v2.generator;
+import com.volmit.iris.Iris;
import com.volmit.iris.v2.scaffold.engine.Engine;
import com.volmit.iris.v2.scaffold.engine.EngineFramework;
import com.volmit.iris.v2.scaffold.engine.EngineTarget;
@@ -23,6 +24,7 @@ public class IrisEngine implements Engine
public IrisEngine(EngineTarget target)
{
+ Iris.info("Initializing Engine: " + target.getWorld().getName() + "/" + target.getDimension().getLoadKey() + " (" + target.getHeight() + " height)");
this.target = target;
this.framework = new IrisEngineFramework(this);
}
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 c66939f2c..a360facb2 100644
--- a/src/main/java/com/volmit/iris/v2/generator/IrisEngineCompound.java
+++ b/src/main/java/com/volmit/iris/v2/generator/IrisEngineCompound.java
@@ -4,6 +4,7 @@ import com.volmit.iris.Iris;
import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.IrisDimension;
import com.volmit.iris.object.IrisDimensionIndex;
+import com.volmit.iris.util.J;
import com.volmit.iris.util.KList;
import com.volmit.iris.v2.scaffold.engine.Engine;
import com.volmit.iris.v2.scaffold.engine.EngineCompound;
@@ -16,6 +17,7 @@ import lombok.Getter;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
+import org.bukkit.craftbukkit.v1_16_R2.generator.CraftChunkData;
import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;
@@ -35,6 +37,7 @@ public class IrisEngineCompound implements EngineCompound {
public IrisEngineCompound(World world, IrisDimension rootDimension, IrisDataManager data, int maximumThreads)
{
+ Iris.info("Initializing Engine Composite for " + world.getName());
this.world = world;
engineMetadata = EngineData.load(getEngineMetadataFile());
saveEngineMetadata();
@@ -66,7 +69,7 @@ public class IrisEngineCompound implements EngineCompound {
{
IrisDimensionIndex index = rootDimension.getDimensionalComposite().get(i);
IrisDimension dimension = data.getDimensionLoader().load(index.getDimension());
- engines[i] = new IrisEngine(new EngineTarget(world, dimension, data.copy(), (int)Math.floor(256D * (index.getWeight() / totalWeight)), index.isInverted(), threadDist));
+ engines[i] = new IrisEngine(new EngineTarget(world, dimension, data.copy().preferFolder(rootDimension.getLoadKey()), (int)Math.floor(256D * (index.getWeight() / totalWeight)), index.isInverted(), threadDist));
}
}
}
@@ -94,18 +97,19 @@ public class IrisEngineCompound implements EngineCompound {
{
AtomicInteger index = new AtomicInteger(i);
Engine engine = engines[i];
+ int doffset = offset;
int height = engine.getTarget().getHeight();
- AtomicReference> cblock = new AtomicReference<>(blocks.croppedView(0, offset, 0, 16, offset+height, 16));
- AtomicReference> cbiome = new AtomicReference<>(biomes.croppedView(0, offset, 0, 16, offset+height, 16));
+ AtomicReference> cblock = new AtomicReference<>(Hunk.newArrayHunk(16, height, 16));
+ AtomicReference> cbiome = new AtomicReference<>(Hunk.newArrayHunk(16, height, 16));
cblock.set(engine.getTarget().isInverted() ? cblock.get().invertY() : cblock.get());
cbiome.set(engine.getTarget().isInverted() ? cbiome.get().invertY() : cbiome.get());
e.queue(() -> {
- generate(x, z, cblock.get(), cbiome.get());
+ engine.generate(x, z, cblock.get(), cbiome.get());
synchronized (insert)
{
insert[index.get()] = () -> {
- blocks.insert(cblock.get());
- biomes.insert(cbiome.get());
+ blocks.insert(0, doffset, 0, cblock.get());
+ biomes.insert(0, doffset, 0, cbiome.get());
};
}
});
diff --git a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisBiomeActuator.java
index 902bf2650..3bdb05181 100644
--- a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisBiomeActuator.java
+++ b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisBiomeActuator.java
@@ -8,11 +8,11 @@ import org.bukkit.block.Biome;
public class IrisBiomeActuator extends EngineAssignedActuator
{
public IrisBiomeActuator(Engine engine) {
- super(engine);
+ super(engine, "Biome");
}
@Override
- public void actuate(int x, int z, Hunk output) {
+ public void onActuate(int x, int z, Hunk output) {
output.compute2D(getParallelism(), (xx, yy, zz, h) -> {
int i,zf;
Biome v;
diff --git a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisDecorantActuator.java b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisDecorantActuator.java
index bef1f8059..1b7a09626 100644
--- a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisDecorantActuator.java
+++ b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisDecorantActuator.java
@@ -7,6 +7,7 @@ import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDecorator;
import com.volmit.iris.util.RNG;
import org.bukkit.Material;
+import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import java.util.function.Predicate;
@@ -17,80 +18,121 @@ public class IrisDecorantActuator extends EngineAssignedActuator
private final RNG rng;
public IrisDecorantActuator(Engine engine) {
- super(engine);
+ super(engine, "Decorant");
this.rng = new RNG(engine.getTarget().getWorld().getSeed());
}
- @Override
- public void actuate(int x, int z, Hunk output) {
- output.iterateSurfaces2D(getParallelism(), PREDICATE_SOLID, (hunkRelativeX, hunkRelativeZ, hunkOffsetX, hunkOffsetZ, top, bottom, lastBottom, h) ->
- {
- int realX = x + hunkOffsetX + hunkRelativeX;
- int realZ = z + hunkOffsetZ + hunkRelativeZ;
- RNG g = rng.nextParallelRNG(realX).nextParallelRNG(realZ); //TODO: Technically incorrect! Use chunkX & chunkZ
- IrisBiome b = getComplex().getTrueBiomeStream().get(realX, realZ);
- boolean surface = lastBottom == -1;
- int floor = top + 1;
- int ceiling = lastBottom == -1 ? floor < getDimension().getFluidHeight() ? getDimension().getFluidHeight() : output.getHeight() : lastBottom - 1;
- int height = ceiling - floor;
+ private boolean shouldDecorate()
+ {
+ return getEngine().getDimension().isDecorate();
+ }
- if(height < 2)
+ private boolean shouldRayDecorate()
+ {
+ return getEngine().getDimension().isCarving() || getEngine().getDimension().isCaves() || getEngine().getDimension().isVanillaCaves() || getEngine().getDimension().isRavines();
+ }
+
+ @Override
+ public void onActuate(int x, int z, Hunk output) {
+ if(!shouldDecorate())
+ {
+ return;
+ }
+
+ if(shouldRayDecorate())
+ {
+ output.iterateSurfaces2D(getParallelism(), PREDICATE_SOLID, (hunkRelativeX, hunkRelativeZ, hunkOffsetX, hunkOffsetZ, top, bottom, lastBottom, h) -> decorateLayer(x, z, hunkRelativeX, hunkRelativeZ, hunkOffsetX, hunkOffsetZ,top,bottom,lastBottom,h));
+ }
+
+ else
+ {
+ output.compute2D(getParallelism(), (xx, yy, zz, h) -> {
+ int he;
+ for(int i = 0; i < h.getWidth(); i++)
+ {
+ for(int j = 0; j < h.getDepth(); j++)
+ {
+ he = getComplex().getHeightFluidStream().get(x + xx+i, z + zz+j).intValue();
+ decorateLayer(x, z, i, j, xx, zz, he, 0, getEngine().getHeight(), h);
+ }
+ }
+ });
+ }
+ }
+
+ private void decorateLayer(int x, int z, int hunkRelativeX, int hunkRelativeZ, int hunkOffsetX, int hunkOffsetZ, int top, int bottom,int lastBottom, Hunk h)
+ {
+ int realX = x + hunkOffsetX + hunkRelativeX;
+ int realZ = z + hunkOffsetZ + hunkRelativeZ;
+ IrisBiome b = getComplex().getTrueBiomeStream().get(realX, realZ);
+
+ if(b.getDecorators().isEmpty())
+ {
+ return;
+ }
+
+ RNG g = rng.nextParallelRNG(realX >> 4).nextParallelRNG(realZ >> 4);
+ boolean surface = lastBottom == -1;
+ int floor = top + 1;
+ int ceiling = lastBottom == -1 ? floor < getDimension().getFluidHeight() ? getDimension().getFluidHeight() : getEngine().getHeight() : lastBottom - 1;
+ int height = ceiling - floor;
+
+ if(height < 2)
+ {
+ return;
+ }
+
+ IrisDecorator deco = getComplex().getTerrainSurfaceDecoration().get(realX, realZ);
+
+ if(deco != null)
+ {
+ if(deco.isStacking())
{
- return;
+ int stack = Math.min(g.i(deco.getStackMin(), deco.getStackMax()), height);
+
+ for(int i = 0; i < stack; i++)
+ {
+ h.set(hunkRelativeX, i + floor, hunkRelativeZ, deco.getBlockData100(b, rng, realX - i, realZ + i, getData()));
+ }
+
+ if(deco.getTopPalette().isNotEmpty())
+ {
+ h.set(hunkRelativeX, stack + floor - 1, hunkRelativeZ, deco.getBlockDataForTop(b, rng, realX - stack, realZ + stack, getData()));
+ }
}
- IrisDecorator deco = getComplex().getTerrainSurfaceDecoration().get(realX, realZ);
-
- if(deco != null)
+ else
{
- if(deco.isStacking())
+ h.set(hunkRelativeX, floor, hunkRelativeZ, deco.getBlockData100(b, rng, realX, realZ, getData()));
+ }
+ }
+
+ if(!surface)
+ {
+ IrisDecorator cdeco = getComplex().getTerrainCeilingDecoration().get(realX, realZ);
+
+ if(cdeco != null)
+ {
+ if(cdeco.isStacking())
{
- int stack = Math.min(g.i(deco.getStackMin(), deco.getStackMax()), height);
+ int stack = Math.min(g.i(cdeco.getStackMin(), cdeco.getStackMax()), height);
for(int i = 0; i < stack; i++)
{
- h.set(hunkRelativeX, i + floor, hunkRelativeZ, deco.getBlockData100(b, rng, realX - i, realZ + i, getData()));
+ h.set(hunkRelativeX, -i + ceiling, hunkRelativeZ, cdeco.getBlockData100(b, rng, realX - i, realZ + i, getData()));
}
- if(deco.getTopPalette().isNotEmpty())
+ if(cdeco.getTopPalette().isNotEmpty())
{
- h.set(hunkRelativeX, stack + floor - 1, hunkRelativeZ, deco.getBlockDataForTop(b, rng, realX - stack, realZ + stack, getData()));
+ h.set(hunkRelativeX, -stack + ceiling - 1, hunkRelativeZ, cdeco.getBlockDataForTop(b, rng, realX - stack, realZ + stack, getData()));
}
}
else
{
- h.set(hunkRelativeX, floor, hunkRelativeZ, deco.getBlockData100(b, rng, realX, realZ, getData()));
+ h.set(hunkRelativeX, ceiling, hunkRelativeZ, cdeco.getBlockData100(b, rng, realX, realZ, getData()));
}
}
-
- if(!surface)
- {
- IrisDecorator cdeco = getComplex().getTerrainCeilingDecoration().get(realX, realZ);
-
- if(cdeco != null)
- {
- if(cdeco.isStacking())
- {
- int stack = Math.min(g.i(cdeco.getStackMin(), cdeco.getStackMax()), height);
-
- for(int i = 0; i < stack; i++)
- {
- h.set(hunkRelativeX, -i + ceiling, hunkRelativeZ, cdeco.getBlockData100(b, rng, realX - i, realZ + i, getData()));
- }
-
- if(cdeco.getTopPalette().isNotEmpty())
- {
- h.set(hunkRelativeX, -stack + ceiling - 1, hunkRelativeZ, cdeco.getBlockDataForTop(b, rng, realX - stack, realZ + stack, getData()));
- }
- }
-
- else
- {
- h.set(hunkRelativeX, ceiling, hunkRelativeZ, cdeco.getBlockData100(b, rng, realX, realZ, getData()));
- }
- }
- }
- });
+ }
}
}
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 87c5045a3..5a989b03d 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,32 +1,65 @@
package com.volmit.iris.v2.generator.actuator;
+import com.volmit.iris.object.IrisBiome;
+import com.volmit.iris.object.IrisBiomePaletteLayer;
+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 final RNG rng;
+
public IrisTerrainActuator(Engine engine) {
- super(engine);
+ super(engine, "Terrain");
+ rng = new RNG(engine.getWorld().getSeed());
}
@Override
- public void actuate(int x, int z, Hunk output) {
+ public void onActuate(int x, int z, Hunk output) {
output.compute2D(getParallelism(), (xx, yy, zz, h) -> {
- int i,zf;
+ int i,zf, depth, atDepth;
double he;
+ BlockData block;
+ IrisBiome biome;
for(int xf = 0; xf < h.getWidth(); xf++)
{
for(zf = 0; zf < h.getDepth(); zf++)
{
he = Math.min(h.getHeight(), getComplex().getHeightFluidStream().get(xx+xf+x, zz+zf+z));
+ biome = getComplex().getTrueBiomeStream().get(xx+xf+x, zz+zf+z);
+ KList blocks = biome.generateLayers(xx+xf+x, zz+zf+z, rng, (int)he, (int)he, getData());
for(i = 0; i < he; i++)
{
- h.set(xx+xf, i, zz+zf, getComplex().getTerrainStream().get(xx+xf+x, i, zz+zf+z));
+ depth = ((int)he) - i;
+
+ if(i > he && i <= he)
+ {
+ h.set(xx+xf, i, zz+zf, getComplex().getFluidStream().get(xx+xf+x, zz+zf+z));
+ continue;
+ }
+
+ if(depth < -1)
+ {
+ h.set(xx+xf, i, zz+zf, AIR);
+ continue;
+ }
+
+ if(blocks.hasIndex(blocks.last() - ((int)he - depth)))
+ {
+ h.set(xx+xf, i, zz+zf, blocks.get(blocks.last() - ((int)he - depth)));
+ continue;
+ }
+
+ h.set(xx+xf, i, zz+zf, getComplex().getRockStream().get(xx+xf+x, zz+zf+z));
}
}
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineActuator.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineActuator.java
index d995cdc01..5fd26712e 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineActuator.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineActuator.java
@@ -1,5 +1,6 @@
package com.volmit.iris.v2.scaffold.engine;
+import com.volmit.iris.util.RollingSequence;
import com.volmit.iris.v2.generator.IrisComplex;
import com.volmit.iris.v2.scaffold.hunk.Hunk;
import com.volmit.iris.v2.scaffold.parallax.ParallaxAccess;
@@ -10,6 +11,10 @@ public interface EngineActuator
{
public Engine getEngine();
+ public RollingSequence getMetrics();
+
+ public String getName();
+
public default IrisDataManager getData()
{
return getEngine().getData();
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedActuator.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedActuator.java
index 3b2a1a8bb..80aac395c 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedActuator.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedActuator.java
@@ -1,11 +1,38 @@
package com.volmit.iris.v2.scaffold.engine;
+import com.volmit.iris.util.PrecisionStopwatch;
+import com.volmit.iris.util.RollingSequence;
+import com.volmit.iris.v2.scaffold.hunk.Hunk;
import lombok.AllArgsConstructor;
import lombok.Getter;
+import org.bukkit.block.data.BlockData;
-@AllArgsConstructor
public abstract class EngineAssignedActuator implements EngineActuator
{
+
@Getter
private final Engine engine;
+
+ @Getter
+ private final RollingSequence metrics;
+
+ @Getter
+ private final String name;
+
+ public EngineAssignedActuator(Engine engine, String name)
+ {
+ this.engine = engine;
+ this.name = name;
+ metrics = new RollingSequence(16);
+ }
+
+ public abstract void onActuate(int x, int z, Hunk output);
+
+ @Override
+ public void actuate(int x, int z, Hunk output) {
+ PrecisionStopwatch p = PrecisionStopwatch.start();
+ onActuate(x, z, output);
+ p.end();
+ getMetrics().put(p.getMilliseconds());
+ }
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompositeGenerator.java
index 5b0c8c86e..d60207dbf 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompositeGenerator.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineCompositeGenerator.java
@@ -22,7 +22,7 @@ import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
-public class EngineCompositeGenerator extends ChunkGenerator {
+public class EngineCompositeGenerator extends ChunkGenerator implements Hotloadable {
private EngineCompound compound;
private final AtomicBoolean initialized;
private final String dimensionHint;
@@ -39,6 +39,11 @@ public class EngineCompositeGenerator extends ChunkGenerator {
initialized = new AtomicBoolean(false);
}
+ public void hotload()
+ {
+ initialized.lazySet(false);
+ }
+
private synchronized IrisDimension getDimension(World world) {
String hint = dimensionHint;
IrisDimension dim = null;
@@ -71,14 +76,14 @@ public class EngineCompositeGenerator extends ChunkGenerator {
throw new RuntimeException("Cannot find iris dimension data for world: " + world.getName() + "! FAILED");
}
- dim = Iris.globaldata.getDimensionLoader().load(hint);
+ dim = Iris.globaldata.preferFolder(hint).getDimensionLoader().load(hint);
if (dim == null) {
throw new RuntimeException("Cannot find dimension: " + hint);
}
if (production) {
- dim = new IrisDataManager(getDataFolder(world), true).getDimensionLoader().load(dim.getLoadKey());
+ dim = new IrisDataManager(getDataFolder(world), true).preferFolder(dim.getLoadKey()).getDimensionLoader().load(dim.getLoadKey());
if (dim == null) {
throw new RuntimeException("Cannot find dimension: " + hint);
@@ -94,7 +99,9 @@ public class EngineCompositeGenerator extends ChunkGenerator {
}
IrisDataManager data = production ? new IrisDataManager(getDataFolder(world)) : Iris.globaldata.copy();
- compound = new IrisEngineCompound(world, getDimension(world), data, Iris.getThreadCount());
+ IrisDimension dim = getDimension(world);
+ data.preferFolder(dim.getLoadKey());
+ compound = new IrisEngineCompound(world, dim, data, Iris.getThreadCount());
initialized.set(true);
}
@@ -111,7 +118,7 @@ public class EngineCompositeGenerator extends ChunkGenerator {
Hunk biomes = Hunk.view(biome);
PrecisionStopwatch p = PrecisionStopwatch.start();
compound.generate(x * 16, z * 16, blocks, biomes);
- System.out.println("Generated " + x + "," + z + " in " + Form.duration(p.getMilliseconds(), 0));
+ System.out.println("Generated " + x + "," + z + " in " + Form.duration(p.getMilliseconds(), 0) + " (Terrain: " + Form.duration(compound.getEngine(0).getFramework().getTerrainActuator().getMetrics().getAverage(), 2) + ", Biome: " + Form.duration(compound.getEngine(0).getFramework().getBiomeActuator().getMetrics().getAverage(), 2) + ", Decorant: " + Form.duration(compound.getEngine(0).getFramework().getDecorantActuator().getMetrics().getAverage(), 2) + ")");
return chunk;
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/Hotloadable.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/Hotloadable.java
new file mode 100644
index 000000000..307bdce16
--- /dev/null
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/Hotloadable.java
@@ -0,0 +1,5 @@
+package com.volmit.iris.v2.scaffold.engine;
+
+public interface Hotloadable {
+ public void hotload();
+}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkBiomeHunkView.java b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkBiomeHunkView.java
index eb853b5b7..c4a4dec57 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkBiomeHunkView.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkBiomeHunkView.java
@@ -36,6 +36,11 @@ public class ChunkBiomeHunkView implements Hunk
@Override
public void setRaw(int x, int y, int z, Biome t)
{
+ if(t == null)
+ {
+ return;
+ }
+
Iris.edit.setBiome(chunk.getWorld(), x + (chunk.getX() * 16), y, z + (chunk.getZ() * 16), t);
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkDataHunkView.java b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkDataHunkView.java
index 02187c6d6..56494c42f 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkDataHunkView.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkDataHunkView.java
@@ -34,6 +34,11 @@ public class ChunkDataHunkView implements Hunk
@Override
public void set(int x1, int y1, int z1, int x2, int y2, int z2, BlockData t)
{
+ if(t == null)
+ {
+ return;
+ }
+
enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1);
chunk.setRegion(x1, y1, z1, x2, y2, z2, t);
}
@@ -41,6 +46,11 @@ public class ChunkDataHunkView implements Hunk
@Override
public void setRaw(int x, int y, int z, BlockData t)
{
+ if(t == null)
+ {
+ return;
+ }
+
chunk.setBlock(x, y, z, t);
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkHunkView.java b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkHunkView.java
index c090961d0..e564033b1 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkHunkView.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/ChunkHunkView.java
@@ -36,6 +36,11 @@ public class ChunkHunkView implements Hunk
@Override
public void setRaw(int x, int y, int z, BlockData t)
{
+ if(t == null)
+ {
+ return;
+ }
+
Iris.edit.set(chunk.getWorld(), x + (chunk.getX() * 16), y, z + (chunk.getZ() * 16), t);
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/hunk/HunkView.java b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/HunkView.java
similarity index 91%
rename from src/main/java/com/volmit/iris/v2/scaffold/hunk/HunkView.java
rename to src/main/java/com/volmit/iris/v2/scaffold/hunk/view/HunkView.java
index 5a9a78635..7aef6015d 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/hunk/HunkView.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/HunkView.java
@@ -1,4 +1,6 @@
-package com.volmit.iris.v2.scaffold.hunk;
+package com.volmit.iris.v2.scaffold.hunk.view;
+
+import com.volmit.iris.v2.scaffold.hunk.Hunk;
public class HunkView implements Hunk
{
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/InvertedHunkView.java b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/InvertedHunkView.java
index df34f46ef..ec803ba11 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/InvertedHunkView.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/InvertedHunkView.java
@@ -14,13 +14,13 @@ public class InvertedHunkView implements Hunk
@Override
public void setRaw(int x, int y, int z, T t)
{
- src.setRaw(x, getHeight() - y, z, t);
+ src.setRaw(x, (getHeight() -1) - y, z, t);
}
@Override
public T getRaw(int x, int y, int z)
{
- return src.getRaw(x, getHeight() - y, z);
+ return src.getRaw(x, y, z);
}
@Override