|
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.Matrix4f; |
| 31 | +import org.joml.Vector3fc; |
30 | 32 |
|
31 | 33 | import java.util.List; |
32 | 34 |
|
@@ -109,4 +111,50 @@ public static float getWeatherAlpha(List<Weather> weatherConditions, float rainS |
109 | 111 |
|
110 | 112 | return Mth.clamp(weatherAlpha, 0.0F, 1.0F); |
111 | 113 | } |
| 114 | + |
| 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 | + } |
112 | 160 | } |
0 commit comments