Skip to content

Commit 53aa42d

Browse files
authored
Use old mojang rotation math
#24
1 parent 045ecd0 commit 53aa42d

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

src/main/java/btw/lowercase/skyboxify/skybox/SkyboxSkyRenderer.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@
3232
import net.minecraft.client.multiplayer.ClientLevel;
3333
import net.minecraft.util.Mth;
3434
import net.minecraft.world.level.Level;
35-
import org.joml.AxisAngle4f;
3635
import org.joml.Matrix4f;
37-
import org.joml.Quaternionf;
3836
import org.joml.Vector4f;
3937

4038
public final class SkyboxSkyRenderer {
@@ -133,8 +131,7 @@ private void renderSkyLayer(final SkyLayer skyLayer, final Matrix4f modelViewMat
133131
final float finalAlpha = Mth.clamp(conditionAlpha * weatherAlpha * fadeAlpha, 0.0F, 1.0F);
134132
if (!(finalAlpha < 1.0E-4F)) {
135133
if (skyLayer.rotate()) {
136-
// NOTE: Using `mulPose` directly gives a different result.
137-
modelViewMatrix.rotate(new Quaternionf(new AxisAngle4f(this.getAngle(level, skyAngle, skyLayer.speed()), skyLayer.axis())));
134+
CommonUtils.mulPose(modelViewMatrix, this.getAngle(level, skyAngle, skyLayer.speed()), skyLayer.axis());
138135
}
139136

140137
//? <=1.21.4 {

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import btw.lowercase.skyboxify.skybox.components.Weather;
2828
import lombok.experimental.UtilityClass;
2929
import net.minecraft.util.Mth;
30+
import org.joml.Matrix4f;
31+
import org.joml.Vector3fc;
3032

3133
import java.util.List;
3234

@@ -109,4 +111,50 @@ public static float getWeatherAlpha(List<Weather> weatherConditions, float rainS
109111

110112
return Mth.clamp(weatherAlpha, 0.0F, 1.0F);
111113
}
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+
}
112160
}

0 commit comments

Comments
 (0)