|
28 | 28 | import lombok.experimental.UtilityClass; |
29 | 29 | import net.minecraft.util.Mth; |
30 | 30 | import org.joml.Matrix4f; |
| 31 | +import org.joml.Vector3f; |
31 | 32 | import org.joml.Vector3fc; |
| 33 | +import org.joml.Vector4f; |
32 | 34 |
|
33 | 35 | import java.util.List; |
34 | 36 |
|
@@ -112,49 +114,45 @@ public static float getWeatherAlpha(List<Weather> weatherConditions, float rainS |
112 | 114 | return Mth.clamp(weatherAlpha, 0.0F, 1.0F); |
113 | 115 | } |
114 | 116 |
|
115 | | - // This method replicates the old Mojang-made Quaternion mulPose method, which was |
116 | | - // used for the initial sky transformations which did not have any bobbing issues. |
117 | | - // See https://github.com/sp614x/optifine/issues/7235#issuecomment-1581930719 |
118 | | - public static void mulPose(Matrix4f pose, float angle, 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()); |
159 | | - } |
| 117 | + // This method replicates the old Mojang-made Quaternion mulPose method, which was |
| 118 | + // used for the initial sky transformations which did not have any bobbing issues. |
| 119 | + // See https://github.com/sp614x/optifine/issues/7235#issuecomment-1581930719 |
| 120 | + public static void rotate(final Matrix4f pose, final float angle, final Vector3fc axis) { |
| 121 | + // Quaternion fields |
| 122 | + final Vector4f q = new Vector4f(axis.mul(Mth.sin(angle * 0.5F), new Vector3f()), Mth.cos(angle * 0.5F)); |
| 123 | + |
| 124 | + // Matrix4f/Matrix3f fields |
| 125 | + float m_xFactor = 2.0F * q.x * q.x; |
| 126 | + float m_yFactor = 2.0F * q.y * q.y; |
| 127 | + float m_zFactor = 2.0F * q.z * q.z; |
| 128 | + float m_xy = q.x * q.y; |
| 129 | + float m_yz = q.y * q.z; |
| 130 | + float m_zx = q.z * q.x; |
| 131 | + float m_xw = q.x * q.w; |
| 132 | + float m_yw = q.y * q.w; |
| 133 | + float m_zw = q.z * q.w; |
| 134 | + float m_m00 = 1.0F - m_yFactor - m_zFactor; |
| 135 | + float m_m01 = 2.0F * (m_xy - m_zw); |
| 136 | + float m_m02 = 2.0F * (m_zx + m_yw); |
| 137 | + float m_m10 = 2.0F * (m_xy + m_zw); |
| 138 | + float m_m11 = 1.0F - m_zFactor - m_xFactor; |
| 139 | + float m_m12 = 2.0F * (m_yz - m_xw); |
| 140 | + float m_m20 = 2.0F * (m_zx - m_yw); |
| 141 | + float m_m21 = 2.0F * (m_yz + m_xw); |
| 142 | + float m_m22 = 1.0F - m_xFactor - m_yFactor; |
| 143 | + |
| 144 | + // Multiply pose matrix |
| 145 | + pose.m00(m_m00 * pose.m00() + m_m01 * pose.m10() + m_m02 * pose.m20()) |
| 146 | + .m01(m_m00 * pose.m01() + m_m01 * pose.m11() + m_m02 * pose.m21()) |
| 147 | + .m02(m_m00 * pose.m02() + m_m01 * pose.m12() + m_m02 * pose.m22()) |
| 148 | + .m03(m_m00 * pose.m03() + m_m01 * pose.m13() + m_m02 * pose.m23()) |
| 149 | + .m10(m_m10 * pose.m00() + m_m11 * pose.m10() + m_m12 * pose.m20()) |
| 150 | + .m11(m_m10 * pose.m01() + m_m11 * pose.m11() + m_m12 * pose.m21()) |
| 151 | + .m12(m_m10 * pose.m02() + m_m11 * pose.m12() + m_m12 * pose.m22()) |
| 152 | + .m13(m_m10 * pose.m03() + m_m11 * pose.m13() + m_m12 * pose.m23()) |
| 153 | + .m20(m_m20 * pose.m00() + m_m21 * pose.m10() + m_m22 * pose.m20()) |
| 154 | + .m21(m_m20 * pose.m01() + m_m21 * pose.m11() + m_m22 * pose.m21()) |
| 155 | + .m22(m_m20 * pose.m02() + m_m21 * pose.m12() + m_m22 * pose.m22()) |
| 156 | + .m23(m_m20 * pose.m03() + m_m21 * pose.m13() + m_m22 * pose.m23()); |
| 157 | + } |
160 | 158 | } |
0 commit comments