Skip to content

Commit

Permalink
GlfwMouseInput: scale mouse coords only if Retina AppSetting is true (#…
Browse files Browse the repository at this point in the history
…1746)

* GlfwMouseInput:  scale mouse coords only if Retina AppSetting is true

* GlfwMouseInput:  some minor code cleanup

* GlfwMouseInput:  check for scaled content in initCurrentMousePosition()
  • Loading branch information
stephengold committed Jan 17, 2022
1 parent c21d836 commit 797bfd8
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 17 deletions.
42 changes: 26 additions & 16 deletions jme3-lwjgl3/src/main/java/com/jme3/input/lwjgl/GlfwMouseInput.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,23 +134,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;

Expand Down Expand Up @@ -249,12 +257,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]);
}
}

/**
Expand Down
17 changes: 16 additions & 1 deletion jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,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) {

Expand Down Expand Up @@ -229,7 +233,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);
Expand Down Expand Up @@ -707,6 +713,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;
Expand Down

0 comments on commit 797bfd8

Please sign in to comment.