Forge 1.17+ support
This commit is contained in:
1 parent
984647084b
commit
5d7c77d697
16 files changed
+146
-247
No files matched your search
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user