From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: ishland Date: Tue, 21 Sep 2021 10:37:34 +0200 Subject: [PATCH] c2me: optimization.math Copyright (c) 2021-2022 ishland 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..883a8dcf94b619cd5ffbcfc6f28809c2c6a71f55 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 { public final double yo; 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} + }; + // Mirai end + public ImprovedNoise(RandomSource random) { this.xo = random.nextDouble() * 256.0D; this.yo = random.nextDouble() * 256.0D; @@ -34,34 +55,38 @@ public final class ImprovedNoise { return this.noise(x, y, z, 0.0D, 0.0D); } + // Mirai start - c2me: optimization.math + /** + * @author ishland + * @reason optimize: remove frequent type conversions + */ /** @deprecated */ @Deprecated public double noise(double x, double y, double z, double yScale, double yMax) { double d = x + this.xo; double e = y + this.yo; double f = z + this.zo; - int i = Mth.floor(d); - int j = Mth.floor(e); - int k = Mth.floor(f); - double g = d - (double)i; - double h = e - (double)j; - double l = f - (double)k; - double o; - if (yScale != 0.0D) { + double i = Mth.floor(d); + double j = Mth.floor(e); + double k = Mth.floor(f); + double g = d - i; + double h = e - j; + double l = f - k; + double o = 0.0D; + if (yScale != 0.0) { double m; - if (yMax >= 0.0D && yMax < h) { + if (yMax >= 0.0 && yMax < h) { m = yMax; } else { m = h; } - o = (double)Mth.floor(m / yScale + (double)1.0E-7F) * yScale; - } else { - o = 0.0D; + o = Mth.floor(m / yScale + 1.0E-7F) * yScale; } - return this.sampleAndLerp(i, j, k, g, h - o, l, h); + return this.sampleAndLerp((int) i, (int) j, (int) k, g, h - o, l, h); } + // Mirai end public double noiseWithDerivative(double x, double y, double z, double[] ds) { double d = x + this.xo; @@ -84,26 +109,141 @@ 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 + */ private double sampleAndLerp(int sectionX, int sectionY, int sectionZ, double localX, double localY, double localZ, double fadeLocalX) { - int i = this.p(sectionX); - int j = this.p(sectionX + 1); - int k = this.p(i + sectionY); - int l = this.p(i + sectionY + 1); - int m = this.p(j + sectionY); - int n = this.p(j + sectionY + 1); - double d = gradDot(this.p(k + sectionZ), localX, localY, localZ); - double e = gradDot(this.p(m + sectionZ), localX - 1.0D, localY, localZ); - double f = gradDot(this.p(l + sectionZ), localX, localY - 1.0D, localZ); - double g = gradDot(this.p(n + sectionZ), localX - 1.0D, localY - 1.0D, localZ); - double h = gradDot(this.p(k + sectionZ + 1), localX, localY, localZ - 1.0D); - double o = gradDot(this.p(m + sectionZ + 1), localX - 1.0D, localY, localZ - 1.0D); - double p = gradDot(this.p(l + sectionZ + 1), localX, localY - 1.0D, localZ - 1.0D); - double q = gradDot(this.p(n + sectionZ + 1), localX - 1.0D, localY - 1.0D, localZ - 1.0D); - double r = Mth.smoothstep(localX); - 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 + final int var0 = sectionX & 0xFF; + final int var1 = (sectionX + 1) & 0xFF; + final int var2 = this.p[var0] & 0xFF; + final int var3 = this.p[var1] & 0xFF; + final int var4 = (var2 + sectionY) & 0xFF; + final int var5 = (var2 + sectionY + 1) & 0xFF; + final int var6 = (var3 + sectionY) & 0xFF; + final int var7 = (var3 + sectionY + 1) & 0xFF; + final int var8 = this.p[var4] & 0xFF; + final int var9 = this.p[var5] & 0xFF; + final int var10 = this.p[var6] & 0xFF; + final int var11 = this.p[var7] & 0xFF; + + final int var12 = (var8 + sectionZ) & 0xFF; + final int var13 = (var10 + sectionZ) & 0xFF; + final int var14 = (var9 + sectionZ) & 0xFF; + final int var15 = (var11 + sectionZ) & 0xFF; + final int var16 = (var8 + sectionZ + 1) & 0xFF; + 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 double var60 = localX - 1.0; + final double var61 = localY - 1.0; + final double var62 = localZ - 1.0; + final double var63 = var36 * localX; + final double var64 = var37 * localY; + final double var65 = var38 * localZ; + final double var66 = var39 * var60; + final double var67 = var40 * localY; + final double var68 = var41 * localZ; + final double var69 = var42 * localX; + final double var70 = var43 * var61; + final double var71 = var44 * localZ; + final double var72 = var45 * var60; + final double var73 = var46 * var61; + final double var74 = var47 * localZ; + final double var75 = var48 * localX; + final double var76 = var49 * localY; + final double var77 = var50 * var62; + final double var78 = var51 * var60; + final double var79 = var52 * localY; + final double var80 = var53 * var62; + final double var81 = var54 * localX; + final double var82 = var55 * var61; + final double var83 = var56 * var62; + final double var84 = var57 * var60; + final double var85 = var58 * var61; + final double var86 = var59 * var62; + final double var87 = var63 + var64 + var65; + final double var88 = var66 + var67 + var68; + final double var89 = var69 + var70 + var71; + final double var90 = var72 + var73 + var74; + final double var91 = var75 + var76 + var77; + final double var92 = var78 + var79 + var80; + final double var93 = var81 + var82 + var83; + final double var94 = var84 + var85 + var86; + + final double var95 = localX * 6.0 - 15.0; + final double var96 = fadeLocalX * 6.0 - 15.0; + final double var97 = localZ * 6.0 - 15.0; + final double var98 = localX * var95 + 10.0; + final double var99 = fadeLocalX * var96 + 10.0; + final double var100 = localZ * var97 + 10.0; + final double var101 = localX * localX * localX * var98; + final double var102 = fadeLocalX * fadeLocalX * fadeLocalX * var99; + final double var103 = localZ * localZ * localZ * var100; + + final double var104 = var90 - var89; + final double var105 = var88 - var87; + final double var106 = var94 - var93; + final double var107 = var92 - var91; + final double var108 = var101 * var104; + final double var109 = var101 * var105; + final double var110 = var101 * var106; + final double var111 = var101 * var107; + final double var112 = var89 + var108; + final double var113 = var87 + var109; + final double var114 = var93 + var110; + final double var115 = var91 + var111; + final double var116 = var112 - var113; + final double var117 = var114 - var115; + final double var118 = var102 * var116; + final double var119 = var102 * var117; + final double var120 = var113 + var118; + final double var121 = var115 + var119; + return var120 + (var103 * (var121 - var120)); } + // Mirai end 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 --- 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 { return this.noiseLevels[this.noiseLevels.length - 1 - octave]; } + // Mirai start - c2me: optimization.math + /** + * @author ishland + * @reason remove frequent type conversion + */ public static double wrap(double value) { - return value - (double)Mth.lfloor(value / 3.3554432E7D + 0.5D) * 3.3554432E7D; + return value - Mth.lfloor(value / 3.3554432E7 + 0.5) * 3.3554432E7; } + // Mirai end protected int firstOctave() { return this.firstOctave;