From cd7f192fba1b6dd8b524258d6b73d1bec86f8969 Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Sun, 12 Sep 2021 07:46:24 -0400 Subject: [PATCH] Improve biome generator performance when interpolators match each other --- .../java/com/volmit/iris/api/IrisAPI.java | 2 - .../com/volmit/iris/engine/IrisComplex.java | 41 +++++++++++-------- .../iris/engine/object/IrisInterpolator.java | 8 +++- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/api/src/main/java/com/volmit/iris/api/IrisAPI.java b/api/src/main/java/com/volmit/iris/api/IrisAPI.java index 332d9f315..f8059b1b8 100644 --- a/api/src/main/java/com/volmit/iris/api/IrisAPI.java +++ b/api/src/main/java/com/volmit/iris/api/IrisAPI.java @@ -35,8 +35,6 @@ import java.util.function.Supplier; public class IrisAPI { private static final AtomicCache>> customBlock = new AtomicCache<>(); - private static final AtomicCache> customAwareBlock = new AtomicCache<>(); - private static final AtomicCache> customWorldBlock = new AtomicCache<>(); /** * Checks if the given world is an Iris World diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 2920e4090..33cc8be87 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -30,9 +30,11 @@ import com.volmit.iris.engine.object.IrisDecorationPart; import com.volmit.iris.engine.object.IrisDecorator; import com.volmit.iris.engine.object.IrisFeaturePositional; import com.volmit.iris.engine.object.IrisGenerator; +import com.volmit.iris.engine.object.IrisInterpolator; import com.volmit.iris.engine.object.IrisRegion; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; @@ -52,7 +54,7 @@ public class IrisComplex implements DataProvider { private RNG rng; private double fluidHeight; private IrisData data; - private KList generators; + private KMap> generators; private ProceduralStream regionStream; private ProceduralStream regionStyleStream; private ProceduralStream regionIdentityStream; @@ -100,7 +102,7 @@ public class IrisComplex implements DataProvider { this.data = engine.getData(); double height = engine.getHeight(); fluidHeight = engine.getDimension().getFluidHeight(); - generators = new KList<>(); + generators = new KMap<>(); focus = engine.getFocus(); KMap> inferredStreams = new KMap<>(); @@ -373,28 +375,41 @@ public class IrisComplex implements DataProvider { return biome; } - private double getHeight(Engine engine, IrisBiome b, double x, double z, long seed, boolean features) { + private double getInterpolatedHeight(Engine engine, double x, double z, long seed) + { double h = 0; - for (IrisGenerator gen : generators) { - h += gen.getInterpolator().interpolate(x, z, (xx, zz) -> + for (IrisInterpolator i : generators.keySet()) { + h += i.interpolate(x, z, (xx, zz) -> { try { IrisBiome bx = baseBiomeStream.get(xx, zz); + double b = 0; - return M.lerp(bx.getGenLinkMin(gen.getLoadKey()), - bx.getGenLinkMax(gen.getLoadKey()), - gen.getHeight(x, z, seed + 239945)); + for(IrisGenerator gen : generators.get(i)) + { + b += M.lerp(bx.getGenLinkMin(gen.getLoadKey()), + bx.getGenLinkMax(gen.getLoadKey()), + gen.getHeight(x, z, seed + 239945)); + } + + return b; } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); - Iris.warn("Failed to sample hi biome at " + xx + " " + zz + " using the generator " + gen.getLoadKey()); + Iris.error("Failed to sample hi biome at " + xx + " " + zz + "..."); } return 0; }); } + return h; + } + + private double getHeight(Engine engine, IrisBiome b, double x, double z, long seed, boolean features) { + double h = getInterpolatedHeight(engine, x, z, seed); + AtomicDouble noise = new AtomicDouble(h + fluidHeight + overlayStream.get(x, z)); if (features) { @@ -407,13 +422,7 @@ public class IrisComplex implements DataProvider { } private void registerGenerator(IrisGenerator cachedGenerator) { - for (IrisGenerator i : generators) { - if (i.getLoadKey().equals(cachedGenerator.getLoadKey())) { - return; - } - } - - generators.add(cachedGenerator); + generators.computeIfAbsent(cachedGenerator.getInterpolator(), (k) -> new KSet<>()).add(cachedGenerator); } private IrisBiome implode(IrisBiome b, Double x, Double z) { diff --git a/src/main/java/com/volmit/iris/engine/object/IrisInterpolator.java b/src/main/java/com/volmit/iris/engine/object/IrisInterpolator.java index 90998844c..47c124201 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisInterpolator.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisInterpolator.java @@ -31,7 +31,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -@Snippet("interpolator") +import java.util.Objects; + @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor @@ -50,6 +51,11 @@ public class IrisInterpolator { @Desc("The range checked horizontally. Smaller ranges yeild more detail but are not as smooth.") private double horizontalScale = 7; + public int hashCode() + { + return Objects.hash(horizontalScale, function); + } + public double interpolate(double x, double z, NoiseProvider provider) { return interpolate((int) Math.round(x), (int) Math.round(z), provider); }