This commit is contained in:
Brian Neumann-Fopiano
2026-07-04 10:35:34 -04:00
parent 927c48f8c7
commit d1cc83a40b
9 changed files with 259 additions and 44 deletions
@@ -154,11 +154,21 @@ public class IrisSettings {
public int maxResidentTectonicPlates = 96;
public int mantleBackpressureWaitMs = 25;
public int mantleBackpressureTimeoutMs = 60_000;
public int moddedPregenInFlight = 0;
public int getChunkLoadTimeoutSeconds() {
return Math.max(5, Math.min(chunkLoadTimeoutSeconds, 120));
}
public int getModdedPregenInFlight() {
if (moddedPregenInFlight > 0) {
return Math.min(512, moddedPregenInFlight);
}
int cpu = Math.max(1, Runtime.getRuntime().availableProcessors());
return Math.max(16, Math.min(48, cpu * 2));
}
public int getMaxResidentTectonicPlates() {
return Math.max(16, maxResidentTectonicPlates);
}
@@ -23,7 +23,7 @@ import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.data.cache.Cache;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.object.*;
import art.arcane.iris.platform.bukkit.BukkitBiome;
import art.arcane.iris.spi.IrisPlatforms;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.PlatformBiome;
import art.arcane.iris.spi.PlatformBlockState;
@@ -215,7 +215,7 @@ public class IrisComplex implements DataProvider {
regionStream.contextInjecting((c, xx, zz) -> IrisContext.getOr(engine).getChunkContext().getRegion().get(xx, zz)).get(x, z), x, z, fluidHeight))
.cache2D("trueBiomeStream", engine, cacheSize).waste("True Biome Stream");
trueBiomeDerivativeStream = trueBiomeStream.contextInjecting((c, x, z) -> IrisContext.getOr(engine).getChunkContext().getBiome().get(x, z))
.convert((b) -> (PlatformBiome) BukkitBiome.of(b.getDerivative())).cache2D("trueBiomeDerivativeStream", engine, cacheSize).waste("True Biome Derivative Stream");
.convert((b) -> IrisPlatforms.get().registries().biome(b.getDerivativeKey())).cache2D("trueBiomeDerivativeStream", engine, cacheSize).waste("True Biome Derivative Stream");
heightFluidStream = heightStream.contextInjecting((c, x, z) -> IrisContext.getOr(engine).getChunkContext().getHeight().getDouble(x, z))
.max(fluidHeight).cache2DDouble("heightFluidStream", engine, cacheSize).waste("Height Fluid Stream");
maxHeightStream = ProceduralStream.ofDouble((x, z) -> height).waste("Max Height Stream");
@@ -22,7 +22,6 @@ import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.framework.EngineAssignedActuator;
import art.arcane.iris.engine.object.IrisBiome;
import art.arcane.iris.engine.object.IrisBiomeCustom;
import art.arcane.iris.platform.bukkit.BukkitBiome;
import art.arcane.iris.util.project.context.ChunkContext;
import art.arcane.volmlib.util.documentation.BlockCoordinates;
import art.arcane.iris.util.project.hunk.Hunk;
@@ -33,7 +32,6 @@ import art.arcane.volmlib.util.scheduling.ChronoLatch;
import art.arcane.volmlib.util.scheduling.PrecisionStopwatch;
import art.arcane.iris.spi.IrisPlatforms;
import art.arcane.iris.spi.PlatformBiome;
import org.bukkit.block.Biome;
public class IrisBiomeActuator extends EngineAssignedActuator<PlatformBiome> {
private final RNG rng;
@@ -62,11 +60,9 @@ public class IrisBiomeActuator extends EngineAssignedActuator<PlatformBiome> {
biome = IrisPlatforms.get().registries().biome(key);
matter = BiomeInjectMatter.get(IrisPlatforms.get().biomeWriter().biomeIdFor(key));
} else {
Biome v = ib.getSkyBiome(rng, x, 0, z);
PlatformBiome fallback = BukkitBiome.of(v);
PlatformBiome resolved = IrisPlatforms.get().registries().biome(fallback.key());
biome = resolved == null ? fallback : resolved;
matter = BiomeInjectMatter.get(v);
String skyKey = ib.getSkyBiomeKey(rng, x, 0, z);
biome = IrisPlatforms.get().registries().biome(skyKey);
matter = BiomeInjectMatter.get(IrisPlatforms.get().biomeWriter().biomeIdFor(skyKey));
}
if (biome != null) {
@@ -18,7 +18,6 @@
package art.arcane.iris.engine.modifier;
import art.arcane.iris.platform.bukkit.BukkitBlockResolution;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.IrisComplex;
@@ -46,11 +45,8 @@ import art.arcane.volmlib.util.math.RNG;
import art.arcane.volmlib.util.matter.MatterBiomeInject;
import art.arcane.volmlib.util.matter.slices.BiomeInjectMatter;
import art.arcane.volmlib.util.scheduling.PrecisionStopwatch;
import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.spi.IrisPlatforms;
import art.arcane.iris.spi.PlatformBlockState;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
import java.util.IdentityHashMap;
@@ -261,11 +257,10 @@ public class IrisFloatingChildBiomeModifier extends EngineAssignedModifier<Platf
IrisFloatingChildBiomes entry = sample.entry;
Integer localFluidHeight = entry.getLocalFluidHeight();
if (localFluidHeight != null && localFluidHeight > 0) {
BlockData rawFluid = BukkitBlockResolution.get(entry.getFluidBlock());
if (rawFluid == null) {
rawFluid = BukkitBlockResolution.get("minecraft:water");
PlatformBlockState fluid = B.getStateOrNull(entry.getFluidBlock());
if (fluid == null) {
fluid = B.getState("minecraft:water");
}
PlatformBlockState fluid = BukkitBlockState.of(rawFluid);
int fluidCap = Math.min(sample.thickness - 1, localFluidHeight);
for (int k = 1; k <= fluidCap; k++) {
if (sample.solidMask[k]) {
@@ -324,7 +319,7 @@ public class IrisFloatingChildBiomeModifier extends EngineAssignedModifier<Platf
int max = Math.max(1, chunkHeight - topY);
if (topY + 1 < chunkHeight) {
PlatformBlockState above = output.get(xf, topY + 1, zf);
if (above == null || BukkitBlockResolution.isAir((BlockData) above.nativeHandle())) {
if (above == null || above.isAir()) {
try {
RNG colRng = rng.nextParallelRNG((int) FloatingIslandSample.columnSeed(baseSeed, wx, wz));
FloatingDecorator.decorateColumn(getEngine(), target, IrisDecorationPart.NONE, xf, zf, wx, wz, topY, max, output, colRng, NOOP_DECORATION_MISS);
@@ -357,7 +352,7 @@ public class IrisFloatingChildBiomeModifier extends EngineAssignedModifier<Platf
fluidTopY = y;
}
}
if (fluidTopY > 0 && fluidTopY + 1 < chunkHeight && BukkitBlockResolution.isAir(unwrap(output.get(xf, fluidTopY + 1, zf)))) {
if (fluidTopY > 0 && fluidTopY + 1 < chunkHeight && B.isAir(output.get(xf, fluidTopY + 1, zf))) {
try {
seaSurfaceDecorator.decorate(xf, zf, wx, wx + 1, wx - 1, wz, wz + 1, wz - 1, output, target, fluidTopY, chunkHeight);
} catch (Throwable e) {
@@ -397,17 +392,12 @@ public class IrisFloatingChildBiomeModifier extends EngineAssignedModifier<Platf
}
}
private static BlockData unwrap(PlatformBlockState state) {
return state == null ? null : (BlockData) state.nativeHandle();
}
private MatterBiomeInject createSkyBiomeMatter(IrisBiome target, int wx, int wz) {
if (target.isCustom()) {
IrisBiomeCustom custom = target.getCustomBiome(rng, wx, 0, wz);
return BiomeInjectMatter.get(IrisPlatforms.get().biomeWriter().biomeIdFor(getDimension().getLoadKey() + ":" + custom.getId()));
}
Biome v = target.getSkyBiome(rng, wx, 0, wz);
return BiomeInjectMatter.get(v);
return BiomeInjectMatter.get(IrisPlatforms.get().biomeWriter().biomeIdFor(target.getSkyBiomeKey(rng, wx, 0, wz)));
}
}
@@ -32,7 +32,7 @@ import art.arcane.volmlib.util.collection.KSet;
import art.arcane.iris.util.common.data.B;
import art.arcane.iris.util.common.data.DataProvider;
import art.arcane.iris.util.common.data.registry.RegistryUtil;
import art.arcane.volmlib.util.data.VanillaBiomeMap;
import art.arcane.volmlib.util.data.VanillaBiomeColors;
import art.arcane.volmlib.util.inventorygui.RandomColor;
import art.arcane.volmlib.util.json.JSONObject;
import art.arcane.volmlib.util.math.RNG;
@@ -298,6 +298,10 @@ public class IrisBiome extends IrisRegistrant implements IRare {
return resolved == null ? namespacedBiomeKey(derivative) : resolved;
}
public String getDerivativeKey() {
return namespacedBiomeKey(derivative);
}
private static String namespacedBiomeKey(String key) {
if (key == null || key.isBlank()) {
return null;
@@ -802,6 +806,30 @@ public class IrisBiome extends IrisRegistrant implements IRare {
return getBiomeGenerator(rng).fit(getBiomeScatterResolved(), x, y, z);
}
public String getSkyBiomeKey(RNG rng, double x, double y, double z) {
if (biomeSkyScatter.size() == 1) {
return namespacedBiomeKey(biomeSkyScatter.get(0));
}
if (biomeSkyScatter.isEmpty()) {
return getGroundBiomeKey(rng, x, y, z);
}
return namespacedBiomeKey(biomeSkyScatter.get(getBiomeGenerator(rng).fit(0, biomeSkyScatter.size() - 1, x, y, z)));
}
public String getGroundBiomeKey(RNG rng, double x, double y, double z) {
if (biomeScatter.isEmpty()) {
return namespacedBiomeKey(derivative);
}
if (biomeScatter.size() == 1) {
return namespacedBiomeKey(biomeScatter.get(0));
}
return namespacedBiomeKey(biomeScatter.get(getBiomeGenerator(rng).fit(0, biomeScatter.size() - 1, x, y, z)));
}
public PlatformBlockState getSurfaceBlock(int x, int z, RNG rng, IrisData idm) {
if (getLayers().isEmpty()) {
return B.getState("AIR");
@@ -816,13 +844,14 @@ public class IrisBiome extends IrisRegistrant implements IRare {
return this.cacheColor.aquire(() -> {
if (this.color == null) {
RandomColor randomColor = new RandomColor(getName().hashCode());
if (this.getVanillaDerivative() == null) {
String vanillaKey = this.getVanillaDerivativeKey();
RandomColor.Color col = vanillaKey == null ? null : VanillaBiomeColors.getColorType(vanillaKey);
if (col == null) {
IrisLogging.warn("No vanilla biome found for " + getName());
return new Color(randomColor.randomColor());
}
RandomColor.Color col = VanillaBiomeMap.getColorType(this.getVanillaDerivative());
RandomColor.Luminosity lum = VanillaBiomeMap.getColorLuminosity(this.getVanillaDerivative());
RandomColor.SaturationType sat = VanillaBiomeMap.getColorSaturatiom(this.getVanillaDerivative());
RandomColor.Luminosity lum = VanillaBiomeColors.getColorLuminosity(vanillaKey);
RandomColor.SaturationType sat = VanillaBiomeColors.getColorSaturation(vanillaKey);
int newColorI = randomColor.randomColor(col, col == RandomColor.Color.MONOCHROME ? RandomColor.SaturationType.MONOCHROME : sat, lum);
return new Color(newColorI);
@@ -29,7 +29,7 @@ import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.collection.KSet;
import art.arcane.iris.util.common.data.DataProvider;
import art.arcane.volmlib.util.data.VanillaBiomeMap;
import art.arcane.volmlib.util.data.VanillaBiomeColors;
import art.arcane.volmlib.util.inventorygui.RandomColor;
import art.arcane.volmlib.util.json.JSONObject;
import art.arcane.volmlib.util.math.RNG;
@@ -448,10 +448,11 @@ public class IrisRegion extends IrisRegistrant implements IRare {
int index = rand.nextInt(biomes.size());
IrisBiome biome = biomes.get(index);
if (biome.getVanillaDerivative() != null) {
RandomColor.Color col = VanillaBiomeMap.getColorType(biome.getVanillaDerivative());
RandomColor.Luminosity lum = VanillaBiomeMap.getColorLuminosity(biome.getVanillaDerivative());
RandomColor.SaturationType sat = VanillaBiomeMap.getColorSaturatiom(biome.getVanillaDerivative());
String vanillaKey = biome.getVanillaDerivativeKey();
RandomColor.Color col = vanillaKey == null ? null : VanillaBiomeColors.getColorType(vanillaKey);
if (col != null) {
RandomColor.Luminosity lum = VanillaBiomeColors.getColorLuminosity(vanillaKey);
RandomColor.SaturationType sat = VanillaBiomeColors.getColorSaturation(vanillaKey);
int newColorI = randomColor.randomColor(col, col == RandomColor.Color.MONOCHROME ? RandomColor.SaturationType.MONOCHROME : sat, lum);
return new Color(newColorI);
}