From b47c7ae6aa2055a2cee1be17ebc62ebd762b4947 Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Mon, 28 Sep 2026 11:11:20 -0400 Subject: [PATCH] Skip impossible deposit variants - Scan pack once per data load for declared depositVariants - Placed ores skip the per-block cave biome lookup when none exist --- .../generation/stage/IrisDepositModifier.java | 58 ++++++++++++++++++- .../stage/IrisDepositModifierParityTest.java | 42 +++++++++++++- 2 files changed, 96 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/art/arcane/iris/generation/stage/IrisDepositModifier.java b/core/src/main/java/art/arcane/iris/generation/stage/IrisDepositModifier.java index a317b9c57..b3afa2a50 100644 --- a/core/src/main/java/art/arcane/iris/generation/stage/IrisDepositModifier.java +++ b/core/src/main/java/art/arcane/iris/generation/stage/IrisDepositModifier.java @@ -45,15 +45,20 @@ import art.arcane.volmlib.util.scheduling.PrecisionStopwatch; import art.arcane.volmlib.nativelib.terrain.NativeBlockState; import art.arcane.iris.generation.block.B; import art.arcane.iris.generation.block.VectorMap; +import art.arcane.iris.pack.loading.IrisData; +import art.arcane.iris.pack.loading.IrisRegistrant; +import art.arcane.iris.pack.loading.ResourceLoader; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; public class IrisDepositModifier extends EngineAssignedModifier { private static final int CLUMPS_PER_BATCH = 8; private static final int PREPARATION_BATCH_COUNT = 4; private final RNG rng; + private volatile DepositVariantScan variantScan; public IrisDepositModifier(Engine engine) { super(engine, "Deposit"); @@ -271,6 +276,7 @@ public class IrisDepositModifier extends EngineAssignedModifier Boolean declaresVariants(ResourceLoader loader, + Function> variants) { + String[] keys = loader == null ? null : loader.getPossibleKeys(); + if (keys == null) { + return null; + } + for (String key : keys) { + T loaded = loader.load(key); + if (loaded == null) { + continue; + } + List declared = variants.apply(loaded); + if (declared == null || !declared.isEmpty()) { + return true; + } + } + return false; + } + private NativeBlockState resolveDepositVariant(int cx, int cz, int nx, int localY, int nz, NativeBlockState ore, IrisDimension dimension, ChunkContext context, IrisDimensionCarvingResolver.State carvingState) { int worldX = (cx << 4) + nx; int worldZ = (cz << 4) + nz; @@ -548,6 +599,9 @@ public class IrisDepositModifier extends EngineAssignedModifier clumps) { } diff --git a/core/src/test/java/art/arcane/iris/generation/stage/IrisDepositModifierParityTest.java b/core/src/test/java/art/arcane/iris/generation/stage/IrisDepositModifierParityTest.java index d9a7f6fce..40fe303d1 100644 --- a/core/src/test/java/art/arcane/iris/generation/stage/IrisDepositModifierParityTest.java +++ b/core/src/test/java/art/arcane/iris/generation/stage/IrisDepositModifierParityTest.java @@ -30,12 +30,15 @@ import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.mockito.MockedStatic; +import art.arcane.iris.pack.loading.ResourceLoader; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -84,8 +87,25 @@ public class IrisDepositModifierParityTest { } } - @SuppressWarnings("unchecked") + @Test + public void variantFreePacksSkipPerBlockCaveBiomeLookupsWithIdenticalOutput() { + for (long seed : new long[]{101L, -73L, 90181L}) { + AtomicInteger scannedLookups = new AtomicInteger(); + AtomicInteger unscannedLookups = new AtomicInteger(); + long[] scanned = generateConfigured(seed, false, false, true, scannedLookups); + long[] unscanned = generateConfigured(seed, false, false, false, unscannedLookups); + assertArrayEquals("seed=" + seed, unscanned, scanned); + assertTrue(scannedLookups.get() < unscannedLookups.get()); + } + } + private long[] generateConfigured(long seed, boolean multicore) { + return generateConfigured(seed, multicore, true, false, new AtomicInteger()); + } + + @SuppressWarnings("unchecked") + private long[] generateConfigured(long seed, boolean multicore, boolean caveVariant, boolean enumerablePack, + AtomicInteger caveBiomeLookups) { Engine engine = mock(Engine.class, RETURNS_DEEP_STUBS); ChunkContext context = mock(ChunkContext.class, RETURNS_DEEP_STUBS); IrisDimension dimension = new IrisDimension(); @@ -99,7 +119,9 @@ public class IrisDepositModifierParityTest { denied.setLoadKey("denied"); IrisDepositVariant variant = new IrisDepositVariant().setMinHeight(-64).setMaxHeight(64); variant.getRemap().put("minecraft:gold_ore", "minecraft:redstone_ore"); - cave.getDepositVariants().add(variant); + if (caveVariant) { + cave.getDepositVariants().add(variant); + } dimension.getDeposits().add(generator("granite", IrisDepositShape.IRIS, 25, 70, IrisDepositHeightDistribution.CLIPPED_UNIFORM, "stone", "deepslate")); region.getDeposits().add(generator("iron_ore", IrisDepositShape.VANILLA_ELLIPSOID, 20, 110, @@ -118,7 +140,23 @@ public class IrisDepositModifierParityTest { when(engine.getMinHeight()).thenReturn(-64); when(engine.getSeedManager().getDeposit()).thenReturn(seed); when(engine.getDimension()).thenReturn(dimension); + if (enumerablePack) { + IrisData data = mock(IrisData.class); + ResourceLoader biomes = mock(ResourceLoader.class); + ResourceLoader regions = mock(ResourceLoader.class); + when(data.getBiomeLoader()).thenReturn(biomes); + when(data.getRegionLoader()).thenReturn(regions); + when(biomes.getPossibleKeys()).thenReturn(new String[]{"allowed", "denied", "surface"}); + when(biomes.load("allowed")).thenReturn(cave); + when(biomes.load("denied")).thenReturn(denied); + when(biomes.load("surface")).thenReturn(surface); + when(regions.getPossibleKeys()).thenReturn(new String[]{"region"}); + when(regions.load("region")).thenReturn(region); + when(engine.getData()).thenReturn(data); + when(engine.getDimensionStackContext()).thenReturn(null); + } when(engine.getCaveBiome(anyInt(), anyInt(), anyInt(), any())).thenAnswer(invocation -> { + caveBiomeLookups.incrementAndGet(); int x = invocation.getArgument(0); int y = invocation.getArgument(1); int z = invocation.getArgument(2);