From 05d3adff36d7640c8fdf0095541a33c23396da39 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 3 Nov 2020 13:36:38 -0500 Subject: [PATCH] Fixes --- pom.xml | 2 +- .../volmit/iris/v2/generator/IrisEngine.java | 8 +- .../modifier/IrisDepositModifier.java | 1 - .../volmit/iris/v2/scaffold/hunk/Hunk.java | 130 +++++++++++++++--- .../hunk/view/SynchronizedHunkView.java | 51 +++++++ 5 files changed, 168 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/volmit/iris/v2/scaffold/hunk/view/SynchronizedHunkView.java 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; + } +}