48 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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);
 | |
| 	}
 | |
| }
 |