minecraft-src/net/minecraft/util/CubicSampler.java
2025-07-04 01:41:11 +03:00

48 lines
1.3 KiB
Java

package net.minecraft.util;
import net.minecraft.world.phys.Vec3;
public class CubicSampler {
private static final int GAUSSIAN_SAMPLE_RADIUS = 2;
private static final int GAUSSIAN_SAMPLE_BREADTH = 6;
private static final double[] GAUSSIAN_SAMPLE_KERNEL = new double[]{0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 0.0};
private CubicSampler() {
}
public static Vec3 gaussianSampleVec3(Vec3 vec, CubicSampler.Vec3Fetcher fetcher) {
int i = Mth.floor(vec.x());
int j = Mth.floor(vec.y());
int k = Mth.floor(vec.z());
double d = vec.x() - i;
double e = vec.y() - j;
double f = vec.z() - k;
double g = 0.0;
Vec3 vec3 = Vec3.ZERO;
for (int l = 0; l < 6; l++) {
double h = Mth.lerp(d, GAUSSIAN_SAMPLE_KERNEL[l + 1], GAUSSIAN_SAMPLE_KERNEL[l]);
int m = i - 2 + l;
for (int n = 0; n < 6; n++) {
double o = Mth.lerp(e, GAUSSIAN_SAMPLE_KERNEL[n + 1], GAUSSIAN_SAMPLE_KERNEL[n]);
int p = j - 2 + n;
for (int q = 0; q < 6; q++) {
double r = Mth.lerp(f, GAUSSIAN_SAMPLE_KERNEL[q + 1], GAUSSIAN_SAMPLE_KERNEL[q]);
int s = k - 2 + q;
double t = h * o * r;
g += t;
vec3 = vec3.add(fetcher.fetch(m, p, s).scale(t));
}
}
}
return vec3.scale(1.0 / g);
}
@FunctionalInterface
public interface Vec3Fetcher {
Vec3 fetch(int i, int j, int k);
}
}