Skip to content

Commit

Permalink
feat: поддержка различных шумов(not tested)
Browse files Browse the repository at this point in the history
  • Loading branch information
Reider745 committed Oct 23, 2024
1 parent 8edda88 commit 7ac52da
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 43 deletions.
4 changes: 2 additions & 2 deletions src/main/java/com/reider745/world/GenerationUtilsMethods.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import cn.nukkit.math.NukkitRandom;
import cn.nukkit.math.Vector3;
import com.reider745.api.CallbackHelper;
import com.reider745.world.dimensions.Noise;
import com.reider745.world.dimensions.NoiseOctaveMethods;
import com.zhekasmirnov.apparatus.mcpe.NativeBlockSource;
import java.util.ArrayList;

Expand Down Expand Up @@ -123,7 +123,7 @@ public static float nativeGetPerlinNoise(float x, float y, float z, int seed, fl
float result = 0;
float mul = 2 * ((1 << numOctaves) - 1) / (float) (1 << numOctaves);
for (int i = 0; i < numOctaves; i++) {
result += Noise.noise_value(null, x * scale, y * scale, z * scale, seed) / mul;
result += NoiseOctaveMethods.NoiseOctaveDescription.base_noise_value(null, x * scale, y * scale, z * scale, seed) / mul;
mul *= 2;
scale *= 2;
}
Expand Down
45 changes: 4 additions & 41 deletions src/main/java/com/reider745/world/dimensions/Noise.java
Original file line number Diff line number Diff line change
Expand Up @@ -119,55 +119,18 @@ public static class Data {

public void prepare_noise_data(int seed){
this.seed = seed;
/*
int* permutations = noise_data.permutations;

/*int* permutations = noise_data.permutations;
memset(permutations, -1, sizeof(int) * noise_permutations_size);
for (int i = 0; i < noise_permutations_size; i++) {
int index = rand() % noise_permutations_size;
if (permutations[index] != -1) {
permutations[i] = permutations[index];
}
permutations[index] = i;
}
*/
}*/
}
}
private static final float VALUE = 2147483648f * 2f;
private static float fast_val_3d(int x, int y, int z, int seed) {
int n = seed;
n ^= 1619 * x;
n ^= 31337 * y;
n ^= 6971 * z;
return Math.abs(((n * n * n * 60493f) % VALUE) / VALUE);
}
public static float noise_value(Noise.Data noise_data, float x, float y, float z, int seed) {
final int X = (int) Math.floor(x); //x > 0 ? (int) x : (int) x - 1;
final int Y = (int) Math.floor(y); //y > 0 ? (int) y : (int) y - 1;
final int Z = (int) Math.floor(z); //z > 0 ? (int) z : (int) z - 1;
x -= X;
y -= Y;
z -= Z;
final float u = x * x * x * (x * (x * 6f - 15) + 10);
final float v = y * y * y * (y * (y * 6f - 15) + 10);
final float w = z * z * z * (z * (z * 6f - 15) + 10);

final float p000 = fast_val_3d(X, Y, Z, seed);
final float p001 = fast_val_3d(X, Y, Z + 1, seed);
final float p100 = fast_val_3d(X + 1, Y, Z, seed);
final float p101 = fast_val_3d(X + 1, Y, Z + 1, seed);
final float p010 = fast_val_3d(X, Y + 1, Z, seed);
final float p011 = fast_val_3d(X, Y + 1, Z + 1, seed);
final float p110 = fast_val_3d(X + 1, Y + 1, Z, seed);
final float p111 = fast_val_3d(X + 1, Y + 1, Z + 1, seed);
final float _u = 1 - u;
final float p00 = p000 * _u + p100 * u;
final float p10 = p010 * _u + p110 * u;
final float p01 = p001 * _u + p101 * u;
final float p11 = p011 * _u + p111 * u;
final float p0 = p00 * (1 - v) + p10 * v;
final float p1 = p01 * (1 - v) + p11 * v;
return p0 * (1 - w) + p1 * w;
}

public static void generate_noise_buffer(NoiseGeneratorMethods.NoiseGeneratorDescription generator, Data data, Buffer bufferRef){
generate_noise_buffer(generator, data, bufferRef, bufferRef.offsetX, bufferRef.offsetY, bufferRef.offsetZ);
Expand Down Expand Up @@ -203,7 +166,7 @@ public static void generate_noise_buffer(NoiseGeneratorMethods.NoiseGeneratorDes
for (int z = 0; z < sizeZ; z++) {
yf = yf0;
for (int y = 0; y < sizeY; y++) {
final float value = noise_value(data, xf, yf, zf, seed) * octave.weight;
final float value = octave.noise_value(data, xf, yf, zf, seed) * octave.weight;
if (octave.conversion != null) {
bufferRef.tmp_buffer[index++] += octave.conversion.convert(value);
} else {
Expand Down
101 changes: 101 additions & 0 deletions src/main/java/com/reider745/world/dimensions/NoiseOctaveMethods.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,109 @@ public static class NoiseOctaveDescription {
public int seed;
public NoiseConversionMethods.NoiseConversionDescription conversion;

interface INoise {
float apply(Noise.Data noise_data, float x, float y, float z, int seed);
}

private final INoise noise;

public NoiseOctaveDescription(int type){
this.type = type;

switch (type){
case 0 -> noise = NoiseOctaveDescription::base_noise_value;
case 1 -> noise = NoiseOctaveDescription::gray_noise_value;
case 2 -> noise = NoiseOctaveDescription::chess_noise_value;
case 10 -> noise = NoiseOctaveDescription::sine_noise_x;
case 11 -> noise = NoiseOctaveDescription::sine_noise_y;
case 12 -> noise = NoiseOctaveDescription::sine_noise_z;
case 13 -> noise = NoiseOctaveDescription::sine_noise_xy;
case 14 -> noise = NoiseOctaveDescription::sine_noise_yz;
case 15 -> noise = NoiseOctaveDescription::sine_noise_xz;
case 16 -> noise = NoiseOctaveDescription::sine_noise_xyz;
default -> noise = NoiseOctaveDescription::base_noise_value;
}
}

private static final float VALUE = 2147483648f * 2f;
private static float fast_val_3d(int x, int y, int z, int seed) {
int n = seed;
n ^= 1619 * x;
n ^= 31337 * y;
n ^= 6971 * z;
return Math.abs(((n * n * n * 60493f) % VALUE) / VALUE);
}

public float noise_value(Noise.Data noise_data, float x, float y, float z, int seed){
return noise.apply(noise_data, x, y, z, seed);
}

public static float gray_noise_value(Noise.Data noise_data, float x, float y, float z, int seed) {
return fast_val_3d((int) (x * 10), (int) (y * 10), (int) (z * 10), seed);
}

public static float chess_noise_value(Noise.Data noise_data, float x, float y, float z, int seed) {
int X = (int) Math.floor(x);
int Y = (int) Math.floor(y);
int Z = (int) Math.floor(z);
return (X & 1) ^ (Y & 1) ^ (Z & 1);
}

public static float sine_noise_x(Noise.Data noise_data, float x, float y, float z, int seed) {
return (float) Math.sin(x);
}

public static float sine_noise_y(Noise.Data noise_data, float x, float y, float z, int seed) {
return (float) Math.sin(y);
}

public static float sine_noise_z(Noise.Data noise_data, float x, float y, float z, int seed) {
return (float) Math.sin(z);
}

public static float sine_noise_xy(Noise.Data noise_data, float x, float y, float z, int seed) {
return ((float) (Math.sin(x) * Math.sin(y)));
}

public static float sine_noise_xz(Noise.Data noise_data, float x, float y, float z, int seed) {
return ((float) (Math.sin(x) * Math.sin(z)));
}

public static float sine_noise_yz(Noise.Data noise_data, float x, float y, float z, int seed) {
return ((float) (Math.sin(y) * Math.sin(z)));
}

public static float sine_noise_xyz(Noise.Data noise_data, float x, float y, float z, int seed) {
return ((float) (Math.sin(x) * Math.sin(y) * Math.sin(z)));
}

public static float base_noise_value(Noise.Data noise_data, float x, float y, float z, int seed) {
final int X = (int) Math.floor(x);
final int Y = (int) Math.floor(y);
final int Z = (int) Math.floor(z);
x -= X;
y -= Y;
z -= Z;
final float u = x * x * x * (x * (x * 6f - 15) + 10);
final float v = y * y * y * (y * (y * 6f - 15) + 10);
final float w = z * z * z * (z * (z * 6f - 15) + 10);

final float p000 = fast_val_3d(X, Y, Z, seed);
final float p001 = fast_val_3d(X, Y, Z + 1, seed);
final float p100 = fast_val_3d(X + 1, Y, Z, seed);
final float p101 = fast_val_3d(X + 1, Y, Z + 1, seed);
final float p010 = fast_val_3d(X, Y + 1, Z, seed);
final float p011 = fast_val_3d(X, Y + 1, Z + 1, seed);
final float p110 = fast_val_3d(X + 1, Y + 1, Z, seed);
final float p111 = fast_val_3d(X + 1, Y + 1, Z + 1, seed);
final float _u = 1 - u;
final float p00 = p000 * _u + p100 * u;
final float p10 = p010 * _u + p110 * u;
final float p01 = p001 * _u + p101 * u;
final float p11 = p011 * _u + p111 * u;
final float p0 = p00 * (1 - v) + p10 * v;
final float p1 = p01 * (1 - v) + p11 * v;
return p0 * (1 - w) + p1 * w;
}
}

Expand Down

0 comments on commit 7ac52da

Please sign in to comment.