package net.minecraft.util; import java.util.Locale; import java.util.UUID; import java.util.function.IntPredicate; import java.util.stream.IntStream; import net.minecraft.Util; import net.minecraft.core.Vec3i; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.apache.commons.lang3.math.Fraction; import org.apache.commons.lang3.math.NumberUtils; import org.joml.Quaternionf; import org.joml.Vector3f; public class Mth { private static final long UUID_VERSION = 61440L; private static final long UUID_VERSION_TYPE_4 = 16384L; private static final long UUID_VARIANT = -4611686018427387904L; private static final long UUID_VARIANT_2 = Long.MIN_VALUE; public static final float PI = (float) Math.PI; public static final float HALF_PI = (float) (Math.PI / 2); public static final float TWO_PI = (float) (Math.PI * 2); public static final float DEG_TO_RAD = (float) (Math.PI / 180.0); public static final float RAD_TO_DEG = 180.0F / (float)Math.PI; public static final float EPSILON = 1.0E-5F; public static final float SQRT_OF_TWO = sqrt(2.0F); private static final float SIN_SCALE = 10430.378F; public static final Vector3f Y_AXIS = new Vector3f(0.0F, 1.0F, 0.0F); public static final Vector3f X_AXIS = new Vector3f(1.0F, 0.0F, 0.0F); public static final Vector3f Z_AXIS = new Vector3f(0.0F, 0.0F, 1.0F); private static final float[] SIN = Util.make(new float[65536], p_14077_ -> { for (int i = 0; i < p_14077_.length; i++) { p_14077_[i] = (float)Math.sin(i * Math.PI * 2.0 / 65536.0); } }); private static final RandomSource RANDOM = RandomSource.createThreadSafe(); private static final int[] MULTIPLY_DE_BRUIJN_BIT_POSITION = new int[]{ 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 }; private static final double ONE_SIXTH = 0.16666666666666666; private static final int FRAC_EXP = 8; private static final int LUT_SIZE = 257; private static final double FRAC_BIAS = Double.longBitsToDouble(4805340802404319232L); private static final double[] ASIN_TAB = new double[257]; private static final double[] COS_TAB = new double[257]; public static float sin(float p_14032_) { return SIN[(int)(p_14032_ * 10430.378F) & 65535]; } public static float cos(float p_14090_) { return SIN[(int)(p_14090_ * 10430.378F + 16384.0F) & 65535]; } public static float sqrt(float p_14117_) { return (float)Math.sqrt(p_14117_); } public static int floor(float p_14144_) { int i = (int)p_14144_; return p_14144_ < i ? i - 1 : i; } public static int floor(double p_14108_) { int i = (int)p_14108_; return p_14108_ < i ? i - 1 : i; } public static long lfloor(double p_14135_) { long i = (long)p_14135_; return p_14135_ < i ? i - 1L : i; } public static float abs(float p_14155_) { return Math.abs(p_14155_); } public static int abs(int p_14041_) { return Math.abs(p_14041_); } public static int ceil(float p_14168_) { int i = (int)p_14168_; return p_14168_ > i ? i + 1 : i; } public static int ceil(double p_14166_) { int i = (int)p_14166_; return p_14166_ > i ? i + 1 : i; } public static int clamp(int p_14046_, int p_14047_, int p_14048_) { return Math.min(Math.max(p_14046_, p_14047_), p_14048_); } public static long clamp(long p_300696_, long p_298059_, long p_299237_) { return Math.min(Math.max(p_300696_, p_298059_), p_299237_); } public static float clamp(float p_14037_, float p_14038_, float p_14039_) { return p_14037_ < p_14038_ ? p_14038_ : Math.min(p_14037_, p_14039_); } public static double clamp(double p_14009_, double p_14010_, double p_14011_) { return p_14009_ < p_14010_ ? p_14010_ : Math.min(p_14009_, p_14011_); } public static double clampedLerp(double p_14086_, double p_14087_, double p_14088_) { if (p_14088_ < 0.0) { return p_14086_; } else { return p_14088_ > 1.0 ? p_14087_ : lerp(p_14088_, p_14086_, p_14087_); } } public static float clampedLerp(float p_144921_, float p_144922_, float p_144923_) { if (p_144923_ < 0.0F) { return p_144921_; } else { return p_144923_ > 1.0F ? p_144922_ : lerp(p_144923_, p_144921_, p_144922_); } } public static double absMax(double p_14006_, double p_14007_) { if (p_14006_ < 0.0) { p_14006_ = -p_14006_; } if (p_14007_ < 0.0) { p_14007_ = -p_14007_; } return Math.max(p_14006_, p_14007_); } public static int floorDiv(int p_14043_, int p_14044_) { return Math.floorDiv(p_14043_, p_14044_); } public static int nextInt(RandomSource p_216272_, int p_216273_, int p_216274_) { return p_216273_ >= p_216274_ ? p_216273_ : p_216272_.nextInt(p_216274_ - p_216273_ + 1) + p_216273_; } public static float nextFloat(RandomSource p_216268_, float p_216269_, float p_216270_) { return p_216269_ >= p_216270_ ? p_216269_ : p_216268_.nextFloat() * (p_216270_ - p_216269_) + p_216269_; } public static double nextDouble(RandomSource p_216264_, double p_216265_, double p_216266_) { return p_216265_ >= p_216266_ ? p_216265_ : p_216264_.nextDouble() * (p_216266_ - p_216265_) + p_216265_; } public static boolean equal(float p_14034_, float p_14035_) { return Math.abs(p_14035_ - p_14034_) < 1.0E-5F; } public static boolean equal(double p_14083_, double p_14084_) { return Math.abs(p_14084_ - p_14083_) < 1.0E-5F; } public static int positiveModulo(int p_14101_, int p_14102_) { return Math.floorMod(p_14101_, p_14102_); } public static float positiveModulo(float p_14092_, float p_14093_) { return (p_14092_ % p_14093_ + p_14093_) % p_14093_; } public static double positiveModulo(double p_14110_, double p_14111_) { return (p_14110_ % p_14111_ + p_14111_) % p_14111_; } public static boolean isMultipleOf(int p_265754_, int p_265543_) { return p_265754_ % p_265543_ == 0; } public static byte packDegrees(float p_362809_) { return (byte)floor(p_362809_ * 256.0F / 360.0F); } public static float unpackDegrees(byte p_363805_) { return p_363805_ * 360 / 256.0F; } public static int wrapDegrees(int p_14099_) { int i = p_14099_ % 360; if (i >= 180) { i -= 360; } if (i < -180) { i += 360; } return i; } public static float wrapDegrees(long p_367823_) { float f = (float)(p_367823_ % 360L); if (f >= 180.0F) { f -= 360.0F; } if (f < -180.0F) { f += 360.0F; } return f; } public static float wrapDegrees(float p_14178_) { float f = p_14178_ % 360.0F; if (f >= 180.0F) { f -= 360.0F; } if (f < -180.0F) { f += 360.0F; } return f; } public static double wrapDegrees(double p_14176_) { double d0 = p_14176_ % 360.0; if (d0 >= 180.0) { d0 -= 360.0; } if (d0 < -180.0) { d0 += 360.0; } return d0; } public static float degreesDifference(float p_14119_, float p_14120_) { return wrapDegrees(p_14120_ - p_14119_); } public static float degreesDifferenceAbs(float p_14146_, float p_14147_) { return abs(degreesDifference(p_14146_, p_14147_)); } public static float rotateIfNecessary(float p_14095_, float p_14096_, float p_14097_) { float f = degreesDifference(p_14095_, p_14096_); float f1 = clamp(f, -p_14097_, p_14097_); return p_14096_ - f1; } public static float approach(float p_14122_, float p_14123_, float p_14124_) { p_14124_ = abs(p_14124_); return p_14122_ < p_14123_ ? clamp(p_14122_ + p_14124_, p_14122_, p_14123_) : clamp(p_14122_ - p_14124_, p_14123_, p_14122_); } public static float approachDegrees(float p_14149_, float p_14150_, float p_14151_) { float f = degreesDifference(p_14149_, p_14150_); return approach(p_14149_, p_14149_ + f, p_14151_); } public static int getInt(String p_14060_, int p_14061_) { return NumberUtils.toInt(p_14060_, p_14061_); } public static int smallestEncompassingPowerOfTwo(int p_14126_) { int i = p_14126_ - 1; i |= i >> 1; i |= i >> 2; i |= i >> 4; i |= i >> 8; i |= i >> 16; return i + 1; } public static boolean isPowerOfTwo(int p_14153_) { return p_14153_ != 0 && (p_14153_ & p_14153_ - 1) == 0; } public static int ceillog2(int p_14164_) { p_14164_ = isPowerOfTwo(p_14164_) ? p_14164_ : smallestEncompassingPowerOfTwo(p_14164_); return MULTIPLY_DE_BRUIJN_BIT_POSITION[(int)(p_14164_ * 125613361L >> 27) & 31]; } public static int log2(int p_14174_) { return ceillog2(p_14174_) - (isPowerOfTwo(p_14174_) ? 0 : 1); } public static float frac(float p_14188_) { return p_14188_ - floor(p_14188_); } public static double frac(double p_14186_) { return p_14186_ - lfloor(p_14186_); } @Deprecated public static long getSeed(Vec3i p_14058_) { return getSeed(p_14058_.getX(), p_14058_.getY(), p_14058_.getZ()); } @Deprecated public static long getSeed(int p_14131_, int p_14132_, int p_14133_) { long i = p_14131_ * 3129871 ^ p_14133_ * 116129781L ^ p_14132_; i = i * i * 42317861L + i * 11L; return i >> 16; } public static UUID createInsecureUUID(RandomSource p_216262_) { long i = p_216262_.nextLong() & -61441L | 16384L; long j = p_216262_.nextLong() & 4611686018427387903L | Long.MIN_VALUE; return new UUID(i, j); } public static UUID createInsecureUUID() { return createInsecureUUID(RANDOM); } public static double inverseLerp(double p_14113_, double p_14114_, double p_14115_) { return (p_14113_ - p_14114_) / (p_14115_ - p_14114_); } public static float inverseLerp(float p_184656_, float p_184657_, float p_184658_) { return (p_184656_ - p_184657_) / (p_184658_ - p_184657_); } public static boolean rayIntersectsAABB(Vec3 p_144889_, Vec3 p_144890_, AABB p_144891_) { double d0 = (p_144891_.minX + p_144891_.maxX) * 0.5; double d1 = (p_144891_.maxX - p_144891_.minX) * 0.5; double d2 = p_144889_.x - d0; if (Math.abs(d2) > d1 && d2 * p_144890_.x >= 0.0) { return false; } else { double d3 = (p_144891_.minY + p_144891_.maxY) * 0.5; double d4 = (p_144891_.maxY - p_144891_.minY) * 0.5; double d5 = p_144889_.y - d3; if (Math.abs(d5) > d4 && d5 * p_144890_.y >= 0.0) { return false; } else { double d6 = (p_144891_.minZ + p_144891_.maxZ) * 0.5; double d7 = (p_144891_.maxZ - p_144891_.minZ) * 0.5; double d8 = p_144889_.z - d6; if (Math.abs(d8) > d7 && d8 * p_144890_.z >= 0.0) { return false; } else { double d9 = Math.abs(p_144890_.x); double d10 = Math.abs(p_144890_.y); double d11 = Math.abs(p_144890_.z); double d12 = p_144890_.y * d8 - p_144890_.z * d5; if (Math.abs(d12) > d4 * d11 + d7 * d10) { return false; } else { d12 = p_144890_.z * d2 - p_144890_.x * d8; if (Math.abs(d12) > d1 * d11 + d7 * d9) { return false; } else { d12 = p_144890_.x * d5 - p_144890_.y * d2; return Math.abs(d12) < d1 * d10 + d4 * d9; } } } } } } public static double atan2(double p_14137_, double p_14138_) { double d0 = p_14138_ * p_14138_ + p_14137_ * p_14137_; if (Double.isNaN(d0)) { return Double.NaN; } else { boolean flag = p_14137_ < 0.0; if (flag) { p_14137_ = -p_14137_; } boolean flag1 = p_14138_ < 0.0; if (flag1) { p_14138_ = -p_14138_; } boolean flag2 = p_14137_ > p_14138_; if (flag2) { double d1 = p_14138_; p_14138_ = p_14137_; p_14137_ = d1; } double d9 = fastInvSqrt(d0); p_14138_ *= d9; p_14137_ *= d9; double d2 = FRAC_BIAS + p_14137_; int i = (int)Double.doubleToRawLongBits(d2); double d3 = ASIN_TAB[i]; double d4 = COS_TAB[i]; double d5 = d2 - FRAC_BIAS; double d6 = p_14137_ * d4 - p_14138_ * d5; double d7 = (6.0 + d6 * d6) * d6 * 0.16666666666666666; double d8 = d3 + d7; if (flag2) { d8 = (Math.PI / 2) - d8; } if (flag1) { d8 = Math.PI - d8; } if (flag) { d8 = -d8; } return d8; } } public static float invSqrt(float p_265060_) { return org.joml.Math.invsqrt(p_265060_); } public static double invSqrt(double p_265088_) { return org.joml.Math.invsqrt(p_265088_); } @Deprecated public static double fastInvSqrt(double p_14194_) { double d0 = 0.5 * p_14194_; long i = Double.doubleToRawLongBits(p_14194_); i = 6910469410427058090L - (i >> 1); p_14194_ = Double.longBitsToDouble(i); return p_14194_ * (1.5 - d0 * p_14194_ * p_14194_); } public static float fastInvCubeRoot(float p_14200_) { int i = Float.floatToIntBits(p_14200_); i = 1419967116 - i / 3; float f = Float.intBitsToFloat(i); f = 0.6666667F * f + 1.0F / (3.0F * f * f * p_14200_); return 0.6666667F * f + 1.0F / (3.0F * f * f * p_14200_); } public static int hsvToRgb(float p_14170_, float p_14171_, float p_14172_) { return hsvToArgb(p_14170_, p_14171_, p_14172_, 0); } public static int hsvToArgb(float p_343715_, float p_343707_, float p_342108_, int p_343055_) { int i = (int)(p_343715_ * 6.0F) % 6; float f = p_343715_ * 6.0F - i; float f1 = p_342108_ * (1.0F - p_343707_); float f2 = p_342108_ * (1.0F - f * p_343707_); float f3 = p_342108_ * (1.0F - (1.0F - f) * p_343707_); float f4; float f5; float f6; switch (i) { case 0: f4 = p_342108_; f5 = f3; f6 = f1; break; case 1: f4 = f2; f5 = p_342108_; f6 = f1; break; case 2: f4 = f1; f5 = p_342108_; f6 = f3; break; case 3: f4 = f1; f5 = f2; f6 = p_342108_; break; case 4: f4 = f3; f5 = f1; f6 = p_342108_; break; case 5: f4 = p_342108_; f5 = f1; f6 = f2; break; default: throw new RuntimeException("Something went wrong when converting from HSV to RGB. Input was " + p_343715_ + ", " + p_343707_ + ", " + p_342108_); } return ARGB.color(p_343055_, clamp((int)(f4 * 255.0F), 0, 255), clamp((int)(f5 * 255.0F), 0, 255), clamp((int)(f6 * 255.0F), 0, 255)); } public static int murmurHash3Mixer(int p_14184_) { p_14184_ ^= p_14184_ >>> 16; p_14184_ *= -2048144789; p_14184_ ^= p_14184_ >>> 13; p_14184_ *= -1028477387; return p_14184_ ^ p_14184_ >>> 16; } public static int binarySearch(int p_14050_, int p_14051_, IntPredicate p_14052_) { int i = p_14051_ - p_14050_; while (i > 0) { int j = i / 2; int k = p_14050_ + j; if (p_14052_.test(k)) { i = j; } else { p_14050_ = k + 1; i -= j + 1; } } return p_14050_; } public static int lerpInt(float p_270245_, int p_270597_, int p_270301_) { return p_270597_ + floor(p_270245_ * (p_270301_ - p_270597_)); } public static int lerpDiscrete(float p_298397_, int p_298459_, int p_300125_) { int i = p_300125_ - p_298459_; return p_298459_ + floor(p_298397_ * (i - 1)) + (p_298397_ > 0.0F ? 1 : 0); } public static float lerp(float p_14180_, float p_14181_, float p_14182_) { return p_14181_ + p_14180_ * (p_14182_ - p_14181_); } public static Vec3 lerp(double p_364482_, Vec3 p_369943_, Vec3 p_369682_) { return new Vec3( lerp(p_364482_, p_369943_.x, p_369682_.x), lerp(p_364482_, p_369943_.y, p_369682_.y), lerp(p_364482_, p_369943_.z, p_369682_.z) ); } public static double lerp(double p_14140_, double p_14141_, double p_14142_) { return p_14141_ + p_14140_ * (p_14142_ - p_14141_); } public static double lerp2(double p_14013_, double p_14014_, double p_14015_, double p_14016_, double p_14017_, double p_14018_) { return lerp(p_14014_, lerp(p_14013_, p_14015_, p_14016_), lerp(p_14013_, p_14017_, p_14018_)); } public static double lerp3( double p_14020_, double p_14021_, double p_14022_, double p_14023_, double p_14024_, double p_14025_, double p_14026_, double p_14027_, double p_14028_, double p_14029_, double p_14030_ ) { return lerp( p_14022_, lerp2(p_14020_, p_14021_, p_14023_, p_14024_, p_14025_, p_14026_), lerp2(p_14020_, p_14021_, p_14027_, p_14028_, p_14029_, p_14030_) ); } public static float catmullrom(float p_216245_, float p_216246_, float p_216247_, float p_216248_, float p_216249_) { return 0.5F * ( 2.0F * p_216247_ + (p_216248_ - p_216246_) * p_216245_ + (2.0F * p_216246_ - 5.0F * p_216247_ + 4.0F * p_216248_ - p_216249_) * p_216245_ * p_216245_ + (3.0F * p_216247_ - p_216246_ - 3.0F * p_216248_ + p_216249_) * p_216245_ * p_216245_ * p_216245_ ); } public static double smoothstep(double p_14198_) { return p_14198_ * p_14198_ * p_14198_ * (p_14198_ * (p_14198_ * 6.0 - 15.0) + 10.0); } public static double smoothstepDerivative(double p_144947_) { return 30.0 * p_144947_ * p_144947_ * (p_144947_ - 1.0) * (p_144947_ - 1.0); } public static int sign(double p_14206_) { if (p_14206_ == 0.0) { return 0; } else { return p_14206_ > 0.0 ? 1 : -1; } } public static float rotLerp(float p_14190_, float p_14191_, float p_14192_) { return p_14191_ + p_14190_ * wrapDegrees(p_14192_ - p_14191_); } public static double rotLerp(double p_299352_, double p_301019_, double p_299027_) { return p_301019_ + p_299352_ * wrapDegrees(p_299027_ - p_301019_); } public static float rotLerpRad(float p_368518_, float p_366477_, float p_363810_) { float f = p_363810_ - p_366477_; while (f < (float) -Math.PI) { f += (float) (Math.PI * 2); } while (f >= (float) Math.PI) { f -= (float) (Math.PI * 2); } return p_366477_ + p_368518_ * f; } public static float triangleWave(float p_14157_, float p_14158_) { return (Math.abs(p_14157_ % p_14158_ - p_14158_ * 0.5F) - p_14158_ * 0.25F) / (p_14158_ * 0.25F); } public static float square(float p_14208_) { return p_14208_ * p_14208_; } public static double square(double p_144953_) { return p_144953_ * p_144953_; } public static int square(int p_144945_) { return p_144945_ * p_144945_; } public static long square(long p_184644_) { return p_184644_ * p_184644_; } public static double clampedMap(double p_144852_, double p_144853_, double p_144854_, double p_144855_, double p_144856_) { return clampedLerp(p_144855_, p_144856_, inverseLerp(p_144852_, p_144853_, p_144854_)); } public static float clampedMap(float p_184632_, float p_184633_, float p_184634_, float p_184635_, float p_184636_) { return clampedLerp(p_184635_, p_184636_, inverseLerp(p_184632_, p_184633_, p_184634_)); } public static double map(double p_144915_, double p_144916_, double p_144917_, double p_144918_, double p_144919_) { return lerp(inverseLerp(p_144915_, p_144916_, p_144917_), p_144918_, p_144919_); } public static float map(float p_184638_, float p_184639_, float p_184640_, float p_184641_, float p_184642_) { return lerp(inverseLerp(p_184638_, p_184639_, p_184640_), p_184641_, p_184642_); } public static double wobble(double p_144955_) { return p_144955_ + (2.0 * RandomSource.create(floor(p_144955_ * 3000.0)).nextDouble() - 1.0) * 1.0E-7 / 2.0; } public static int roundToward(int p_144942_, int p_144943_) { return positiveCeilDiv(p_144942_, p_144943_) * p_144943_; } public static int positiveCeilDiv(int p_184653_, int p_184654_) { return -Math.floorDiv(-p_184653_, p_184654_); } public static int randomBetweenInclusive(RandomSource p_216288_, int p_216289_, int p_216290_) { return p_216288_.nextInt(p_216290_ - p_216289_ + 1) + p_216289_; } public static float randomBetween(RandomSource p_216284_, float p_216285_, float p_216286_) { return p_216284_.nextFloat() * (p_216286_ - p_216285_) + p_216285_; } public static float normal(RandomSource p_216292_, float p_216293_, float p_216294_) { return p_216293_ + (float)p_216292_.nextGaussian() * p_216294_; } public static double lengthSquared(double p_211590_, double p_211591_) { return p_211590_ * p_211590_ + p_211591_ * p_211591_; } public static double length(double p_184646_, double p_184647_) { return Math.sqrt(lengthSquared(p_184646_, p_184647_)); } public static float length(float p_366616_, float p_361952_) { return (float)Math.sqrt(lengthSquared(p_366616_, p_361952_)); } public static double lengthSquared(double p_211593_, double p_211594_, double p_211595_) { return p_211593_ * p_211593_ + p_211594_ * p_211594_ + p_211595_ * p_211595_; } public static double length(double p_184649_, double p_184650_, double p_184651_) { return Math.sqrt(lengthSquared(p_184649_, p_184650_, p_184651_)); } public static float lengthSquared(float p_343908_, float p_343799_, float p_344922_) { return p_343908_ * p_343908_ + p_343799_ * p_343799_ + p_344922_ * p_344922_; } public static int quantize(double p_184629_, int p_184630_) { return floor(p_184629_ / p_184630_) * p_184630_; } public static IntStream outFromOrigin(int p_216296_, int p_216297_, int p_216298_) { return outFromOrigin(p_216296_, p_216297_, p_216298_, 1); } public static IntStream outFromOrigin(int p_216251_, int p_216252_, int p_216253_, int p_216254_) { if (p_216252_ > p_216253_) { throw new IllegalArgumentException(String.format(Locale.ROOT, "upperbound %d expected to be > lowerBound %d", p_216253_, p_216252_)); } else if (p_216254_ < 1) { throw new IllegalArgumentException(String.format(Locale.ROOT, "steps expected to be >= 1, was %d", p_216254_)); } else { return p_216251_ >= p_216252_ && p_216251_ <= p_216253_ ? IntStream.iterate(p_216251_, p_216282_ -> { int i = Math.abs(p_216251_ - p_216282_); return p_216251_ - i >= p_216252_ || p_216251_ + i <= p_216253_; }, p_216260_ -> { boolean flag = p_216260_ <= p_216251_; int i = Math.abs(p_216251_ - p_216260_); boolean flag1 = p_216251_ + i + p_216254_ <= p_216253_; if (!flag || !flag1) { int j = p_216251_ - i - (flag ? p_216254_ : 0); if (j >= p_216252_) { return j; } } return p_216251_ + i + p_216254_; }) : IntStream.empty(); } } public static Quaternionf rotationAroundAxis(Vector3f p_311556_, Quaternionf p_311192_, Quaternionf p_310462_) { float f = p_311556_.dot(p_311192_.x, p_311192_.y, p_311192_.z); return p_310462_.set(p_311556_.x * f, p_311556_.y * f, p_311556_.z * f, p_311192_.w).normalize(); } public static int mulAndTruncate(Fraction p_331603_, int p_334561_) { return p_331603_.getNumerator() * p_334561_ / p_331603_.getDenominator(); } public static float easeInOutSine(float p_370041_) { return -(cos((float) Math.PI * p_370041_) - 1.0F) / 2.0F; } static { for (int i = 0; i < 257; i++) { double d0 = i / 256.0; double d1 = Math.asin(d0); COS_TAB[i] = Math.cos(d1); ASIN_TAB[i] = d1; } } }