Skip to content

Commit 1aa0188

Browse files
committed
Fix text being rendered with z offset
1 parent 68fc733 commit 1aa0188

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package net.smyler.smylib.gui;
2+
3+
/**
4+
* Exposes methods declared in {@link net.smyler.smylib.mixins.FontMixinNoShadowOffset}.
5+
*/
6+
public interface PatchedFont {
7+
void smylib$setCancelShadowOffset(boolean cancelShadowOffset);
8+
}

smylib/fabric/src/main/java/net/smyler/smylib/gui/WrappedFont.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,13 @@ public float draw(float x, float y, @NotNull String text, @NotNull Color color,
6565
gl.scale(this.scale, this.scale);
6666
x *= invScale;
6767
y *= invScale;
68+
69+
// Vanilla does a z-translation call to draw the shadow,
70+
// We need to work around that (it is useless and messes z coordinates).
71+
PatchedFont patchedFont = (PatchedFont) this.vanillaFont;
72+
patchedFont.smylib$setCancelShadowOffset(true);
6873
float result = this.vanillaGraphics.drawString(this.vanillaFont, text, (int) x, (int) y, color.asInt());
74+
patchedFont.smylib$setCancelShadowOffset(false);
6975
gl.scale(invScale, invScale);
7076
return result;
7177
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package net.smyler.smylib.mixins;
2+
3+
import net.minecraft.client.gui.Font;
4+
import net.smyler.smylib.gui.PatchedFont;
5+
import org.joml.Matrix4f;
6+
import org.joml.Vector3fc;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.Unique;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Redirect;
11+
12+
13+
@Mixin(Font.class)
14+
public abstract class FontMixinNoShadowOffset implements PatchedFont {
15+
16+
@Unique
17+
private boolean cancelShadowOffset = false;
18+
19+
@Redirect(
20+
method = "drawInternal(Ljava/lang/String;FFIZLorg/joml/Matrix4f;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/client/gui/Font$DisplayMode;IIZ)I",
21+
at = @At(
22+
value = "INVOKE",
23+
target = "Lorg/joml/Matrix4f;translate(Lorg/joml/Vector3fc;)Lorg/joml/Matrix4f;",
24+
remap = false // Method is from JOML, it isn't obfuscated
25+
)
26+
)
27+
public Matrix4f applyShadowOffset(Matrix4f matrix, Vector3fc offset) {
28+
if (!this.cancelShadowOffset) {
29+
matrix.translate(offset);
30+
}
31+
return matrix;
32+
}
33+
34+
public void smylib$setCancelShadowOffset(boolean cancelShadowOffset) {
35+
this.cancelShadowOffset = cancelShadowOffset;
36+
}
37+
38+
}

smylib/fabric/src/main/resources/smylib.fabric.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"compatibilityLevel": "JAVA_21",
77
"mixins": [],
88
"client": [
9+
"FontMixinNoShadowOffset",
910
"UiGraphicsInjectorMixin"
1011
],
1112
"server": [],

0 commit comments

Comments
 (0)