diff --git a/core/src/main/java/art/arcane/iris/generation/biome/IrisBiomePaletteLayer.java b/core/src/main/java/art/arcane/iris/generation/biome/IrisBiomePaletteLayer.java index f3abda3f7..e9a083b75 100644 --- a/core/src/main/java/art/arcane/iris/generation/biome/IrisBiomePaletteLayer.java +++ b/core/src/main/java/art/arcane/iris/generation/biome/IrisBiomePaletteLayer.java @@ -47,6 +47,7 @@ import lombok.Setter; import lombok.experimental.Accessors; import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.AtomicReferenceArray; @Snippet("biome-palette") @Accessors(chain = true) @@ -64,7 +65,8 @@ public class IrisBiomePaletteLayer { new LazyBoundedCache<>(LAYER_GENERATOR_CACHE_SIZE); @Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE) - private final transient AtomicReference recentLayerGenerator = new AtomicReference<>(); + private final transient AtomicReferenceArray recentLayerGenerators = + new AtomicReferenceArray<>(LAYER_GENERATOR_CACHE_SIZE); @Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE) private final transient LazyBoundedCache heightGenerators = @@ -145,7 +147,8 @@ public class IrisBiomePaletteLayer { public CNG getLayerGenerator(RNG parent, int signature, IrisData data) { Engine engine = data == null ? null : data.getEngine(); long generatorSeed = parent.getSeed() + signature + minHeight + maxHeight + getBlockData(data).size(); - CachedLayerGenerator recent = recentLayerGenerator.get(); + int slot = (int) generatorSeed & (LAYER_GENERATOR_CACHE_SIZE - 1); + CachedLayerGenerator recent = recentLayerGenerators.getAcquire(slot); if (recent != null && recent.key.matches(data, engine, generatorSeed)) { return recent.generator; } @@ -154,7 +157,7 @@ public class IrisBiomePaletteLayer { CNG generator = layerGenerators.computeIfAbsent(key, ignored -> style.create(new RNG(generatorSeed), data, engine)); if (generator != null) { - recentLayerGenerator.set(new CachedLayerGenerator(key, generator)); + recentLayerGenerators.setRelease(slot, new CachedLayerGenerator(key, generator)); } return generator; } diff --git a/core/src/main/java/art/arcane/iris/generation/chunk/ColumnExtentListeningHunk.java b/core/src/main/java/art/arcane/iris/generation/chunk/ColumnExtentListeningHunk.java index bdbf33af2..f2d32dd3b 100644 --- a/core/src/main/java/art/arcane/iris/generation/chunk/ColumnExtentListeningHunk.java +++ b/core/src/main/java/art/arcane/iris/generation/chunk/ColumnExtentListeningHunk.java @@ -18,20 +18,50 @@ package art.arcane.iris.generation.chunk; -import art.arcane.volmlib.util.function.Consumer4; import art.arcane.volmlib.util.hunk.Hunk; -import art.arcane.volmlib.util.hunk.view.ListeningHunk; -public final class ColumnExtentListeningHunk extends ListeningHunk implements ColumnExtent { +public final class ColumnExtentListeningHunk implements Hunk, ColumnExtent { private final Hunk source; + private final Listener listener; - public ColumnExtentListeningHunk(Hunk source, Consumer4 listener) { - super(source, listener); + public ColumnExtentListeningHunk(Hunk source, Listener listener) { this.source = source; + this.listener = listener; + } + + @Override + public void setRaw(int x, int y, int z, T t) { + listener.onWrite(x, y, z, t); + source.setRaw(x, y, z, t); + } + + @Override + public T getRaw(int x, int y, int z) { + return source.getRaw(x, y, z); + } + + @Override + public int getWidth() { + return source.getWidth(); + } + + @Override + public int getHeight() { + return source.getHeight(); + } + + @Override + public int getDepth() { + return source.getDepth(); } @Override public int highestStoredY(int x, int z) { return ColumnExtent.highestStoredY(source, x, z); } + + @FunctionalInterface + public interface Listener { + void onWrite(int x, int y, int z, T value); + } }