Skip to content

Commit 1d6283c

Browse files
committed
refactor: create PerlinNoise util class for heightmap
1 parent 93eabe2 commit 1d6283c

File tree

2 files changed

+45
-36
lines changed

2 files changed

+45
-36
lines changed

src/main/java/org/runejs/client/Landscape.java

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.runejs.client.sound.SoundSystem;
2323
import org.runejs.client.util.BitUtils;
2424
import org.runejs.OldEngine.MapDecompressor;
25+
import org.runejs.client.util.PerlinNoise;
2526

2627
import java.io.IOException;
2728

@@ -1441,7 +1442,7 @@ public static void method789(int chunkLocalX, int chunkY, int chunkX, int chunkL
14411442
}
14421443

14431444
private static int getPerlinVertexHeight(int x, int y) {
1444-
int vertexHeight = -128 + perlinNoise(x + 45365, 91923 + y, 4) - (-(perlinNoise(x + 10294, 37821 + y, 2) - 128 >> 1) + -(-128 + perlinNoise(x, y, 1) >> 2));
1445+
int vertexHeight = -128 + PerlinNoise.get(x + 45365, 91923 + y, 4) - (-(PerlinNoise.get(x + 10294, 37821 + y, 2) - 128 >> 1) + -(-128 + PerlinNoise.get(x, y, 1) >> 2));
14451446
vertexHeight = 35 + (int) (0.3 * (double) vertexHeight);
14461447

14471448
if(vertexHeight >= 10) {
@@ -1452,39 +1453,4 @@ private static int getPerlinVertexHeight(int x, int y) {
14521453

14531454
return vertexHeight;
14541455
}
1455-
1456-
private static int interpolateForPerlin(int arg0, int arg1, int arg2, boolean arg3, int arg4) {
1457-
if (!arg3)
1458-
return -109;
1459-
int i = 65536 + -Rasterizer3D.cosinetable[1024 * arg4 / arg1] >> 1;
1460-
return ((65536 + -i) * arg0 >> 16) + (arg2 * i >> 16);
1461-
}
1462-
1463-
private static int randomNoiseWeightedSum(int arg1, int arg2) {
1464-
int i = randomNoise(-1 + arg1, -1 + arg2) + randomNoise(1 + arg1, arg2 - 1) + randomNoise(-1 + arg1, 1 + arg2) + randomNoise(1 + arg1, arg2 + 1);
1465-
int i_126_ = randomNoise(arg1 - 1, arg2) + randomNoise(arg1 + 1, arg2) - (-randomNoise(arg1, arg2 - 1) + -randomNoise(arg1, 1 + arg2));
1466-
int i_127_ = randomNoise(arg1, arg2);
1467-
return i / 16 - (-(i_126_ / 8) - i_127_ / 4);
1468-
}
1469-
1470-
private static int perlinNoise(int x, int y, int scale) {
1471-
int muX = x & -1 + scale;
1472-
int scaledY = y / scale;
1473-
int muY = scale - 1 & y;
1474-
int scaledX = x / scale;
1475-
int a = randomNoiseWeightedSum(scaledX, scaledY);
1476-
int b = randomNoiseWeightedSum(1 + scaledX, scaledY);
1477-
int c = randomNoiseWeightedSum(scaledX, 1 + scaledY);
1478-
int d = randomNoiseWeightedSum(1 + scaledX, 1 + scaledY);
1479-
int i1 = interpolateForPerlin(a, scale, b, true, muX);
1480-
int i2 = interpolateForPerlin(c, scale, d, true, muX);
1481-
return interpolateForPerlin(i1, scale, i2, true, muY);
1482-
}
1483-
1484-
private static int randomNoise(int x, int y) {
1485-
int i = 57 * y + x;
1486-
i ^= i << 13;
1487-
int i_2_ = 1376312589 + (i * i * 15731 + 789221) * i & 0x7fffffff;
1488-
return i_2_ >> 19 & 0xff;
1489-
}
14901456
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.runejs.client.util;
2+
3+
import org.runejs.client.media.Rasterizer3D;
4+
5+
/**
6+
* Perlin noise, used in the client for procedural terrain heightmap.
7+
*/
8+
public class PerlinNoise {
9+
public static int get(int x, int y, int scale) {
10+
int muX = x & -1 + scale;
11+
int scaledY = y / scale;
12+
int muY = scale - 1 & y;
13+
int scaledX = x / scale;
14+
int a = randomNoiseWeightedSum(scaledX, scaledY);
15+
int b = randomNoiseWeightedSum(1 + scaledX, scaledY);
16+
int c = randomNoiseWeightedSum(scaledX, 1 + scaledY);
17+
int d = randomNoiseWeightedSum(1 + scaledX, 1 + scaledY);
18+
int i1 = interpolateForPerlin(a, scale, b, true, muX);
19+
int i2 = interpolateForPerlin(c, scale, d, true, muX);
20+
return interpolateForPerlin(i1, scale, i2, true, muY);
21+
}
22+
23+
private static int interpolateForPerlin(int arg0, int arg1, int arg2, boolean arg3, int arg4) {
24+
if (!arg3)
25+
return -109;
26+
int i = 65536 + -Rasterizer3D.cosinetable[1024 * arg4 / arg1] >> 1;
27+
return ((65536 + -i) * arg0 >> 16) + (arg2 * i >> 16);
28+
}
29+
30+
private static int randomNoiseWeightedSum(int arg1, int arg2) {
31+
int i = randomNoise(-1 + arg1, -1 + arg2) + randomNoise(1 + arg1, arg2 - 1) + randomNoise(-1 + arg1, 1 + arg2) + randomNoise(1 + arg1, arg2 + 1);
32+
int i_126_ = randomNoise(arg1 - 1, arg2) + randomNoise(arg1 + 1, arg2) - (-randomNoise(arg1, arg2 - 1) + -randomNoise(arg1, 1 + arg2));
33+
int i_127_ = randomNoise(arg1, arg2);
34+
return i / 16 - (-(i_126_ / 8) - i_127_ / 4);
35+
}
36+
37+
private static int randomNoise(int x, int y) {
38+
int i = 57 * y + x;
39+
i ^= i << 13;
40+
int i_2_ = 1376312589 + (i * i * 15731 + 789221) * i & 0x7fffffff;
41+
return i_2_ >> 19 & 0xff;
42+
}
43+
}

0 commit comments

Comments
 (0)