Update c2me: optimization.math
This commit is contained in:
@@ -9,7 +9,7 @@ Original code by RelativityMC, licensed under MIT
|
||||
You can find the original code on https://github.com/RelativityMC/C2ME-fabric (Yarn mappings)
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java b/src/main/java/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java
|
||||
index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71cd71f8371 100644
|
||||
index 765b56776e457109ddea9f7dbfd0b17beefee51e..0b2c02891c240626f2f274c1fc854648801996f4 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java
|
||||
@@ -11,6 +11,27 @@ public final class ImprovedNoise {
|
||||
@@ -17,23 +17,23 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c
|
||||
public final double zo;
|
||||
|
||||
+ // Mirai start - c2me: optimization.math
|
||||
+ private static final double[][] SIMPLEX_NOISE_GRADIENTS = new double[][]{
|
||||
+ {1, 1, 0},
|
||||
+ {-1, 1, 0},
|
||||
+ {1, -1, 0},
|
||||
+ {-1, -1, 0},
|
||||
+ {1, 0, 1},
|
||||
+ {-1, 0, 1},
|
||||
+ {1, 0, -1},
|
||||
+ {-1, 0, -1},
|
||||
+ {0, 1, 1},
|
||||
+ {0, -1, 1},
|
||||
+ {0, 1, -1},
|
||||
+ {0, -1, -1},
|
||||
+ {1, 1, 0},
|
||||
+ {0, -1, 1},
|
||||
+ {-1, 1, 0},
|
||||
+ {0, -1, -1}
|
||||
+ private static final double[] FLAT_SIMPLEX_GRAD = new double[]{
|
||||
+ 1, 1, 0, 0,
|
||||
+ -1, 1, 0, 0,
|
||||
+ 1, -1, 0, 0,
|
||||
+ -1, -1, 0, 0,
|
||||
+ 1, 0, 1, 0,
|
||||
+ -1, 0, 1, 0,
|
||||
+ 1, 0, -1, 0,
|
||||
+ -1, 0, -1, 0,
|
||||
+ 0, 1, 1, 0,
|
||||
+ 0, -1, 1, 0,
|
||||
+ 0, 1, -1, 0,
|
||||
+ 0, -1, -1, 0,
|
||||
+ 1, 1, 0, 0,
|
||||
+ 0, -1, 1, 0,
|
||||
+ -1, 1, 0, 0,
|
||||
+ 0, -1, -1, 0,
|
||||
+ };
|
||||
+ // Mirai end
|
||||
+
|
||||
@@ -92,14 +92,14 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c
|
||||
|
||||
public double noiseWithDerivative(double x, double y, double z, double[] ds) {
|
||||
double d = x + this.xo;
|
||||
@@ -84,26 +109,107 @@ public final class ImprovedNoise {
|
||||
@@ -84,26 +109,75 @@ public final class ImprovedNoise {
|
||||
return this.p[hash & 255] & 255;
|
||||
}
|
||||
|
||||
+ // Mirai start - c2me: optimization.math
|
||||
+ /**
|
||||
+ * @author ishland
|
||||
+ * @reason inline Mth & small optimization: remove frequent type conversions and redundant ops
|
||||
+ * @reason inline math & small optimization: remove frequent type conversions and redundant ops
|
||||
+ */
|
||||
private double sampleAndLerp(int sectionX, int sectionY, int sectionZ, double localX, double localY, double localZ, double fadeLocalX) {
|
||||
- int i = this.p(sectionX);
|
||||
@@ -120,7 +120,7 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c
|
||||
- double s = Mth.smoothstep(fadeLocalX);
|
||||
- double t = Mth.smoothstep(localZ);
|
||||
- return Mth.lerp3(r, s, t, d, e, f, g, h, o, p, q);
|
||||
+ // TODO [VanillaCopy] but inlined
|
||||
+ // TODO [VanillaCopy] but optimized
|
||||
+ final int var0 = sectionX & 0xFF;
|
||||
+ final int var1 = (sectionX + 1) & 0xFF;
|
||||
+ final int var2 = this.p[var0] & 0xFF;
|
||||
@@ -142,57 +142,25 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c
|
||||
+ final int var17 = (var10 + sectionZ + 1) & 0xFF;
|
||||
+ final int var18 = (var9 + sectionZ + 1) & 0xFF;
|
||||
+ final int var19 = (var11 + sectionZ + 1) & 0xFF;
|
||||
+ final int var20 = this.p[var12] & 15;
|
||||
+ final int var21 = this.p[var13] & 15;
|
||||
+ final int var22 = this.p[var14] & 15;
|
||||
+ final int var23 = this.p[var15] & 15;
|
||||
+ final int var24 = this.p[var16] & 15;
|
||||
+ final int var25 = this.p[var17] & 15;
|
||||
+ final int var26 = this.p[var18] & 15;
|
||||
+ final int var27 = this.p[var19] & 15;
|
||||
+ final double[] var28 = SIMPLEX_NOISE_GRADIENTS[var20];
|
||||
+ final double[] var29 = SIMPLEX_NOISE_GRADIENTS[var21];
|
||||
+ final double[] var30 = SIMPLEX_NOISE_GRADIENTS[var22];
|
||||
+ final double[] var31 = SIMPLEX_NOISE_GRADIENTS[var23];
|
||||
+ final double[] var32 = SIMPLEX_NOISE_GRADIENTS[var24];
|
||||
+ final double[] var33 = SIMPLEX_NOISE_GRADIENTS[var25];
|
||||
+ final double[] var34 = SIMPLEX_NOISE_GRADIENTS[var26];
|
||||
+ final double[] var35 = SIMPLEX_NOISE_GRADIENTS[var27];
|
||||
+ final double var36 = var28[0];
|
||||
+ final double var37 = var28[1];
|
||||
+ final double var38 = var28[2];
|
||||
+ final double var39 = var29[0];
|
||||
+ final double var40 = var29[1];
|
||||
+ final double var41 = var29[2];
|
||||
+ final double var42 = var30[0];
|
||||
+ final double var43 = var30[1];
|
||||
+ final double var44 = var30[2];
|
||||
+ final double var45 = var31[0];
|
||||
+ final double var46 = var31[1];
|
||||
+ final double var47 = var31[2];
|
||||
+ final double var48 = var32[0];
|
||||
+ final double var49 = var32[1];
|
||||
+ final double var50 = var32[2];
|
||||
+ final double var51 = var33[0];
|
||||
+ final double var52 = var33[1];
|
||||
+ final double var53 = var33[2];
|
||||
+ final double var54 = var34[0];
|
||||
+ final double var55 = var34[1];
|
||||
+ final double var56 = var34[2];
|
||||
+ final double var57 = var35[0];
|
||||
+ final double var58 = var35[1];
|
||||
+ final double var59 = var35[2];
|
||||
+ final int var20 = (this.p[var12] & 15) << 2;
|
||||
+ final int var21 = (this.p[var13] & 15) << 2;
|
||||
+ final int var22 = (this.p[var14] & 15) << 2;
|
||||
+ final int var23 = (this.p[var15] & 15) << 2;
|
||||
+ final int var24 = (this.p[var16] & 15) << 2;
|
||||
+ final int var25 = (this.p[var17] & 15) << 2;
|
||||
+ final int var26 = (this.p[var18] & 15) << 2;
|
||||
+ final int var27 = (this.p[var19] & 15) << 2;
|
||||
+ final double var60 = localX - 1.0;
|
||||
+ final double var61 = localY - 1.0;
|
||||
+ final double var62 = localZ - 1.0;
|
||||
+ final double var87 = var36 * localX + var37 * localY + var38 * localZ;
|
||||
+ final double var88 = var39 * var60 + var40 * localY + var41 * localZ;
|
||||
+ final double var89 = var42 * localX + var43 * var61 + var44 * localZ;
|
||||
+ final double var90 = var45 * var60 + var46 * var61 + var47 * localZ;
|
||||
+ final double var91 = var48 * localX + var49 * localY + var50 * var62;
|
||||
+ final double var92 = var51 * var60 + var52 * localY + var53 * var62;
|
||||
+ final double var93 = var54 * localX + var55 * var61 + var56 * var62;
|
||||
+ final double var94 = var57 * var60 + var58 * var61 + var59 * var62;
|
||||
+ final double var87 = FLAT_SIMPLEX_GRAD[(var20) | 0] * localX + FLAT_SIMPLEX_GRAD[(var20) | 1] * localY + FLAT_SIMPLEX_GRAD[(var20) | 2] * localZ;
|
||||
+ final double var88 = FLAT_SIMPLEX_GRAD[(var21) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var21) | 1] * localY + FLAT_SIMPLEX_GRAD[(var21) | 2] * localZ;
|
||||
+ final double var89 = FLAT_SIMPLEX_GRAD[(var22) | 0] * localX + FLAT_SIMPLEX_GRAD[(var22) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var22) | 2] * localZ;
|
||||
+ final double var90 = FLAT_SIMPLEX_GRAD[(var23) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var23) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var23) | 2] * localZ;
|
||||
+ final double var91 = FLAT_SIMPLEX_GRAD[(var24) | 0] * localX + FLAT_SIMPLEX_GRAD[(var24) | 1] * localY + FLAT_SIMPLEX_GRAD[(var24) | 2] * var62;
|
||||
+ final double var92 = FLAT_SIMPLEX_GRAD[(var25) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var25) | 1] * localY + FLAT_SIMPLEX_GRAD[(var25) | 2] * var62;
|
||||
+ final double var93 = FLAT_SIMPLEX_GRAD[(var26) | 0] * localX + FLAT_SIMPLEX_GRAD[(var26) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var26) | 2] * var62;
|
||||
+ final double var94 = FLAT_SIMPLEX_GRAD[(var27) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var27) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var27) | 2] * var62;
|
||||
+
|
||||
+ final double var95 = localX * 6.0 - 15.0;
|
||||
+ final double var96 = fadeLocalX * 6.0 - 15.0;
|
||||
@@ -219,10 +187,68 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c
|
||||
private double sampleWithDerivative(int sectionX, int sectionY, int sectionZ, double localX, double localY, double localZ, double[] ds) {
|
||||
int i = this.p(sectionX);
|
||||
diff --git a/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java b/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java
|
||||
index b6b56a3db74e07ca015deb7a8ebddc97f6228025..510e83b92028a6d338407c7b428be3daa2355932 100644
|
||||
index b6b56a3db74e07ca015deb7a8ebddc97f6228025..b7fab2ae8abb3092e7bde138f7ca6253cecfaa75 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java
|
||||
@@ -164,9 +164,15 @@ public class PerlinNoise {
|
||||
@@ -25,6 +25,11 @@ public class PerlinNoise {
|
||||
private final double lowestFreqValueFactor;
|
||||
private final double lowestFreqInputFactor;
|
||||
|
||||
+ // Mirai start - c2me: optimization.math
|
||||
+ private int noiseLevelsCount = 0;
|
||||
+ private double[] amplitudesArray = null;
|
||||
+ // Mirai end
|
||||
+
|
||||
/** @deprecated */
|
||||
@Deprecated
|
||||
public static PerlinNoise createLegacyForBlendedNoise(RandomSource random, IntStream intStream) {
|
||||
@@ -84,6 +89,10 @@ public class PerlinNoise {
|
||||
int i = this.amplitudes.size();
|
||||
int j = -this.firstOctave;
|
||||
this.noiseLevels = new ImprovedNoise[i];
|
||||
+ // Mirai start - c2me: optimization.math
|
||||
+ this.noiseLevelsCount = this.noiseLevels.length;
|
||||
+ this.amplitudesArray = this.amplitudes.toDoubleArray();
|
||||
+ // Mirai end
|
||||
if (xoroshiro) {
|
||||
PositionalRandomFactory positionalRandomFactory = random.forkPositional();
|
||||
|
||||
@@ -134,9 +143,33 @@ public class PerlinNoise {
|
||||
random.consumeCount(262);
|
||||
}
|
||||
|
||||
+ // Mirai start - c2me: optimization.math
|
||||
+ /**
|
||||
+ * @author ishland
|
||||
+ * @reason optimize for common cases
|
||||
+ */
|
||||
public double getValue(double x, double y, double z) {
|
||||
- return this.getValue(x, y, z, 0.0D, 0.0D, false);
|
||||
+ double d = 0.0;
|
||||
+ double e = this.lowestFreqInputFactor;
|
||||
+ double f = this.lowestFreqValueFactor;
|
||||
+
|
||||
+ for(int i = 0; i < this.noiseLevelsCount; ++i) {
|
||||
+ ImprovedNoise improvedNoise = this.noiseLevels[i];
|
||||
+ if (improvedNoise != null) {
|
||||
+ @SuppressWarnings("deprecation")
|
||||
+ double g = improvedNoise.noise(
|
||||
+ wrap(x * e), wrap(y * e), wrap(z * e), 0.0, 0.0
|
||||
+ );
|
||||
+ d += this.amplitudesArray[i] * g * f;
|
||||
+ }
|
||||
+
|
||||
+ e *= 2.0;
|
||||
+ f /= 2.0;
|
||||
+ }
|
||||
+
|
||||
+ return d;
|
||||
}
|
||||
+ // Mirai end
|
||||
|
||||
/** @deprecated */
|
||||
@Deprecated
|
||||
@@ -164,9 +197,15 @@ public class PerlinNoise {
|
||||
return this.noiseLevels[this.noiseLevels.length - 1 - octave];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user