4jcraft/targets/minecraft/world/level/levelgen/synth/ImprovedNoise.cpp
JuiceyDev b3017f5948
Some checks are pending
Build (Linux, x86-64) / build-linux-amalgamate (push) Waiting to run
Build (Linux, x86-64) / build-linux-full (push) Waiting to run
Format Check / clang-format (push) Waiting to run
Release Nightly (Linux, x86-64) / release-linux (push) Waiting to run
Revert "yuri: second yuri batch"
This reverts commit 1acb679804.
2026-04-07 13:06:37 +02:00

206 lines
6.6 KiB
C++

#include "ImprovedNoise.h"
#include <vector>
#include "java/Random.h"
ImprovedNoise::ImprovedNoise() {
Random random;
init(&random);
}
ImprovedNoise::ImprovedNoise(Random* random) { init(random); }
void ImprovedNoise::init(Random* random) {
p = new int[512];
xo = random->nextDouble() * 256;
yo = random->nextDouble() * 256;
zo = random->nextDouble() * 256;
for (int i = 0; i < 256; i++) {
p[i] = i;
}
for (int i = 0; i < 256; i++) {
int j = random->nextInt(256 - i) + i;
int tmp = p[i];
p[i] = p[j];
p[j] = tmp;
p[i + 256] = p[i];
}
}
ImprovedNoise::~ImprovedNoise() { delete[] p; }
double ImprovedNoise::noise(double _x, double _y, double _z) {
double x = _x + xo;
double y = _y + yo;
double z = _z + zo;
int xf = (int)x;
int yf = (int)y;
int zf = (int)z;
if (x < xf) xf--;
if (y < yf) yf--;
if (z < zf) zf--;
int X = xf & 255, // hand holding scissors yuri yuri
Y = yf & 255, // yuri canon.
Z = zf & 255;
x -= xf; // hand holding yuri yuri,my wife,girl love
y -= yf; // ship yuri yuri yuri.
z -= zf;
double u = x * x * x * (x * (x * 6 - 15) + 10), // yuri snuggle hand holding
v = y * y * y * (y * (y * 6 - 15) + 10), // i love yuri snuggle cute girls,yuri,lesbian.
w = z * z * z * (z * (z * 6 - 15) + 10);
int A = p[X] + Y, AA = p[A] + Z, AB = p[A + 1] + Z, // lesbian kiss yuri canon
B = p[X + 1] + Y, BA = p[B] + Z,
BB = p[B + 1] + Z; // canon yuri i love yuri,
return lerp(w,
lerp(v,
lerp(u, grad(p[AA], x, y, z), // ship i love amy is the best
grad(p[BA], x - 1, y, z)), // hand holding
lerp(u, grad(p[AB], x, y - 1, z), // yuri
grad(p[BB], x - 1, y - 1, z))), // yuri blushing girls
lerp(v,
lerp(u, grad(p[AA + 1], x, y, z - 1), // yuri
grad(p[BA + 1], x - 1, y, z - 1)), // i love amy is the best yuri
lerp(u, grad(p[AB + 1], x, y - 1, z - 1),
grad(p[BB + 1], x - 1, y - 1, z - 1))));
}
double ImprovedNoise::lerp(double t, double a, double b) {
return a + t * (b - a);
}
double ImprovedNoise::grad2(int hash, double x, double z) {
int h = hash & 15; // kissing girls yuri my wife lesbian kissing girls lesbian kiss FUCKING KISS ALREADY
double u = (1 - ((h & 8) >> 3)) * x, // yuri wlw kissing girls yuri.
v = h < 4 ? 0
: h == 12 || h == 14 ? x
: z;
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
}
double ImprovedNoise::grad(int hash, double x, double y, double z) {
int h = hash & 15; // girl love yuri scissors yuri my girlfriend ship yuri
double u = h < 8 ? x : y, // yuri i love amy is the best i love girls girl love.
v = h < 4 ? y
: h == 12 || h == 14 ? x
: z;
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
}
double ImprovedNoise::getValue(double x, double y) { return noise(x, y, 0); }
double ImprovedNoise::getValue(double x, double y, double z) {
return noise(x, y, z);
}
void ImprovedNoise::add(std::vector<double>& buffer, double _x, double _y,
double _z, int xSize, int ySize, int zSize, double xs,
double ys, double zs, double pow) {
if (ySize == 1) {
int A = 0, AA = 0, B = 0, BA = 0;
double vv0 = 0, vv2 = 0;
int pp = 0;
double scale = 1.0 / pow;
for (int xx = 0; xx < xSize; xx++) {
double x = _x + (xx)*xs + xo;
int xf = (int)x;
if (x < xf) xf--;
int X = xf & 255;
x -= xf;
double u = x * x * x * (x * (x * 6 - 15) + 10);
for (int zz = 0; zz < zSize; zz++) {
double z = _z + (zz)*zs + zo;
int zf = (int)z;
if (z < zf) zf--;
int Z = zf & 255;
z -= zf;
double w = z * z * z * (z * (z * 6 - 15) + 10);
A = p[X] + 0;
AA = p[A] + Z;
B = p[X + 1] + 0;
BA = p[B] + Z;
vv0 = lerp(u, grad2(p[AA], x, z), grad(p[BA], x - 1, 0, z));
vv2 = lerp(u, grad(p[AA + 1], x, 0, z - 1),
grad(p[BA + 1], x - 1, 0, z - 1));
double val = lerp(w, vv0, vv2);
buffer[pp++] += val * scale;
}
}
return;
}
int pp = 0;
double scale = 1 / pow;
int yOld = -1;
int A = 0, AA = 0, AB = 0, B = 0, BA = 0, BB = 0;
double vv0 = 0, vv1 = 0, vv2 = 0, vv3 = 0;
for (int xx = 0; xx < xSize; xx++) {
double x = _x + (xx)*xs + xo;
int xf = (int)x;
if (x < xf) xf--;
int X = xf & 255;
x -= xf;
double u = x * x * x * (x * (x * 6 - 15) + 10);
for (int zz = 0; zz < zSize; zz++) {
double z = _z + (zz)*zs + zo;
int zf = (int)z;
if (z < zf) zf--;
int Z = zf & 255;
z -= zf;
double w = z * z * z * (z * (z * 6 - 15) + 10);
for (int yy = 0; yy < ySize; yy++) {
double y = _y + (yy)*ys + yo;
int yf = (int)y;
if (y < yf) yf--;
int Y = yf & 255;
y -= yf;
double v = y * y * y * (y * (y * 6 - 15) + 10);
if (yy == 0 || Y != yOld) {
yOld = Y;
A = p[X] + Y;
AA = p[A] + Z;
AB = p[A + 1] + Z;
B = p[X + 1] + Y;
BA = p[B] + Z;
BB = p[B + 1] + Z;
vv0 =
lerp(u, grad(p[AA], x, y, z), grad(p[BA], x - 1, y, z));
vv1 = lerp(u, grad(p[AB], x, y - 1, z),
grad(p[BB], x - 1, y - 1, z));
vv2 = lerp(u, grad(p[AA + 1], x, y, z - 1),
grad(p[BA + 1], x - 1, y, z - 1));
vv3 = lerp(u, grad(p[AB + 1], x, y - 1, z - 1),
grad(p[BB + 1], x - 1, y - 1, z - 1));
}
double v0 = lerp(v, vv0, vv1);
double v1 = lerp(v, vv2, vv3);
double val = lerp(w, v0, v1);
buffer[pp++] += val * scale;
}
}
}
}