diff --git a/pom.xml b/pom.xml
index da005332e..42f8ad901 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
bytecode.ninja
Iris
- 1.0.32
+ 1.0.33
Iris
false
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 a6068a749..d115b4f83 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.sun.org.apache.xpath.internal.operations.Mult;
import com.volmit.iris.Iris;
import com.volmit.iris.object.*;
import com.volmit.iris.util.*;
@@ -54,15 +55,16 @@ public class IrisEngine extends BlockPopulator implements Engine
}
@Override
- public void generate(int x, int z, Hunk vblocks, Hunk biomes) {
- Hunk blocks = vblocks.listen((xx,y,zz,t) -> catchBlockUpdates(x+xx,y+getMinHeight(),z+zz, t));
+ public void generate(int x, int z, Hunk vblocks, Hunk vbiomes) {
+ Hunk biomes = vbiomes.synchronize();
+ Hunk blocks = vblocks.synchronize().listen((xx,y,zz,t) -> catchBlockUpdates(x+xx,y+getMinHeight(),z+zz, t));
getFramework().getEngineParallax().generateParallaxArea(x, z);
getFramework().getBiomeActuator().actuate(x, z, biomes);
getFramework().getTerrainActuator().actuate(x, z, blocks);
getFramework().getCaveModifier().modify(x, z, blocks);
getFramework().getRavineModifier().modify(x, z, blocks);
- getFramework().getDepositModifier().modify(x, z, blocks);
getFramework().getDecorantActuator().actuate(x, z, blocks);
+ getFramework().getDepositModifier().modify(x, z, blocks);
getFramework().getEngineParallax().insertParallax(x, z, blocks);
getFramework().recycle();
}
diff --git a/src/main/java/com/volmit/iris/v2/generator/modifier/IrisDepositModifier.java b/src/main/java/com/volmit/iris/v2/generator/modifier/IrisDepositModifier.java
index 901a89465..3e3ef5840 100644
--- a/src/main/java/com/volmit/iris/v2/generator/modifier/IrisDepositModifier.java
+++ b/src/main/java/com/volmit/iris/v2/generator/modifier/IrisDepositModifier.java
@@ -26,7 +26,6 @@ public class IrisDepositModifier extends EngineAssignedModifier {
@Override
public void onModify(int x, int z, Hunk output) {
- IrisBiome biome = getComplex().getTrueBiomeStream().get(x, z);
generateDeposits(rng, output, Math.floorDiv(x, 16), Math.floorDiv(z, 16));
}
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 78ffd72f9..e6e27b495 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
@@ -4,21 +4,35 @@ import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
import java.util.function.Predicate;
-import com.volmit.iris.v2.scaffold.hunk.io.HunkIOAdapter;
-import com.volmit.iris.v2.scaffold.hunk.storage.*;
import com.volmit.iris.v2.scaffold.hunk.view.*;
-import com.volmit.iris.util.*;
import org.bukkit.Chunk;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
import org.bukkit.generator.ChunkGenerator.ChunkData;
+import com.volmit.iris.util.ByteArrayTag;
+import com.volmit.iris.util.Consumer2;
+import com.volmit.iris.util.Consumer3;
+import com.volmit.iris.util.Consumer4;
+import com.volmit.iris.util.Consumer5;
+import com.volmit.iris.util.Consumer6;
+import com.volmit.iris.util.Consumer8;
+import com.volmit.iris.util.Function3;
+import com.volmit.iris.util.KList;
+import com.volmit.iris.v2.scaffold.hunk.io.HunkIOAdapter;
+import com.volmit.iris.v2.scaffold.hunk.storage.ArrayHunk;
+import com.volmit.iris.v2.scaffold.hunk.storage.AtomicDoubleHunk;
+import com.volmit.iris.v2.scaffold.hunk.storage.AtomicHunk;
+import com.volmit.iris.v2.scaffold.hunk.storage.AtomicIntegerHunk;
+import com.volmit.iris.v2.scaffold.hunk.storage.AtomicLongHunk;
+import com.volmit.iris.v2.scaffold.hunk.storage.MappedHunk;
+import com.volmit.iris.v2.scaffold.hunk.storage.SynchronizedArrayHunk;
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
{
@@ -73,6 +87,11 @@ public interface Hunk
return new ListeningHunk<>(this, l);
}
+ default Hunk synchronize()
+ {
+ return new SynchronizedHunkView<>(this);
+ }
+
public static Hunk newArrayHunk(int w, int h, int d)
{
return new ArrayHunk<>(w, h, d);
@@ -193,7 +212,7 @@ public interface Hunk
default int getNonNullEntries()
{
AtomicInteger count = new AtomicInteger();
- iterate((x,y,z,v)-> count.getAndAdd(1));
+ iterate((x, y, z, v) -> count.getAndAdd(1));
return count.get();
}
@@ -562,6 +581,22 @@ public interface Hunk
return iterate(getIdeal3DParallelism(), c);
}
+ default Hunk iterateSync(Consumer3 c)
+ {
+ for(int i = 0; i < getWidth(); i++)
+ {
+ for(int j = 0; j < getHeight(); j++)
+ {
+ for(int k = 0; k < getDepth(); k++)
+ {
+ c.accept(i, j, k);
+ }
+ }
+ }
+
+ return this;
+ }
+
default Hunk iterate(int parallelism, Consumer3 c)
{
compute3D(parallelism, (x, y, z, h) ->
@@ -633,7 +668,8 @@ public interface Hunk
{
rq.add(r);
}
- }), (x, y, z, hax, hbx) -> {
+ }), (x, y, z, hax, hbx) ->
+ {
a.insert(x, y, z, hax);
b.insert(x, y, z, hbx);
});
@@ -670,9 +706,7 @@ public interface Hunk
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);
+ 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;
}
@@ -695,18 +729,35 @@ public interface Hunk
}
BurstExecutor e = MultiBurst.burst.burst(parallelism);
- KList rq = new KList(parallelism);
- getSections2D(parallelism, (xx, yy, zz, h, r) -> e.queue(() ->
- {
- v.accept(xx, yy, zz, h);
- synchronized(rq)
+ if(isAtomic())
+ {
+ getSectionsAtomic2D(parallelism, (xx, yy, zz, h) -> e.queue(() ->
{
- rq.add(r);
- }
- }), this::insert);
- e.complete();
- rq.forEach(Runnable::run);
+ v.accept(xx, yy, zz, h);
+ }));
+
+ e.complete();
+ }
+
+ else
+ {
+ KList rq = new KList(parallelism);
+
+ getSections2D(parallelism, (xx, yy, zz, h, r) -> e.queue(() ->
+ {
+ v.accept(xx, yy, zz, h);
+
+ synchronized(rq)
+ {
+ rq.add(r);
+ }
+ }), this::insert);
+
+ e.complete();
+ rq.forEach(Runnable::run);
+ }
+
return this;
}
@@ -767,6 +818,39 @@ public interface Hunk
return getSections2D(sections, v, this::insert);
}
+ default Hunk getSectionsAtomic2D(int sections, Consumer4> v)
+ {
+ int dim = (int) get2DDimension(sections);
+
+ if(sections <= 1)
+ {
+ getAtomicSection(0, 0, 0, getWidth(), getHeight(), getDepth(), (hh) -> v.accept(0, 0, 0, hh));
+ return this;
+ }
+
+ int w = getWidth() / dim;
+ int wr = getWidth() - (w * dim);
+ int d = getDepth() / dim;
+ int dr = getDepth() - (d * dim);
+ int i, j;
+
+ for(i = 0; i < getWidth(); i += w)
+ {
+ int ii = i;
+
+ for(j = 0; j < getDepth(); j += d)
+ {
+ int jj = j;
+ getAtomicSection(i, 0, j, i + w + (i == 0 ? wr : 0), getHeight(), j + d + (j == 0 ? dr : 0), (h) -> v.accept(ii, 0, jj, h));
+ i = i == 0 ? i + wr : i;
+ j = j == 0 ? j + dr : j;
+ }
+ }
+ ;
+
+ return this;
+ }
+
default Hunk getSections2D(int sections, Consumer5, Runnable> v, Consumer4> inserter)
{
int dim = (int) get2DDimension(sections);
@@ -795,6 +879,7 @@ public interface Hunk
j = j == 0 ? j + dr : j;
}
}
+ ;
return this;
}
@@ -888,6 +973,13 @@ public interface Hunk
return this;
}
+ default Hunk getAtomicSection(int x, int y, int z, int x1, int y1, int z1, Consumer> v)
+ {
+ Hunk copy = croppedView(x, y, z, x1, y1, z1);
+ v.accept(copy);
+ return this;
+ }
+
default void enforceBounds(int x, int y, int z)
{
if(x < 0 || x >= getWidth() || y < 0 || y >= getHeight() || z < 0 || z >= getDepth())
diff --git a/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/SynchronizedHunkView.java b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/SynchronizedHunkView.java
new file mode 100644
index 000000000..b891f255e
--- /dev/null
+++ b/src/main/java/com/volmit/iris/v2/scaffold/hunk/view/SynchronizedHunkView.java
@@ -0,0 +1,51 @@
+package com.volmit.iris.v2.scaffold.hunk.view;
+
+import com.volmit.iris.v2.scaffold.hunk.Hunk;
+
+public class SynchronizedHunkView implements Hunk {
+ private final Hunk src;
+
+ public SynchronizedHunkView(Hunk src)
+ {
+ this.src = src;
+ }
+
+ @Override
+ public void setRaw(int x, int y, int z, T t)
+ {
+ synchronized (src)
+ {
+ src.setRaw(x,y,z,t);
+ }
+ }
+
+ @Override
+ public T getRaw(int x, int y, int z)
+ {
+ return src.getRaw(x, y, z);
+ }
+
+ @Override
+ public int getWidth()
+ {
+ return src.getWidth();
+ }
+
+ @Override
+ public int getHeight()
+ {
+ return src.getHeight();
+ }
+
+ @Override
+ public int getDepth()
+ {
+ return src.getDepth();
+ }
+
+ @Override
+ public Hunk getSource()
+ {
+ return src;
+ }
+}