|
27 | 27 | import btw.lowercase.skyboxify.skybox.components.Weather; |
28 | 28 | import lombok.experimental.UtilityClass; |
29 | 29 | import net.minecraft.util.Mth; |
| 30 | +import org.joml.AxisAngle4f; |
30 | 31 | import org.joml.Matrix4f; |
| 32 | +import org.joml.Quaternionf; |
31 | 33 | import org.joml.Vector3fc; |
32 | 34 |
|
33 | 35 | import java.util.List; |
@@ -115,46 +117,27 @@ public static float getWeatherAlpha(List<Weather> weatherConditions, float rainS |
115 | 117 | // This method replicates the old Mojang-made Quaternion mulPose method, which was |
116 | 118 | // used for the initial sky transformations which did not have any bobbing issues. |
117 | 119 | // 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))); |
159 | 142 | } |
160 | 143 | } |
0 commit comments