soiz1's picture
Upload folder using huggingface_hub
d46f4a3 verified
package com.mojang.math;
import org.apache.commons.lang3.tuple.Triple;
import org.joml.Math;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import org.joml.Quaternionf;
import org.joml.Vector3f;
public class MatrixUtil {
private static final float G = 3.0F + 2.0F * Math.sqrt(2.0F);
private static final GivensParameters PI_4 = GivensParameters.fromPositiveAngle((float) (java.lang.Math.PI / 4));
private MatrixUtil() {
}
public static Matrix4f mulComponentWise(Matrix4f p_254173_, float p_253864_) {
return p_254173_.set(
p_254173_.m00() * p_253864_,
p_254173_.m01() * p_253864_,
p_254173_.m02() * p_253864_,
p_254173_.m03() * p_253864_,
p_254173_.m10() * p_253864_,
p_254173_.m11() * p_253864_,
p_254173_.m12() * p_253864_,
p_254173_.m13() * p_253864_,
p_254173_.m20() * p_253864_,
p_254173_.m21() * p_253864_,
p_254173_.m22() * p_253864_,
p_254173_.m23() * p_253864_,
p_254173_.m30() * p_253864_,
p_254173_.m31() * p_253864_,
p_254173_.m32() * p_253864_,
p_254173_.m33() * p_253864_
);
}
private static GivensParameters approxGivensQuat(float p_276275_, float p_276276_, float p_276282_) {
float f = 2.0F * (p_276275_ - p_276282_);
return G * p_276276_ * p_276276_ < f * f ? GivensParameters.fromUnnormalized(p_276276_, f) : PI_4;
}
private static GivensParameters qrGivensQuat(float p_253897_, float p_254413_) {
float f = (float)java.lang.Math.hypot((double)p_253897_, (double)p_254413_);
float f1 = f > 1.0E-6F ? p_254413_ : 0.0F;
float f2 = Math.abs(p_253897_) + Math.max(f, 1.0E-6F);
if (p_253897_ < 0.0F) {
float f3 = f1;
f1 = f2;
f2 = f3;
}
return GivensParameters.fromUnnormalized(f1, f2);
}
private static void similarityTransform(Matrix3f p_276319_, Matrix3f p_276263_) {
p_276319_.mul(p_276263_);
p_276263_.transpose();
p_276263_.mul(p_276319_);
p_276319_.set(p_276263_);
}
private static void stepJacobi(Matrix3f p_276262_, Matrix3f p_276279_, Quaternionf p_276314_, Quaternionf p_276299_) {
if (p_276262_.m01 * p_276262_.m01 + p_276262_.m10 * p_276262_.m10 > 1.0E-6F) {
GivensParameters givensparameters = approxGivensQuat(p_276262_.m00, 0.5F * (p_276262_.m01 + p_276262_.m10), p_276262_.m11);
Quaternionf quaternionf = givensparameters.aroundZ(p_276314_);
p_276299_.mul(quaternionf);
givensparameters.aroundZ(p_276279_);
similarityTransform(p_276262_, p_276279_);
}
if (p_276262_.m02 * p_276262_.m02 + p_276262_.m20 * p_276262_.m20 > 1.0E-6F) {
GivensParameters givensparameters1 = approxGivensQuat(p_276262_.m00, 0.5F * (p_276262_.m02 + p_276262_.m20), p_276262_.m22).inverse();
Quaternionf quaternionf1 = givensparameters1.aroundY(p_276314_);
p_276299_.mul(quaternionf1);
givensparameters1.aroundY(p_276279_);
similarityTransform(p_276262_, p_276279_);
}
if (p_276262_.m12 * p_276262_.m12 + p_276262_.m21 * p_276262_.m21 > 1.0E-6F) {
GivensParameters givensparameters2 = approxGivensQuat(p_276262_.m11, 0.5F * (p_276262_.m12 + p_276262_.m21), p_276262_.m22);
Quaternionf quaternionf2 = givensparameters2.aroundX(p_276314_);
p_276299_.mul(quaternionf2);
givensparameters2.aroundX(p_276279_);
similarityTransform(p_276262_, p_276279_);
}
}
public static Quaternionf eigenvalueJacobi(Matrix3f p_276278_, int p_276269_) {
Quaternionf quaternionf = new Quaternionf();
Matrix3f matrix3f = new Matrix3f();
Quaternionf quaternionf1 = new Quaternionf();
for (int i = 0; i < p_276269_; i++) {
stepJacobi(p_276278_, matrix3f, quaternionf1, quaternionf);
}
quaternionf.normalize();
return quaternionf;
}
public static Triple<Quaternionf, Vector3f, Quaternionf> svdDecompose(Matrix3f p_253947_) {
Matrix3f matrix3f = new Matrix3f(p_253947_);
matrix3f.transpose();
matrix3f.mul(p_253947_);
Quaternionf quaternionf = eigenvalueJacobi(matrix3f, 5);
float f = matrix3f.m00;
float f1 = matrix3f.m11;
boolean flag = (double)f < 1.0E-6;
boolean flag1 = (double)f1 < 1.0E-6;
Matrix3f matrix3f1 = p_253947_.rotate(quaternionf);
Quaternionf quaternionf1 = new Quaternionf();
Quaternionf quaternionf2 = new Quaternionf();
GivensParameters givensparameters;
if (flag) {
givensparameters = qrGivensQuat(matrix3f1.m11, -matrix3f1.m10);
} else {
givensparameters = qrGivensQuat(matrix3f1.m00, matrix3f1.m01);
}
Quaternionf quaternionf3 = givensparameters.aroundZ(quaternionf2);
Matrix3f matrix3f2 = givensparameters.aroundZ(matrix3f);
quaternionf1.mul(quaternionf3);
matrix3f2.transpose().mul(matrix3f1);
if (flag) {
givensparameters = qrGivensQuat(matrix3f2.m22, -matrix3f2.m20);
} else {
givensparameters = qrGivensQuat(matrix3f2.m00, matrix3f2.m02);
}
givensparameters = givensparameters.inverse();
Quaternionf quaternionf4 = givensparameters.aroundY(quaternionf2);
Matrix3f matrix3f3 = givensparameters.aroundY(matrix3f1);
quaternionf1.mul(quaternionf4);
matrix3f3.transpose().mul(matrix3f2);
if (flag1) {
givensparameters = qrGivensQuat(matrix3f3.m22, -matrix3f3.m21);
} else {
givensparameters = qrGivensQuat(matrix3f3.m11, matrix3f3.m12);
}
Quaternionf quaternionf5 = givensparameters.aroundX(quaternionf2);
Matrix3f matrix3f4 = givensparameters.aroundX(matrix3f2);
quaternionf1.mul(quaternionf5);
matrix3f4.transpose().mul(matrix3f3);
Vector3f vector3f = new Vector3f(matrix3f4.m00, matrix3f4.m11, matrix3f4.m22);
return Triple.of(quaternionf1, vector3f, quaternionf.conjugate());
}
public static boolean isIdentity(Matrix4f p_378006_) {
return (p_378006_.properties() & 4) != 0;
}
public static boolean isPureTranslation(Matrix4f p_328643_) {
return (p_328643_.properties() & 8) != 0;
}
public static boolean isOrthonormal(Matrix4f p_335941_) {
return (p_335941_.properties() & 16) != 0;
}
}