gpu: fix stretched mode scaling issues on macos

This fixes the following issues:

1) resize events for the client not being propagated to the listener on
   the canvas
2) resizing the client in fixed mode not triggering a resetSize due to
   the underlying canvas size not changing
3) maximizing the client calling restSize too soon causing it to have no
   effect
This commit is contained in:
Adam
2021-12-27 13:50:11 -05:00
parent faf5ce7a7d
commit bb43d232bb

View File

@@ -44,9 +44,13 @@ import com.jogamp.opengl.GLFBODrawable;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.math.Matrix4;
import java.awt.Canvas;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
@@ -293,6 +297,24 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
private int uniSmoothBanding;
private int uniTextureLightMode;
private int needsReset;
private final ComponentListener resizeListener = new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent e)
{
// forward to the JAWTWindow component listener on the canvas. The JAWTWindow component
// listener listens for resizes or movement of the component in order to resize and move
// the associated offscreen layer (calayer on macos only)
canvas.dispatchEvent(e);
// resetSize needs to be run awhile after the resize is completed.
// I've tried waiting until all EDT events are completed and even that is too soon.
// Not sure why, so we just wait a few frames.
needsReset = 5;
}
};
@Override
protected void startUp()
{
@@ -447,6 +469,11 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
{
invokeOnMainThread(this::uploadScene);
}
if (OSType.getOSType() == OSType.MacOS)
{
SwingUtilities.invokeAndWait(() -> ((Component) client).addComponentListener(resizeListener));
}
}
catch (Throwable e)
{
@@ -474,6 +501,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
@Override
protected void shutDown()
{
((Component) client).removeComponentListener(resizeListener);
clientThread.invoke(() ->
{
client.setGpu(false);
@@ -1091,16 +1119,22 @@ public class GpuPlugin extends Plugin implements DrawCallbacks
gl.glBindTexture(gl.GL_TEXTURE_2D, interfaceTexture);
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, canvasWidth, canvasHeight, 0, gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, null);
gl.glBindTexture(gl.GL_TEXTURE_2D, 0);
}
if (OSType.getOSType() == OSType.MacOS && glDrawable instanceof GLFBODrawable)
if (needsReset > 0)
{
assert OSType.getOSType() == OSType.MacOS;
if (needsReset == 1 && glDrawable instanceof GLFBODrawable)
{
// GLDrawables created with createGLDrawable() do not have a resize listener
// I don't know why this works with Windows/Linux, but on OSX
// it prevents JOGL from resizing its FBOs and underlying GL textures. So,
// we manually trigger a resize here.
GLFBODrawable glfboDrawable = (GLFBODrawable) glDrawable;
log.debug("Resetting GLFBODrawable size");
glfboDrawable.resetSize(gl);
}
needsReset--;
}
final BufferProvider bufferProvider = client.getBufferProvider();