From 4dbbf8742e14e8ba7fc06dfbf5a38a5219f12c71 Mon Sep 17 00:00:00 2001 From: zbx1425 Date: Mon, 29 Apr 2024 18:41:47 +0800 Subject: [PATCH] Fix mixin conflict with Sodium 0.5 (Fixes #31) --- .../zbx1425/mtrsteamloco/mixin/GLFWMixin.java | 23 +++++++++++++++++++ .../mtrsteamloco/mixin/WindowMixin.java | 19 --------------- .../cn/zbx1425/sowcer/ContextCapability.java | 12 +++++++++- .../main/resources/mtrsteamloco.mixins.json | 2 +- 4 files changed, 35 insertions(+), 21 deletions(-) create mode 100644 common/src/main/java/cn/zbx1425/mtrsteamloco/mixin/GLFWMixin.java delete mode 100644 common/src/main/java/cn/zbx1425/mtrsteamloco/mixin/WindowMixin.java diff --git a/common/src/main/java/cn/zbx1425/mtrsteamloco/mixin/GLFWMixin.java b/common/src/main/java/cn/zbx1425/mtrsteamloco/mixin/GLFWMixin.java new file mode 100644 index 00000000..08c6bf0f --- /dev/null +++ b/common/src/main/java/cn/zbx1425/mtrsteamloco/mixin/GLFWMixin.java @@ -0,0 +1,23 @@ +package cn.zbx1425.mtrsteamloco.mixin; + +import cn.zbx1425.sowcer.ContextCapability; +import com.mojang.blaze3d.platform.Window; +import org.lwjgl.glfw.GLFW; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(GLFW.class) +public class GLFWMixin { + + // Promote to a higher OpenGL version, as glVertexAttribDivisor is only available in OpenGL 3.3+ + + @Inject(method = "glfwCreateWindow(IILjava/lang/CharSequence;JJ)J", at = @At("HEAD"), cancellable = true, remap = false) + private static void glfwCreateWindow(int width, int height, CharSequence title, long monitor, long share, CallbackInfoReturnable cir) { + cir.setReturnValue(ContextCapability.createWindow(width, height, title, monitor, share)); + } + +} \ No newline at end of file diff --git a/common/src/main/java/cn/zbx1425/mtrsteamloco/mixin/WindowMixin.java b/common/src/main/java/cn/zbx1425/mtrsteamloco/mixin/WindowMixin.java deleted file mode 100644 index 120f9ffb..00000000 --- a/common/src/main/java/cn/zbx1425/mtrsteamloco/mixin/WindowMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.zbx1425.mtrsteamloco.mixin; - -import cn.zbx1425.mtrsteamloco.Main; -import cn.zbx1425.sowcer.ContextCapability; -import com.mojang.blaze3d.platform.Window; -import org.lwjgl.glfw.GLFW; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(Window.class) -public class WindowMixin { - - @Redirect(method = "", at = @At(value = "INVOKE", target = "Lorg/lwjgl/glfw/GLFW;glfwCreateWindow(IILjava/lang/CharSequence;JJ)J", remap = false), require = 0) - private long glfwCreateWindow(int width, int height, CharSequence title, long monitor, long share) { - return ContextCapability.createWindow(width, height, title, monitor, share); - } - -} \ No newline at end of file diff --git a/common/src/main/java/cn/zbx1425/sowcer/ContextCapability.java b/common/src/main/java/cn/zbx1425/sowcer/ContextCapability.java index 7c00ff93..508f12c4 100644 --- a/common/src/main/java/cn/zbx1425/sowcer/ContextCapability.java +++ b/common/src/main/java/cn/zbx1425/sowcer/ContextCapability.java @@ -4,6 +4,7 @@ import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFWErrorCallback; import org.lwjgl.opengl.GL33; +import org.lwjgl.system.MemoryStack; import java.util.Locale; @@ -21,7 +22,16 @@ public static long createWindow(int width, int height, CharSequence title, long for (int versionToTry : new int[] {46, 45, 44, 43, 42, 41, 40, 33, 32}) { GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MAJOR, versionToTry / 10); GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MINOR, versionToTry % 10); - window = GLFW.glfwCreateWindow(width, height, title, monitor, share); + + MemoryStack stack = MemoryStack.stackGet(); int stackPointer = stack.getPointer(); + try { + stack.nUTF8(title, true); + long titleEncoded = stack.getPointerAddress(); + window = GLFW.nglfwCreateWindow(width, height, titleEncoded, monitor, share); + } finally { + stack.setPointer(stackPointer); + } + if (window != 0) { contextVersion = versionToTry; break; diff --git a/common/src/main/resources/mtrsteamloco.mixins.json b/common/src/main/resources/mtrsteamloco.mixins.json index 26220483..db9f5a5c 100644 --- a/common/src/main/resources/mtrsteamloco.mixins.json +++ b/common/src/main/resources/mtrsteamloco.mixins.json @@ -25,7 +25,7 @@ "TrainClientAccessor", "TrainClientMixin", "TrainClientRegistryMixin", - "WindowMixin" + "GLFWMixin" ], "injectors": { "defaultRequire": 1