From e80871cdb54d48e73233c2b5d0d411ee5ef5d5b5 Mon Sep 17 00:00:00 2001 From: Stephen Gold Date: Sun, 16 Jan 2022 21:20:23 -0800 Subject: [PATCH] GlfwMouseInput: scale mouse coords only if Retina AppSetting is true (#1746) * GlfwMouseInput: scale mouse coords only if Retina AppSetting is true * GlfwMouseInput: some minor code cleanup * GlfwMouseInput: check for scaled content in initCurrentMousePosition() --- .../com/jme3/input/lwjgl/GlfwMouseInput.java | 42 ++++++++++++------- .../com/jme3/system/lwjgl/LwjglWindow.java | 17 +++++++- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java index a868578910..be903ec0b9 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java @@ -136,23 +136,31 @@ private static ByteBuffer transformCursorImage(final IntBuffer imageData, final private boolean cursorVisible; private boolean initialized; + /** + * temporary storage for GLFW queries + */ + private final float[] xScale = new float[1]; + private final float[] yScale = new float[1]; + public GlfwMouseInput(final LwjglWindow context) { this.context = context; this.cursorVisible = true; } private void onCursorPos(final long window, final double xpos, final double ypos) { - float[] xScale = new float[1]; - float[] yScale = new float[1]; - glfwGetWindowContentScale(window, xScale, yScale); - - int xDelta; - int yDelta; - int x = (int) Math.round(xpos * xScale[0]); - int y = (int) Math.round((currentHeight - ypos) * yScale[0]); + int x; + int y; + if (context.isScaledContent()) { + glfwGetWindowContentScale(window, xScale, yScale); + x = (int) Math.round(xpos * xScale[0]); + y = (int) Math.round((currentHeight - ypos) * yScale[0]); + } else { + x = (int) Math.round(xpos); + y = (int) Math.round(currentHeight - ypos); + } - xDelta = x - mouseX; - yDelta = y - mouseY; + int xDelta = x - mouseX; + int yDelta = y - mouseY; mouseX = x; mouseY = y; @@ -248,12 +256,14 @@ private void initCurrentMousePosition(long window) { double[] y = new double[1]; glfwGetCursorPos(window, x, y); - float[] xScale = new float[1]; - float[] yScale = new float[1]; - glfwGetWindowContentScale(window, xScale, yScale); - - mouseX = (int) Math.round(x[0] * xScale[0]); - mouseY = (int) Math.round((currentHeight - y[0]) * yScale[0]); + if (context.isScaledContent()) { + glfwGetWindowContentScale(window, xScale, yScale); + mouseX = (int) Math.round(x[0] * xScale[0]); + mouseY = (int) Math.round((currentHeight - y[0]) * yScale[0]); + } else { + mouseX = (int) Math.round(x[0]); + mouseY = (int) Math.round(currentHeight - y[0]); + } } /** diff --git a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java index 8f902acd3e..bfef4b99ba 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java @@ -147,6 +147,10 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable { protected boolean wasActive = false; protected boolean autoFlush = true; protected boolean allowSwapBuffers = false; + /** + * Set true if Retina/HiDPI frame buffer was enabled via AppSettings. + */ + private boolean isScaledContent = false; public LwjglWindow(final JmeContext.Type type) { @@ -254,7 +258,9 @@ public void invoke(int error, long description) { glfwWindowHint(GLFW_SAMPLES, settings.getSamples()); glfwWindowHint(GLFW_STEREO, settings.useStereo3D() ? GLFW_TRUE : GLFW_FALSE); glfwWindowHint(GLFW_REFRESH_RATE, settings.getFrequency()<=0?GLFW_DONT_CARE:settings.getFrequency()); - glfwWindowHint(GLFW_COCOA_RETINA_FRAMEBUFFER, settings.isUseRetinaFrameBuffer() ? GLFW_TRUE : GLFW_FALSE); + + isScaledContent = settings.isUseRetinaFrameBuffer(); + glfwWindowHint(GLFW_COCOA_RETINA_FRAMEBUFFER, isScaledContent ? GLFW_TRUE : GLFW_FALSE); if (settings.getBitsPerPixel() == 24) { glfwWindowHint(GLFW_RED_BITS, 8); @@ -729,6 +735,15 @@ public TouchInput getTouchInput() { return null; } + /** + * Test whether Retina/HiDPI frame buffer was enabled via AppSettings. + * + * @return true if enabled, otherwise false + */ + public boolean isScaledContent() { + return isScaledContent; + } + @Override public void setAutoFlushFrames(boolean enabled) { this.autoFlush = enabled;