Fix for resizing the window (issue 1191) (#1308)
* Listen for framebuffer size callbacks and set the resolution from that * Also check the window size on the framebuffer size callback
This commit is contained in:
parent
0252c1b623
commit
59793d4c06
@ -47,6 +47,7 @@ import com.jme3.util.BufferUtils;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.IntBuffer;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -125,6 +126,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|||||||
|
|
||||||
private GLFWErrorCallback errorCallback;
|
private GLFWErrorCallback errorCallback;
|
||||||
private GLFWWindowSizeCallback windowSizeCallback;
|
private GLFWWindowSizeCallback windowSizeCallback;
|
||||||
|
private GLFWFramebufferSizeCallback framebufferSizeCallback;
|
||||||
private GLFWWindowFocusCallback windowFocusCallback;
|
private GLFWWindowFocusCallback windowFocusCallback;
|
||||||
|
|
||||||
private Thread mainThread;
|
private Thread mainThread;
|
||||||
@ -257,16 +259,8 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|||||||
throw new RuntimeException("Failed to create the GLFW window");
|
throw new RuntimeException("Failed to create the GLFW window");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a resize callback which delegates to the listener
|
|
||||||
glfwSetWindowSizeCallback(window, windowSizeCallback = new GLFWWindowSizeCallback() {
|
|
||||||
@Override
|
|
||||||
public void invoke(final long window, final int width, final int height) {
|
|
||||||
settings.setResolution(width, height);
|
|
||||||
listener.reshape(width, height);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
glfwSetWindowFocusCallback(window, windowFocusCallback = new GLFWWindowFocusCallback() {
|
glfwSetWindowFocusCallback(window, windowFocusCallback = new GLFWWindowFocusCallback() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void invoke(final long window, final boolean focus) {
|
public void invoke(final long window, final boolean focus) {
|
||||||
if (wasActive != focus) {
|
if (wasActive != focus) {
|
||||||
@ -301,6 +295,36 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|||||||
setWindowIcon(settings);
|
setWindowIcon(settings);
|
||||||
showWindow();
|
showWindow();
|
||||||
|
|
||||||
|
// Windows resize callback
|
||||||
|
glfwSetWindowSizeCallback(window, windowSizeCallback = new GLFWWindowSizeCallback() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(final long window, final int width, final int height) {
|
||||||
|
|
||||||
|
// This is the window size, never to passed to any pixel based stuff!
|
||||||
|
// https://www.glfw.org/docs/latest/window_guide.html#window_size
|
||||||
|
onWindowSizeChanged(width, height);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add a framebuffer resize callback which delegates to the listener
|
||||||
|
glfwSetFramebufferSizeCallback(window, framebufferSizeCallback = new GLFWFramebufferSizeCallback() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(final long window, final int width, final int height) {
|
||||||
|
|
||||||
|
// The window size might be also changed, but the window size callback might not trigger
|
||||||
|
// Maybe a bug in graphics drivers or LWJGL 3...? So make sure we emulate the original JME behavior here
|
||||||
|
IntBuffer windowWidth = BufferUtils.createIntBuffer(1);
|
||||||
|
IntBuffer windowHeight = BufferUtils.createIntBuffer(1);
|
||||||
|
glfwGetWindowSize(window, windowWidth, windowHeight);
|
||||||
|
onWindowSizeChanged(windowWidth.get(), windowHeight.get());
|
||||||
|
|
||||||
|
// https://www.glfw.org/docs/latest/window_guide.html#window_fbsize
|
||||||
|
listener.reshape(width, height);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
allowSwapBuffers = settings.isSwapBuffers();
|
allowSwapBuffers = settings.isSwapBuffers();
|
||||||
|
|
||||||
// Create OpenCL
|
// Create OpenCL
|
||||||
@ -309,6 +333,10 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onWindowSizeChanged(final int width, final int height) {
|
||||||
|
settings.setResolution(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
protected void showWindow() {
|
protected void showWindow() {
|
||||||
glfwShowWindow(window);
|
glfwShowWindow(window);
|
||||||
}
|
}
|
||||||
@ -413,6 +441,11 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
|
|||||||
windowSizeCallback = null;
|
windowSizeCallback = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (framebufferSizeCallback != null) {
|
||||||
|
framebufferSizeCallback.close();
|
||||||
|
framebufferSizeCallback = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (windowFocusCallback != null) {
|
if (windowFocusCallback != null) {
|
||||||
windowFocusCallback.close();
|
windowFocusCallback.close();
|
||||||
windowFocusCallback = null;
|
windowFocusCallback = null;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user