Yatopia/patches/removed/server/0053-lithium-PerlinNoiseSamplerMixin.patch
Ivan Pekov e14836e8ea
Drop lithium noise patches & voronoi
Fixes #226

All these were doing some kind of weirdness to the chunk generation, thats why they were dropped.
Unfortunately this will decrease performance, but bugs is our priority before speed.
2020-10-01 19:51:56 +03:00

190 lines
7.0 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: JellySquid <jellysquid+atwork@protonmail.com>
Date: Sat, 26 Sep 2020 11:37:25 -0500
Subject: [PATCH] lithium PerlinNoiseSamplerMixin
Original code by JellySquid, licensed under LGPLv3
you can find the original code on https://github.com/jellysquid3/lithium-fabric/ (Yarn mappings)
diff --git a/src/main/java/net/minecraft/server/NoiseGeneratorPerlin.java b/src/main/java/net/minecraft/server/NoiseGeneratorPerlin.java
index d7ca619b228e2a5a461085e0c5222e6a36a66fe0..bf7aad5885138db06ce7c51a65b0493dd825f6f7 100644
--- a/src/main/java/net/minecraft/server/NoiseGeneratorPerlin.java
+++ b/src/main/java/net/minecraft/server/NoiseGeneratorPerlin.java
@@ -8,6 +8,12 @@ public final class NoiseGeneratorPerlin {
public final double a;
public final double b;
public final double c;
+ // Yatopia start - Faster Perlin
+ private static final int GRADIENT_STRIDE = 4;
+ private static final int GRADIENT_STRIDE_SH = 2;
+
+ private final byte[] gradientTable = new byte[256 * GRADIENT_STRIDE];
+ // Yatopia end
public NoiseGeneratorPerlin(Random random) {
this.a = random.nextDouble() * 256.0D;
@@ -29,9 +35,21 @@ public final class NoiseGeneratorPerlin {
this.d[i + j] = b0;
}
+ // Yatopia start
+ for (i = 0; i < 256; i++) {
+ int hash = this.d[i & 255] & 15;
+
+ for (int j = 0; j < 3; j++) {
+ this.gradientTable[(i * GRADIENT_STRIDE) + j] = (byte) NoiseGenerator3Handler.a[hash][j];
+ }
+ }
+ // Yatopia end
}
+ public final double sample(double x, double y, double z, double d, double e) { return a(x, y, z, d, e); } // Yatopia - OBFHELPER
public double a(double d0, double d1, double d2, double d3, double d4) {
+ // Yatopia start - replaced logic
+ /*
double d5 = d0 + this.a;
double d6 = d1 + this.b;
double d7 = d2 + this.c;
@@ -55,6 +73,29 @@ public final class NoiseGeneratorPerlin {
}
return this.a(i, j, k, d8, d9 - d14, d10, d11, d12, d13);
+ */
+ final double ox = d0 + this.a;
+ final double oy = d1 + this.b;
+ final double oz = d2 + this.c;
+
+ final double fox = Math.floor(ox);
+ final double foy = Math.floor(oy);
+ final double foz = Math.floor(oz);
+
+ double oox = ox - fox;
+ double ooy = oy - foy;
+ double ooz = oz - foz;
+
+ final double fx = MathHelper.j(oox);
+ final double fy = MathHelper.j(ooy);
+ final double fz = MathHelper.j(ooz);
+
+ if (d3 != 0.0D) {
+ ooy = ooy - (Math.floor(Math.min(d4, ooy) / d3) * d3);
+ }
+
+ return this.sample((int) fox, (int) foy, (int) foz, oox, ooy, ooz, fx, fy, fz);
+ // Yatopia end
}
private static double a(int i, double d0, double d1, double d2) {
@@ -67,7 +108,10 @@ public final class NoiseGeneratorPerlin {
return this.d[i & 255] & 255;
}
+ public final double sample(int i, int j, int k, double d0, double d1, double d2, double d3, double d4, double d5) { return a(i, j, k, d0, d1, d2, d3, d4, d5); } // Yatopia - OBFHELPER
public double a(int i, int j, int k, double d0, double d1, double d2, double d3, double d4, double d5) {
+ // Yatopia start - replaced logic
+ /*
int l = this.a(i) + j;
int i1 = this.a(l) + k;
int j1 = this.a(l + 1) + k;
@@ -84,5 +128,100 @@ public final class NoiseGeneratorPerlin {
double d13 = a(this.a(i2 + 1), d0 - 1.0D, d1 - 1.0D, d2 - 1.0D);
return MathHelper.a(d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13);
+ */
+ final byte[] perm = this.d;
+
+ final int i1 = (perm[i & 255] & 255) + j;
+ final int l = (perm[(i + 1) & 255] & 255) + j;
+
+ final int j1 = (perm[255 & i] & 255) + k;
+ final int m = (perm[l & 255] & 255) + k;
+
+ final int k1 = (perm[(i + 1) & 255] & 255) + k;
+ final int n = (perm[(l + 1) & 255] & 255) + k;
+
+ final double localX2 = d0 - 1.0D;
+ final double localY2 = d1 - 1.0D;
+ final double localZ2 = d2 - 1.0D;
+
+ final int d00 = (j & 255) << GRADIENT_STRIDE_SH;
+ final int d01 = (m & 255) << GRADIENT_STRIDE_SH;
+ final int d02 = (k & 255) << GRADIENT_STRIDE_SH;
+ final int d03 = (n & 255) << GRADIENT_STRIDE_SH;
+
+ final int d10 = ((j + 1) & 255) << GRADIENT_STRIDE_SH;
+ final int d11 = ((m + 1) & 255) << GRADIENT_STRIDE_SH;
+ final int d12 = ((k + 1) & 255) << GRADIENT_STRIDE_SH;
+ final int d13 = ((n + 1) & 255) << GRADIENT_STRIDE_SH;
+
+ final byte[] grad = this.gradientTable;
+
+ final double g00x = grad[d00] * d0;
+ final double g00y = grad[d00 + 1] * d1;
+ final double g00z = grad[d00 + 2] * d2;
+
+ final double g01x = grad[d01] * localX2;
+ final double g01y = grad[d01 + 1] * d1;
+ final double g01z = grad[d01 + 2] * d2;
+
+ final double g02x = grad[d02] * d0;
+ final double g02y = grad[d02 + 1] * localY2;
+ final double g02z = grad[d02 + 2] * d2;
+
+ final double g03x = grad[d03] * localX2;
+ final double g03y = grad[d03 + 1] * localY2;
+ final double g03z = grad[d03 + 2] * d2;
+
+ final double g10x = grad[d10] * d0;
+ final double g10y = grad[d10 + 1] * d1;
+ final double g10z = grad[d10 + 2] * localZ2;
+
+ final double g11x = grad[d11] * localX2;
+ final double g11y = grad[d11 + 1] * d1;
+ final double g11z = grad[d11 + 2] * localZ2;
+
+ final double g12x = grad[d12] * d0;
+ final double g12y = grad[d12 + 1] * localY2;
+ final double g12z = grad[d12 + 2] * localZ2;
+
+ final double g13x = grad[d13] * localX2;
+ final double g13y = grad[d13 + 1] * localY2;
+ final double g13z = grad[d13 + 2] * localZ2;
+
+ final double g00 = g00x + g00y + g00z;
+ final double g01 = g01x + g01y + g01z;
+ final double g02 = g02x + g02y + g02z;
+ final double g03 = g03x + g03y + g03z;
+ final double g10 = g10x + g10y + g10z;
+ final double g11 = g11x + g11y + g11z;
+ final double g12 = g12x + g12y + g12z;
+ final double g13 = g13x + g13y + g13z;
+
+ final double ba1 = g01 - g00;
+ final double ba2 = g11 - g10;
+ final double dc1 = g03 - g02;
+ final double dc2 = g13 - g12;
+
+ final double dba1 = d3 * ba1;
+ final double dba2 = d3 * ba2;
+ final double ddc1 = d3 * dc1;
+ final double ddc2 = d3 * dc2;
+
+ final double dd0 = g00 + dba1;
+ final double dd1 = g10 + dba2;
+ final double dd2 = g02 + ddc1;
+ final double dd3 = g12 + ddc2;
+
+ final double aa0 = dd2 - dd0;
+ final double aa1 = dd3 - dd1;
+
+ final double y20 = d4 * aa0;
+ final double y31 = d4 * aa1;
+
+ final double aa2 = dd0 + y20;
+ final double aa3 = dd1 + y31;
+
+ return dd0 + y20 + (d4 * (aa3 - aa2));
+ // Yatopia end
}
}