Fix continent zoom compounding

- Build independent continent generators before applying zoom.
- Share continent construction across runtime contexts.
- Cover repeated construction and shared-generator isolation.
This commit is contained in:
Brian Fopiano authored and GitHub committed 2026-10-02 07:47:31 -04:00
commit 813f3c7bcf
7 files changed
+314 -5

No files matched your search

@@ -5,6 +5,7 @@ import art.arcane.iris.generation.stream.GenerationStreams;
import art.arcane.iris.configuration.IrisSettings;
import art.arcane.iris.pack.loading.IrisData;
import art.arcane.iris.generation.image.IrisImageMapRuntime;
import art.arcane.iris.generation.terrain.ContinentGenerator;
import art.arcane.iris.generation.terrain.InferredType;
import art.arcane.iris.generation.biome.IrisBiome;
import art.arcane.iris.generation.terrain.IrisDimension;
@@ -258,9 +259,7 @@ public final class DimensionTerrainContext implements DataProvider {
inferredStreams.put(InferredType.SHORE, shoreBiomeStream);
ProceduralStream<InferredType> bridgeStream = focusBiome == null
? dimension.getContinentalStyle()
.create(rng.nextParallelRNG(234234565), dimensionData)
.bake().scale(1D / dimension.getContinentZoom()).bake().stream()
? ContinentGenerator.create(dimension, rng, dimensionData).stream()
.convert(value -> value >= dimension.getLandChance()
? InferredType.SEA
: InferredType.LAND)
@@ -52,6 +52,7 @@ import art.arcane.iris.generation.decoration.IrisDecorationPart;
import art.arcane.iris.generation.decoration.IrisDecorator;
import art.arcane.iris.generation.noise.IrisGenerator;
import art.arcane.iris.generation.noise.IrisGeneratorStyle;
import art.arcane.iris.generation.terrain.ContinentGenerator;
import art.arcane.iris.generation.terrain.IrisDimension;
import art.arcane.iris.generation.context.IrisContext;
import art.arcane.iris.generation.context.ChunkContext;
@@ -390,8 +391,7 @@ public class IrisComplex implements DataProvider {
.convertAware2D(ProceduralStream::get), "shoreBiomeStream", engine, cacheSize);
inferredStreams.put(InferredType.SHORE, shoreBiomeStream);
bridgeStream = focusedBiomes != null ? focusedBiomes.convert(IrisBiome::getInferredType) :
GenerationStreams.cache2D(engine.getDimension().getContinentalStyle().create(rng.nextParallelRNG(234234565), getData())
.bake().scale(1D / engine.getDimension().getContinentZoom()).bake().stream()
GenerationStreams.cache2D(ContinentGenerator.create(engine.getDimension(), rng, getData()).stream()
.convert((v) -> v >= engine.getDimension().getLandChance() ? InferredType.SEA : InferredType.LAND), "bridgeStream", engine, cacheSize);
ProceduralStream<IrisBiome> proceduralBaseBiomeStream = focusedBiomes != null ? focusedBiomes :
GenerationStreams.cache2D(bridgeStream.convertAware2D((t, x, z) -> inferredStreams.get(t).get(x, z))
@@ -0,0 +1,28 @@
package art.arcane.iris.generation.terrain;
import art.arcane.iris.pack.loading.IrisData;
import art.arcane.volmlib.util.math.RNG;
import art.arcane.volmlib.util.noise.CNG;
public final class ContinentGenerator {
private static final int CONTINENT_SEED_SALT = 234234565;
private ContinentGenerator() {
}
public static CNG create(IrisDimension dimension, RNG parentSeedSource, IrisData packData) {
return scaleByContinentZoom(createContinentalStyleGenerator(dimension, parentSeedSource, packData), dimension);
}
private static CNG createContinentalStyleGenerator(IrisDimension dimension, RNG parentSeedSource, IrisData packData) {
return dimension.getContinentalStyle().createNoCache(deriveContinentSeed(parentSeedSource), packData);
}
static RNG deriveContinentSeed(RNG parentSeedSource) {
return parentSeedSource.nextParallelRNG(CONTINENT_SEED_SALT);
}
private static CNG scaleByContinentZoom(CNG generator, IrisDimension dimension) {
return generator.bake().scale(1D / dimension.getContinentZoom()).bake();
}
}