47
47
import java .awt .*;
48
48
import java .awt .image .BufferedImage ;
49
49
import java .nio .ByteBuffer ;
50
+ import java .nio .IntBuffer ;
50
51
import java .util .EnumSet ;
51
52
import java .util .HashMap ;
52
53
import java .util .Map ;
@@ -121,6 +122,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
121
122
122
123
private GLFWErrorCallback errorCallback ;
123
124
private GLFWWindowSizeCallback windowSizeCallback ;
125
+ private GLFWFramebufferSizeCallback framebufferSizeCallback ;
124
126
private GLFWWindowFocusCallback windowFocusCallback ;
125
127
126
128
private Thread mainThread ;
@@ -250,16 +252,8 @@ public void invoke(int error, long description) {
250
252
throw new RuntimeException ("Failed to create the GLFW window" );
251
253
}
252
254
253
- // Add a resize callback which delegates to the listener
254
- glfwSetWindowSizeCallback (window , windowSizeCallback = new GLFWWindowSizeCallback () {
255
- @ Override
256
- public void invoke (final long window , final int width , final int height ) {
257
- settings .setResolution (width , height );
258
- listener .reshape (width , height );
259
- }
260
- });
261
-
262
255
glfwSetWindowFocusCallback (window , windowFocusCallback = new GLFWWindowFocusCallback () {
256
+
263
257
@ Override
264
258
public void invoke (final long window , final boolean focus ) {
265
259
if (wasActive != focus ) {
@@ -294,6 +288,36 @@ public void invoke(final long window, final boolean focus) {
294
288
setWindowIcon (settings );
295
289
showWindow ();
296
290
291
+ // Windows resize callback
292
+ glfwSetWindowSizeCallback (window , windowSizeCallback = new GLFWWindowSizeCallback () {
293
+
294
+ @ Override
295
+ public void invoke (final long window , final int width , final int height ) {
296
+
297
+ // This is the window size, never to passed to any pixel based stuff!
298
+ // https://www.glfw.org/docs/latest/window_guide.html#window_size
299
+ onWindowSizeChanged (width , height );
300
+ }
301
+ });
302
+
303
+ // Add a framebuffer resize callback which delegates to the listener
304
+ glfwSetFramebufferSizeCallback (window , framebufferSizeCallback = new GLFWFramebufferSizeCallback () {
305
+
306
+ @ Override
307
+ public void invoke (final long window , final int width , final int height ) {
308
+
309
+ // The window size might be also changed, but the window size callback might not trigger
310
+ // Maybe a bug in graphics drivers or LWJGL 3...? So make sure we emulate the original JME behavior here
311
+ IntBuffer windowWidth = BufferUtils .createIntBuffer (1 );
312
+ IntBuffer windowHeight = BufferUtils .createIntBuffer (1 );
313
+ glfwGetWindowSize (window , windowWidth , windowHeight );
314
+ onWindowSizeChanged (windowWidth .get (), windowHeight .get ());
315
+
316
+ // https://www.glfw.org/docs/latest/window_guide.html#window_fbsize
317
+ listener .reshape (width , height );
318
+ }
319
+ });
320
+
297
321
allowSwapBuffers = settings .isSwapBuffers ();
298
322
299
323
// Create OpenCL
@@ -302,6 +326,10 @@ public void invoke(final long window, final boolean focus) {
302
326
}
303
327
}
304
328
329
+ private void onWindowSizeChanged (final int width , final int height ) {
330
+ settings .setResolution (width , height );
331
+ }
332
+
305
333
protected void showWindow () {
306
334
glfwShowWindow (window );
307
335
}
@@ -406,6 +434,11 @@ protected void destroyContext() {
406
434
windowSizeCallback = null ;
407
435
}
408
436
437
+ if (framebufferSizeCallback != null ) {
438
+ framebufferSizeCallback .close ();
439
+ framebufferSizeCallback = null ;
440
+ }
441
+
409
442
if (windowFocusCallback != null ) {
410
443
windowFocusCallback .close ();
411
444
windowFocusCallback = null ;
0 commit comments