Forge 1.17+ support

This commit is contained in:
Duy Tran Khanh committed 2022-05-29 20:03:04 +07:00
1 parent 984647084b
commit 5d7c77d697
16 files changed
+146 -247

No files matched your search

-144
View File
@@ -1,144 +0,0 @@
import org.lwjgl.*;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.*;
import java.nio.*;
import static org.lwjgl.glfw.Callbacks.*;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;
public class HelloWorld {
// The window handle
private long window;
protected boolean noLoop = false;
public void run() {
System.out.println("Hello LWJGL " + Version.getVersion() + "!");
init();
loop();
// Free the window callbacks and destroy the window
glfwFreeCallbacks(window);
glfwDestroyWindow(window);
// Terminate GLFW and free the error callback
glfwTerminate();
glfwSetErrorCallback(null).free();
}
private void init() {
// Setup an error callback. The default implementation
// will print the error message in System.err.
GLFWErrorCallback.createPrint(System.err).set();
// Initialize GLFW. Most GLFW functions will not work before doing this.
if ( !glfwInit() )
throw new IllegalStateException("Unable to initialize GLFW");
// Configure GLFW
glfwDefaultWindowHints(); // optional, the current window hints are already the default
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable
// Create the window
window = glfwCreateWindow(300, 300, "Hello World!", NULL, NULL);
if ( window == NULL )
throw new RuntimeException("Failed to create the GLFW window");
// Setup a key callback. It will be called every time a key is pressed, repeated or released.
glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop
});
System.out.println("ThreadOutsideCallback=" + Thread.currentThread().getName());
glfwSetCursorPosCallback(0, (window, x, y) -> {
System.out.println("ThreadInsideCallback=" + Thread.currentThread().getName() + ", x=" + x + ", y=" + y);
});
// Get the thread stack and push a new frame
try {
MemoryStack stack = stackPush();
IntBuffer pWidth = stack.mallocInt(1); // int*
IntBuffer pHeight = stack.mallocInt(1); // int*
// Get the window size passed to glfwCreateWindow
glfwGetWindowSize(window, pWidth, pHeight);
// Get the resolution of the primary monitor
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
System.out.println("MONITOR SPEC");
System.out.println("width=" + vidmode.width());
System.out.println("height=" + vidmode.height());
System.out.println("red=" + vidmode.redBits());
System.out.println("green=" + vidmode.greenBits());
System.out.println("blue=" + vidmode.blueBits());
System.out.println("refresh=" + vidmode.refreshRate());
// Center the window
glfwSetWindowPos(
window,
(vidmode.width() - pWidth.get(0)) / 2,
(vidmode.height() - pHeight.get(0)) / 2
);
} finally {} // the stack frame is popped automatically
// Make the OpenGL context current
glfwMakeContextCurrent(window);
// Enable v-sync
glfwSwapInterval(1);
// Make the window visible
glfwShowWindow(window);
// glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
}
private boolean grabbing = false;
private long lastTime;
private void loop() {
// This line is critical for LWJGL's interoperation with GLFW's
// OpenGL context, or any context that is managed externally.
// LWJGL detects the context that is current in the current thread,
// creates the GLCapabilities instance and makes the OpenGL
// bindings available for use.
org.lwjgl.opengl.GL.createCapabilities();
// Set the clear color
glClearColor(0.0f, 0.2f, 0.0f, 1.0f);
// Run the rendering loop until the user has attempted to close
// the window or has pressed the ESCAPE key.
if (noLoop) return;
while ( !glfwWindowShouldClose(window) ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
glfwSwapBuffers(window); // swap the color buffers
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents();
if (System.currentTimeMillis() - lastTime >= 5000) {
glClearColor(grabbing ? 0.0f : 0.2f, grabbing ? 0.2f : 0.0f, 0.0f, 1.0f);
lastTime = System.currentTimeMillis();
grabbing = !grabbing;
glfwSetInputMode(window, GLFW_CURSOR, grabbing ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_HIDDEN);
System.out.println("Grab state=" + Boolean.toString(grabbing));
}
}
}
public static void main(String[] args) {
new HelloWorld().run();
}
}
@@ -1,11 +0,0 @@
public class HelloWorldNoLoop extends HelloWorld {
public HelloWorldNoLoop() {
super();
noLoop = true;
}
public static void main(String[] args) {
new HelloWorldNoLoop().run();
}
}
@@ -419,7 +419,10 @@ public final class Tools
if (libItem._skip) continue;
String[] libInfos = libItem.name.split(":");
libDir.add(Tools.DIR_HOME_LIBRARY + "/" + Tools.artifactToPath(libInfos[0], libInfos[1], libInfos[2]));
String fullPath = Tools.DIR_HOME_LIBRARY + "/" + Tools.artifactToPath(libInfos[0], libInfos[1], libInfos[2]);
if (!libDir.contains(fullPath)) {
libDir.add(fullPath);
}
}
return libDir.toArray(new String[0]);
}
@@ -458,11 +461,11 @@ public final class Tools
libAdded.name.substring(libAddedName.length() + 1) + " with " +
lib.name.substring(libName.length() + 1));
libList.set(i, lib);
continue loop_1;
libName = null;
}
}
libList.add(lib);
if (libName != null) libList.add(lib);
}
} finally {
inheritsVer.libraries = libList.toArray(new DependentLibrary[0]);
@@ -125,10 +125,9 @@ public class UIKit {
public static native void refreshAWTBuffer(int[] array);
public static native int launchUI();
// public static native void runOnUIThread(UIKitCallback callback);
public static native void showError(String title, String message, boolean exitIfOk);
private static native void updateMCGuiScale(int scale);
}
}
@@ -71,5 +71,6 @@ public class MCOptionUtils
System.err.println("Could not save options.txt");
e.printStackTrace();
}
mLineList = null;
}
}
@@ -6,6 +6,7 @@ import android.util.*;
import net.kdt.pojavlaunch.*;
import net.kdt.pojavlaunch.uikit.UIKit;
import net.kdt.pojavlaunch.utils.MCOptionUtils;
public class CallbackBridge {
public static final int CLIPBOARD_COPY = 2000;
@@ -36,7 +37,19 @@ public class CallbackBridge {
static {
System.load(System.getenv("BUNDLE_PATH") + "/PojavLauncher");
// Forge 1.17+ initialize their very own space (both Java and JNI) so we re-init stuff here
MCOptionUtils.load();
Tools.mGLFWWindowWidth = Integer.parseInt(MCOptionUtils.get("overrideWidth"));
Tools.mGLFWWindowHeight = Integer.parseInt(MCOptionUtils.get("overrideHeight"));
MCOptionUtils.save(); // Free the loaded data
CallbackBridge.setClass();
try {
Class.forName("net.kdt.pojavlaunch.uikit.UIKit");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
INPUT_DEBUG_ENABLED = Boolean.parseBoolean(System.getProperty("glfwstub.debugInput", "false"));
}
@@ -184,8 +197,8 @@ public class CallbackBridge {
nativeSetGrabbing(grab, xset, yset);
}
// Called from native code
public static void receiveCallback(int type, float i1, float i2, int i3, int i4) {
// Called from native code
public static void receiveCallback(int type, float i1, float i2, int i3, int i4) {
/*
if (INPUT_DEBUG_ENABLED) {
System.out.println("LWJGL GLFW Callback received type=" + Integer.toString(type) + ", data=" + i1 + ", " + i2 + ", " + i3 + ", " + i4);
@@ -201,7 +214,7 @@ public class CallbackBridge {
PENDING_EVENT_LIST.add(new Object[]{type, (int)i1, (int)i2, i3, i4});
}
} // else System.out.println("Event input is not ready yet!");
}
}
// public static native void nativeSendData(boolean isAndroid, int type, String data);
public static boolean nativeSetInputReady(boolean ready) {
@@ -211,5 +224,6 @@ public class CallbackBridge {
public static native String nativeClipboard(int action, String copy);
private static native void nativeSetGrabbing(boolean grab, float xset, float yset);
public static native void setClass();
}
+3 -10
View File
@@ -14,7 +14,6 @@ import javax.annotation.*;
import net.kdt.pojavlaunch.Tools;
import org.lwjgl.*;
import org.lwjgl.opengl.GL;
import org.lwjgl.system.*;
import static org.lwjgl.system.APIUtil.*;
@@ -508,9 +507,8 @@ public class GLFW
}
// Minecraft triggers a glfwPollEvents() on splash screen, so update window size there.
// TODO objc-rewrite: commented out for testing only
//CallbackBridge.receiveCallback(CallbackBridge.EVENT_TYPE_FRAMEBUFFER_SIZE, Tools.mGLFWWindowWidth, Tools.mGLFWWindowHeight, 0, 0);
//CallbackBridge.receiveCallback(CallbackBridge.EVENT_TYPE_WINDOW_SIZE, Tools.mGLFWWindowWidth, Tools.mGLFWWindowHeight, 0, 0);
CallbackBridge.receiveCallback(CallbackBridge.EVENT_TYPE_FRAMEBUFFER_SIZE, Tools.mGLFWWindowWidth, Tools.mGLFWWindowHeight, 0, 0);
CallbackBridge.receiveCallback(CallbackBridge.EVENT_TYPE_WINDOW_SIZE, Tools.mGLFWWindowWidth, Tools.mGLFWWindowHeight, 0, 0);
mGLFWErrorCallback = GLFWErrorCallback.createPrint();
mGLFWKeyCodes = new ArrayMap<>();
@@ -1060,12 +1058,7 @@ public class GLFW
// Indirect event
while (CallbackBridge.PENDING_EVENT_LIST.size() > 0) {
Object[] dataArr = CallbackBridge.PENDING_EVENT_LIST.remove(0);
if (dataArr == null) { // It should not be null, but still should be catched
// System.out.println("GLFW: popped callback is null, skipping");
continue;
}
for (Long ptr : mGLFWWindowMap.keySet()) {
switch ((int)dataArr[0]) {
case CallbackBridge.EVENT_TYPE_CHAR: