diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index a94fd7dda..50541448c 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -60,10 +60,10 @@
+
-
@@ -74,7 +74,7 @@
-
+
@@ -127,10 +127,10 @@
-
+
-
+
@@ -147,22 +147,22 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
diff --git a/src/main/java/com/volmit/iris/command/CommandIris.java b/src/main/java/com/volmit/iris/command/CommandIris.java
index 0ada1fc27..5180ab276 100644
--- a/src/main/java/com/volmit/iris/command/CommandIris.java
+++ b/src/main/java/com/volmit/iris/command/CommandIris.java
@@ -65,9 +65,9 @@ public class CommandIris extends MortarCommand
@Override
public boolean handle(MortarSender sender, String[] args)
{
- if(args.length == 1 && args[0].equalsIgnoreCase("test!") && IrisSettings.get().allowExperimentalV2Generator)
+ if(args.length == 2 && args[0].equalsIgnoreCase("test!") && IrisSettings.get().allowExperimentalV2Generator)
{
- TestGen.gen(sender.player());
+ TestGen.gen(sender.player(), args[1]);
return true;
}
diff --git a/src/main/java/com/volmit/iris/object/IrisBiome.java b/src/main/java/com/volmit/iris/object/IrisBiome.java
index 4dae26e95..735d7c8bd 100644
--- a/src/main/java/com/volmit/iris/object/IrisBiome.java
+++ b/src/main/java/com/volmit/iris/object/IrisBiome.java
@@ -631,7 +631,7 @@ public class IrisBiome extends IrisRegistrant implements IRare
});
}
- public KList getAllChildren(ContextualTerrainProvider g, int limit)
+ public KList getAllChildren(DataProvider g, int limit)
{
KSet m = new KSet<>();
m.addAll(getChildren());
@@ -641,7 +641,7 @@ public class IrisBiome extends IrisRegistrant implements IRare
{
for(String i : getChildren())
{
- IrisBiome b = g != null ? g.loadBiome(i) : Iris.globaldata.getBiomeLoader().load(i);
+ IrisBiome b = g != null ? g.getData().getBiomeLoader().load(i) : Iris.globaldata.getBiomeLoader().load(i);
int l = limit;
m.addAll(b.getAllChildren(g, l));
}
diff --git a/src/main/java/com/volmit/iris/object/IrisBiomeMutation.java b/src/main/java/com/volmit/iris/object/IrisBiomeMutation.java
index 5139d6ce7..61c47252a 100644
--- a/src/main/java/com/volmit/iris/object/IrisBiomeMutation.java
+++ b/src/main/java/com/volmit/iris/object/IrisBiomeMutation.java
@@ -13,6 +13,7 @@ import com.volmit.iris.util.RegistryListBiome;
import com.volmit.iris.util.RegistryListObject;
import com.volmit.iris.util.Required;
+import com.volmit.iris.v2.scaffold.data.DataProvider;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -63,17 +64,17 @@ public class IrisBiomeMutation
private final transient AtomicCache> sideACache = new AtomicCache<>();
private final transient AtomicCache> sideBCache = new AtomicCache<>();
- public KList getRealSideA(ContextualTerrainProvider xg)
+ public KList getRealSideA(DataProvider xg)
{
return sideACache.aquire(() -> processList(xg, getSideA()));
}
- public KList getRealSideB(ContextualTerrainProvider xg)
+ public KList getRealSideB(DataProvider xg)
{
return sideBCache.aquire(() -> processList(xg, getSideB()));
}
- public KList processList(ContextualTerrainProvider xg, KList s)
+ public KList processList(DataProvider xg, KList s)
{
KSet r = new KSet<>();
@@ -83,14 +84,14 @@ public class IrisBiomeMutation
if(q.startsWith("^"))
{
- r.addAll(xg.loadRegion(q.substring(1)).getLandBiomes());
+ r.addAll(xg.getData().getRegionLoader().load(q.substring(1)).getLandBiomes());
continue;
}
else if(q.startsWith("*"))
{
String name = q.substring(1);
- r.addAll(xg.loadBiome(name).getAllChildren(xg, 7));
+ r.addAll(xg.getData().getBiomeLoader().load(name).getAllChildren(xg, 7));
}
else if(q.startsWith("!"))
@@ -101,7 +102,7 @@ public class IrisBiomeMutation
else if(q.startsWith("!*"))
{
String name = q.substring(2);
- r.removeAll(xg.loadBiome(name).getAllChildren(xg, 7));
+ r.removeAll(xg.getData().getBiomeLoader().load(name).getAllChildren(xg, 7));
}
else
diff --git a/src/main/java/com/volmit/iris/object/IrisCarveLayer.java b/src/main/java/com/volmit/iris/object/IrisCarveLayer.java
index 3879d912a..161916148 100644
--- a/src/main/java/com/volmit/iris/object/IrisCarveLayer.java
+++ b/src/main/java/com/volmit/iris/object/IrisCarveLayer.java
@@ -84,7 +84,7 @@ public class IrisCarveLayer
{
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/IrisTextPlacement.java b/src/main/java/com/volmit/iris/object/IrisTextPlacement.java
index c17050546..4162b5eba 100644
--- a/src/main/java/com/volmit/iris/object/IrisTextPlacement.java
+++ b/src/main/java/com/volmit/iris/object/IrisTextPlacement.java
@@ -11,6 +11,7 @@ import com.volmit.iris.util.MinNumber;
import com.volmit.iris.util.RNG;
import com.volmit.iris.util.Required;
+import com.volmit.iris.v2.scaffold.data.DataProvider;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
diff --git a/src/main/java/com/volmit/iris/v2/TestGen.java b/src/main/java/com/volmit/iris/v2/TestGen.java
index 459df0030..facb6e1aa 100644
--- a/src/main/java/com/volmit/iris/v2/TestGen.java
+++ b/src/main/java/com/volmit/iris/v2/TestGen.java
@@ -10,9 +10,9 @@ import com.volmit.iris.v2.scaffold.engine.EngineCompositeGenerator;
public class TestGen
{
- public static void gen(Player p)
+ public static void gen(Player p, String arg)
{
p.teleport(new Location(new WorldCreator("t/" + UUID.randomUUID().toString())
- .generator(EngineCompositeGenerator.newStudioWorld("iris")).createWorld(), 0, 70, 0));
+ .generator(EngineCompositeGenerator.newStudioWorld(arg)).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 53b973d3c..abf9a0779 100644
--- a/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
+++ b/src/main/java/com/volmit/iris/v2/generator/IrisEngine.java
@@ -46,16 +46,7 @@ public class IrisEngine implements Engine
})
);
- generateStructureReferences();
- generateStructures();
getFramework().getEngineParallax().insertParallax(x, z, blocks);
getParallax().cleanup();
}
-
- private void generateStructureReferences() {
-
- }
-
- private void generateStructures() {
- }
}
diff --git a/src/main/java/com/volmit/iris/v2/generator/actuator/IrisCaveModifier.java b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisCaveModifier.java
new file mode 100644
index 000000000..15c6c13b0
--- /dev/null
+++ b/src/main/java/com/volmit/iris/v2/generator/actuator/IrisCaveModifier.java
@@ -0,0 +1,213 @@
+package com.volmit.iris.v2.generator.actuator;
+
+import com.volmit.iris.gen.atomics.AtomicSliver;
+import com.volmit.iris.noise.FastNoiseDouble;
+import com.volmit.iris.object.IrisCaveLayer;
+import com.volmit.iris.util.B;
+import com.volmit.iris.util.CaveResult;
+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.EngineAssignedModifier;
+import com.volmit.iris.v2.scaffold.hunk.Hunk;
+import org.bukkit.Material;
+import org.bukkit.block.data.BlockData;
+
+import java.util.function.Function;
+
+public class IrisCaveModifier extends EngineAssignedModifier
+{
+ public static final BlockData CAVE_AIR = B.getBlockData("CAVE_AIR");
+ public static final BlockData AIR = B.getBlockData("AIR");
+ private static final KList EMPTY = new KList<>();
+ private final FastNoiseDouble gg;
+ private final RNG rng;
+
+ public IrisCaveModifier(Engine engine) {
+ super(engine, "Cave");
+ rng = new RNG(engine.getWorld().getSeed() + 28934555);
+ gg = new FastNoiseDouble(324895 * rng.nextParallelRNG(49678).imax());
+ }
+
+ @Override
+ public void onModify(int x, int z, Hunk output) {
+
+ }
+
+ public KList genCaves(double wxx, double wzz, int x, int z, Hunk data)
+ {
+ if(!getDimension().isCaves())
+ {
+ return EMPTY;
+ }
+
+ KList result = new KList<>();
+ gg.setNoiseType(FastNoiseDouble.NoiseType.Cellular);
+ gg.setCellularReturnType(FastNoiseDouble.CellularReturnType.Distance2Sub);
+ gg.setCellularDistanceFunction(FastNoiseDouble.CellularDistanceFunction.Natural);
+
+ for(int i = 0; i < getDimension().getCaveLayers().size(); i++)
+ {
+ IrisCaveLayer layer = getDimension().getCaveLayers().get(i);
+ generateCave(result, wxx, wzz, x, z, data, layer, i);
+ }
+
+ return result;
+ }
+
+ public void generateCave(KList result, double wxx, double wzz, int x, int z, Hunk data, IrisCaveLayer layer, int seed)
+ {
+ double scale = layer.getCaveZoom();
+ Function fluid = (height) ->
+ {
+ if(!layer.getFluid().hasFluid(getData()))
+ {
+ return CAVE_AIR;
+ }
+
+ if(layer.getFluid().isInverseHeight() && height >= layer.getFluid().getFluidHeight())
+ {
+ return layer.getFluid().getFluid(getData());
+ }
+
+ else if(!layer.getFluid().isInverseHeight() && height <= layer.getFluid().getFluidHeight())
+ {
+ return layer.getFluid().getFluid(getData());
+ }
+
+ return CAVE_AIR;
+ };
+
+ int surface = (int) Math.round(getComplex().getHeightStream().get(wxx, wzz));
+ double wx = wxx + layer.getHorizontalSlope().get(rng, wxx, wzz);
+ double wz = wzz + layer.getHorizontalSlope().get(rng, -wzz, -wxx);
+ double baseWidth = (14 * scale);
+ double distanceCheck = 0.0132 * baseWidth;
+ double distanceTake = 0.0022 * baseWidth;
+ double caveHeightNoise = layer.getVerticalSlope().get(rng, wxx, wzz);
+
+ if(caveHeightNoise > 259 || caveHeightNoise < -1)
+ {
+ return;
+ }
+
+ int ceiling = -256;
+ int floor = 512;
+
+ for(double tunnelHeight = 1; tunnelHeight <= baseWidth; tunnelHeight++)
+ {
+ double distance = (gg.GetCellular(((wx + (10000 * seed)) / layer.getCaveZoom()), ((wz - (10000 * seed)) / layer.getCaveZoom())) + 1D) / 2D;
+ if(distance < distanceCheck - (tunnelHeight * distanceTake))
+ {
+ int caveHeight = (int) Math.round(caveHeightNoise);
+ int pu = (int) (caveHeight + tunnelHeight);
+ int pd = (int) (caveHeight - tunnelHeight);
+
+ if(pd > surface + 1)
+ {
+ continue;
+ }
+
+ if(!layer.isCanBreakSurface() && pu > surface - 3)
+ {
+ continue;
+ }
+
+ if((pu > 255 && pd > 255) || (pu < 0 && pd < 0))
+ {
+ continue;
+ }
+
+ if(data == null)
+ {
+ ceiling = Math.max(pu, ceiling);
+ floor = Math.min(pu, floor);
+ ceiling = Math.max(pd, ceiling);
+ floor = Math.min(pd, floor);
+
+ if(tunnelHeight == 1)
+ {
+ ceiling = Math.max(caveHeight, ceiling);
+ floor = Math.min(caveHeight, floor);
+ }
+ }
+
+ else
+ {
+ if(dig(x, pu, z, data, fluid))
+ {
+ ceiling = Math.max(pu, ceiling);
+ floor = Math.min(pu, floor);
+ }
+
+ if(dig(x, pd, z, data, fluid))
+ {
+ ceiling = Math.max(pd, ceiling);
+ floor = Math.min(pd, floor);
+ }
+
+ if(tunnelHeight == 1)
+ {
+ if(dig(x, caveHeight, z, data, fluid))
+ {
+ ceiling = Math.max(caveHeight, ceiling);
+ floor = Math.min(caveHeight, floor);
+ }
+ }
+ }
+ }
+ }
+
+ if(floor >= 0 && ceiling <= 255)
+ {
+ result.add(new CaveResult(floor, ceiling));
+ }
+ }
+
+ private Material mat(int x, int y, int z, Hunk data)
+ {
+ BlockData d = data.get(x,y,z);
+
+ if(d != null)
+ {
+ return d.getMaterial();
+ }
+
+ return Material.CAVE_AIR;
+ }
+
+ public boolean dig(int x, int y, int z, Hunk data, Function caveFluid)
+ {
+ Material a = mat(x,y,z, data);
+ Material c = mat(x, y + 1, z, data);
+ Material d = mat(x, y + 2, z, data);
+ Material e = mat(x, y + 3, z, data);
+ Material f = mat(x, y - 1, z, data);
+ BlockData b = caveFluid.apply(y);
+ BlockData b2 = caveFluid.apply(y + 1);
+
+ if(can(a) && canAir(c, b) && canAir(f, b) && canWater(d) && canWater(e))
+ {
+ data.set(x, y, z, b);
+ data.set(x, y + 1, z, b2);
+ return true;
+ }
+
+ return false;
+ }
+
+ public boolean canAir(Material m, BlockData caveFluid)
+ {
+ return (B.isSolid(m) || (B.isDecorant(m.createBlockData())) || m.equals(Material.AIR) || m.equals(caveFluid.getMaterial()) || m.equals(B.mat("CAVE_AIR").getMaterial())) && !m.equals(Material.BEDROCK);
+ }
+
+ public boolean canWater(Material m)
+ {
+ return !m.equals(Material.WATER);
+ }
+
+ public boolean can(Material m)
+ {
+ return B.isSolid(m) && !m.equals(Material.BEDROCK);
+ }
+}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedModifier.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedModifier.java
index cd97bf52c..e12233fde 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedModifier.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineAssignedModifier.java
@@ -9,10 +9,10 @@ public abstract class EngineAssignedModifier extends EngineAssignedComponent
super(engine, name);
}
- public abstract void onModify(Hunk output);
+ public abstract void onModify(int x, int z, Hunk output);
@Override
- public void modify(Hunk output) {
- onModify(output);
+ public void modify(int x, int z, Hunk output) {
+ onModify(x, z, output);
}
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineModifier.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineModifier.java
index b3f93344d..4e7265ef7 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineModifier.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineModifier.java
@@ -3,5 +3,5 @@ package com.volmit.iris.v2.scaffold.engine;
import com.volmit.iris.v2.scaffold.hunk.Hunk;
public interface EngineModifier extends EngineComponent {
- public void modify(Hunk t);
+ public void modify(int x, int z, Hunk t);
}
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineParallax.java b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineParallax.java
index a4933bbc6..8d5effb48 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineParallax.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/engine/EngineParallax.java
@@ -4,6 +4,7 @@ import java.lang.reflect.Parameter;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import com.volmit.iris.object.*;
import com.volmit.iris.util.*;
import com.volmit.iris.v2.scaffold.parallax.ParallaxChunkMeta;
import org.bukkit.block.data.BlockData;
@@ -11,12 +12,6 @@ import org.bukkit.util.BlockVector;
import com.volmit.iris.Iris;
import com.volmit.iris.manager.IrisDataManager;
-import com.volmit.iris.object.IrisBiome;
-import com.volmit.iris.object.IrisDepositGenerator;
-import com.volmit.iris.object.IrisObject;
-import com.volmit.iris.object.IrisObjectPlacement;
-import com.volmit.iris.object.IrisRegion;
-import com.volmit.iris.object.IrisTextPlacement;
import com.volmit.iris.v2.generator.IrisComplex;
import com.volmit.iris.v2.scaffold.cache.Cache;
import com.volmit.iris.v2.scaffold.data.DataProvider;
@@ -129,12 +124,13 @@ public interface EngineParallax extends DataProvider, IObjectPlacer
getParallaxAccess().setParallaxGenerated(x>>4, z>>4);
RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().getSeed());
- generateParallaxSurface(rng, x, z);
+ IrisRegion region = getComplex().getRegionStream().get(x+8, z+8);
+ IrisBiome biome = getComplex().getTrueBiomeStream().get(x+8, z+8);
+ generateParallaxSurface(rng, x, z, biome);
+ generateParallaxMutations(rng, x, z);
}
- default void generateParallaxSurface(RNG rng, int x, int z) {
- IrisBiome biome = getComplex().getTrueBiomeStream().get(x + 8, z + 8);
-
+ default void generateParallaxSurface(RNG rng, int x, int z, IrisBiome biome) {
for (IrisObjectPlacement i : biome.getSurfaceObjects())
{
if(rng.chance(i.getChance()))
@@ -144,6 +140,37 @@ public interface EngineParallax extends DataProvider, IObjectPlacer
}
}
+ default void generateParallaxMutations(RNG rng, int x, int z) {
+ if(getEngine().getDimension().getMutations().isEmpty())
+ {
+ return;
+ }
+
+ searching: for(IrisBiomeMutation k : getEngine().getDimension().getMutations())
+ {
+ for(int l = 0; l < k.getChecks(); l++)
+ {
+ IrisBiome sa = getComplex().getTrueBiomeStream().get(((x * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()), ((z * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()));
+ IrisBiome sb = getComplex().getTrueBiomeStream().get(((x * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()), ((z * 16) + rng.nextInt(16)) + rng.i(-k.getRadius(), k.getRadius()));
+
+ if(sa.getLoadKey().equals(sb.getLoadKey()))
+ {
+ continue;
+ }
+
+ if(k.getRealSideA(this).contains(sa.getLoadKey()) && k.getRealSideB(this).contains(sb.getLoadKey()))
+ {
+ for(IrisObjectPlacement m : k.getObjects())
+ {
+ place(rng.nextParallelRNG((34 * ((x * 30) + (z * 30)) * x * z) + x - z + 1569962), x, z, m);
+ }
+
+ continue searching;
+ }
+ }
+ }
+ }
+
default void place(RNG rng, int x, int z, IrisObjectPlacement objectPlacement)
{
place(rng, x,-1, z, objectPlacement);
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/hunk/Hunk.java b/src/main/java/com/volmit/iris/v2/scaffold/hunk/Hunk.java
index 83000239e..637282180 100644
--- a/src/main/java/com/volmit/iris/v2/scaffold/hunk/Hunk.java
+++ b/src/main/java/com/volmit/iris/v2/scaffold/hunk/Hunk.java
@@ -18,6 +18,7 @@ import org.bukkit.generator.ChunkGenerator.ChunkData;
import com.volmit.iris.v2.scaffold.parallel.BurstExecutor;
import com.volmit.iris.v2.scaffold.parallel.MultiBurst;
+import org.checkerframework.checker.units.qual.A;
public interface Hunk
{
@@ -604,6 +605,82 @@ public interface Hunk
return compute2D(getIdeal2DParallelism(), v);
}
+ public static void compute2D(int parallelism, Hunk a, Hunk b, Consumer5, Hunk> v)
+ {
+ if(a.getWidth() != b.getWidth() || a.getHeight() != b.getHeight() || a.getDepth() != b.getDepth())
+ {
+ throw new RuntimeException("Hunk sizes must match!");
+ }
+
+ if(a.get2DDimension(parallelism) == 1)
+ {
+ v.accept(0, 0, 0, a, b);
+ return;
+ }
+
+ BurstExecutor e = MultiBurst.burst.burst(parallelism);
+ KList rq = new KList(parallelism);
+ getDualSections2D(parallelism, a, b, (xx, yy, zz, ha, hr, r) -> e.queue(() ->
+ {
+ v.accept(xx, yy, zz, ha, hr);
+
+ synchronized(rq)
+ {
+ rq.add(r);
+ }
+ }), (x, y, z, hax, hbx) -> {
+ a.insert(x, y, z, hax);
+ b.insert(x, y, z, hbx);
+ });
+ e.complete();
+ rq.forEach(Runnable::run);
+ return;
+ }
+
+ public static void getDualSections2D(int sections, Hunk a, Hunk b, Consumer6, Hunk, Runnable> v, Consumer5, Hunk> inserterAB)
+ {
+ if(a.getWidth() != b.getWidth() || a.getHeight() != b.getHeight() || a.getDepth() != b.getDepth())
+ {
+ throw new RuntimeException("Hunk sizes must match!");
+ }
+
+ int dim = a.get2DDimension(sections);
+
+ if(sections <= 1)
+ {
+ getDualSection(0, 0, 0, a.getWidth(), a.getHeight(), a.getDepth(), a, b, (ha, hr, r) -> v.accept(0, 0, 0, ha, hr, r), inserterAB);
+ return;
+ }
+
+ int w = a.getWidth() / dim;
+ int wr = a.getWidth() - (w * dim);
+ int d = a.getDepth() / dim;
+ int dr = a.getDepth() - (d * dim);
+ int i, j;
+
+ for(i = 0; i < a.getWidth(); i += w)
+ {
+ int ii = i;
+
+ for(j = 0; j < a.getDepth(); j += d)
+ {
+ int jj = j;
+ getDualSection(i, 0, j, i + w + (i == 0 ? wr : 0), a.getHeight(),
+ j + d + (j == 0 ? dr : 0), a, b,
+ (ha, hr, r) -> v.accept(ii, 0, jj, ha, hr, r), inserterAB);
+ i = i == 0 ? i + wr : i;
+ j = j == 0 ? j + dr : j;
+ }
+ }
+ }
+
+ static void getDualSection(int x, int y, int z, int x1, int y1, int z1, Hunk a, Hunk b, Consumer3, Hunk, Runnable> v, Consumer5, Hunk> inserter)
+ {
+ Hunk copya = a.crop(x, y, z, x1, y1, z1);
+ Hunk copyb = b.crop(x, y, z, x1, y1, z1);
+ v.accept(copya, copyb, () -> inserter.accept(x, y, z, copya, copyb));
+ }
+
default Hunk compute2D(int parallelism, Consumer4> v)
{
if(get2DDimension(parallelism) == 1)