Skip to content

Commit c1afc4e

Browse files
committed
Improve rotate code (thanks roro1506HD)
1 parent 4f36541 commit c1afc4e

File tree

1 file changed

+24
-41
lines changed

1 file changed

+24
-41
lines changed

src/main/java/btw/lowercase/skyboxify/utils/CommonUtils.java

Lines changed: 24 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
import btw.lowercase.skyboxify.skybox.components.Weather;
2828
import lombok.experimental.UtilityClass;
2929
import net.minecraft.util.Mth;
30+
import org.joml.AxisAngle4f;
3031
import org.joml.Matrix4f;
32+
import org.joml.Quaternionf;
3133
import org.joml.Vector3fc;
3234

3335
import java.util.List;
@@ -115,46 +117,27 @@ public static float getWeatherAlpha(List<Weather> weatherConditions, float rainS
115117
// This method replicates the old Mojang-made Quaternion mulPose method, which was
116118
// used for the initial sky transformations which did not have any bobbing issues.
117119
// See https://github.com/sp614x/optifine/issues/7235#issuecomment-1581930719
118-
public static void rotate(final Matrix4f pose, final float angle, final Vector3fc axis) {
119-
// Quaternion fields
120-
float q_sin = Mth.sin(angle * 0.5F);
121-
float q_x = axis.x() * q_sin;
122-
float q_y = axis.y() * q_sin;
123-
float q_z = axis.z() * q_sin;
124-
float q_w = Mth.cos(angle * 0.5F);
125-
126-
// Matrix4f/Matrix3f fields
127-
float m_xFactor = 2.0F * q_x * q_x;
128-
float m_yFactor = 2.0F * q_y * q_y;
129-
float m_zFactor = 2.0F * q_z * q_z;
130-
float m_xy = q_x * q_y;
131-
float m_yz = q_y * q_z;
132-
float m_zx = q_z * q_x;
133-
float m_xw = q_x * q_w;
134-
float m_yw = q_y * q_w;
135-
float m_zw = q_z * q_w;
136-
float m_m00 = 1.0F - m_yFactor - m_zFactor;
137-
float m_m01 = 2.0F * (m_xy - m_zw);
138-
float m_m02 = 2.0F * (m_zx + m_yw);
139-
float m_m10 = 2.0F * (m_xy + m_zw);
140-
float m_m11 = 1.0F - m_zFactor - m_xFactor;
141-
float m_m12 = 2.0F * (m_yz - m_xw);
142-
float m_m20 = 2.0F * (m_zx - m_yw);
143-
float m_m21 = 2.0F * (m_yz + m_xw);
144-
float m_m22 = 1.0F - m_xFactor - m_yFactor;
145-
146-
// Multiply pose matrix
147-
pose.m00(m_m00 * pose.m00() + m_m01 * pose.m10() + m_m02 * pose.m20());
148-
pose.m01(m_m00 * pose.m01() + m_m01 * pose.m11() + m_m02 * pose.m21());
149-
pose.m02(m_m00 * pose.m02() + m_m01 * pose.m12() + m_m02 * pose.m22());
150-
pose.m03(m_m00 * pose.m03() + m_m01 * pose.m13() + m_m02 * pose.m23());
151-
pose.m10(m_m10 * pose.m00() + m_m11 * pose.m10() + m_m12 * pose.m20());
152-
pose.m11(m_m10 * pose.m01() + m_m11 * pose.m11() + m_m12 * pose.m21());
153-
pose.m12(m_m10 * pose.m02() + m_m11 * pose.m12() + m_m12 * pose.m22());
154-
pose.m13(m_m10 * pose.m03() + m_m11 * pose.m13() + m_m12 * pose.m23());
155-
pose.m20(m_m20 * pose.m00() + m_m21 * pose.m10() + m_m22 * pose.m20());
156-
pose.m21(m_m20 * pose.m01() + m_m21 * pose.m11() + m_m22 * pose.m21());
157-
pose.m22(m_m20 * pose.m02() + m_m21 * pose.m12() + m_m22 * pose.m22());
158-
pose.m23(m_m20 * pose.m03() + m_m21 * pose.m13() + m_m22 * pose.m23());
120+
public static void rotate(final Matrix4f pose, final float angleRads, final Vector3fc axis) {
121+
final Quaternionf quat = new Quaternionf(new AxisAngle4f(-angleRads, axis));
122+
float qxy = quat.x * quat.y;
123+
float qyz = quat.y * quat.z;
124+
float qzx = quat.z * quat.x;
125+
float qxw = quat.x * quat.w;
126+
float qyw = quat.y * quat.w;
127+
float qzw = quat.z * quat.w;
128+
float j = 2.0F * quat.x * quat.x;
129+
float k = 2.0F * quat.y * quat.y;
130+
float l = 2.0F * quat.z * quat.z;
131+
pose.mul0(new Matrix4f()
132+
.m00(1.0F - k - l)
133+
.m11(1.0F - l - j)
134+
.m22(1.0F - j - k)
135+
.m33(1.0F)
136+
.m10(2.0F * (qxy + qzw))
137+
.m01(2.0F * (qxy - qzw))
138+
.m20(2.0F * (qzx - qyw))
139+
.m02(2.0F * (qzx + qyw))
140+
.m21(2.0F * (qyz + qxw))
141+
.m12(2.0F * (qyz - qxw)));
159142
}
160143
}

0 commit comments

Comments
 (0)