Beispiel #1
0
 @Override
 protected GLJPanel createDrawable() {
   GLCapabilities caps = new GLCapabilities(null);
   //
   GLJPanel panel = new GLJPanel(caps);
   panel.addGLEventListener(this);
   panel.addKeyListener(this);
   return panel;
 }
  private void setTitle(
      final JFrame frame, final GLJPanel glc, final GLCapabilitiesImmutable caps) {
    final String capsA = caps.isBackgroundOpaque() ? "opaque" : "transl";
    final java.awt.Rectangle b = glc.getBounds();

    final float[] minSurfacePixelScale = glc.getMinimumSurfaceScale(new float[2]);
    final float[] maxSurfacePixelScale = glc.getMaximumSurfaceScale(new float[2]);
    final float[] reqSurfacePixelScale = glc.getRequestedSurfaceScale(new float[2]);
    final float[] hasSurfacePixelScale = glc.getCurrentSurfaceScale(new float[2]);
    frame.setTitle(
        "GLJPanel["
            + capsA
            + "], swapI "
            + swapInterval
            + ", win: ["
            + b.x
            + "/"
            + b.y
            + " "
            + b.width
            + "x"
            + b.height
            + "], pix: "
            + glc.getSurfaceWidth()
            + "x"
            + glc.getSurfaceHeight()
            + ", scale[min "
            + minSurfacePixelScale[0]
            + "x"
            + minSurfacePixelScale[1]
            + ", max "
            + maxSurfacePixelScale[0]
            + "x"
            + maxSurfacePixelScale[1]
            + ", req "
            + reqSurfacePixelScale[0]
            + "x"
            + reqSurfacePixelScale[1]
            + " -> has "
            + hasSurfacePixelScale[0]
            + "x"
            + hasSurfacePixelScale[1]
            + "]");
  }
 protected void destroy(final JFrame frame, final GLJPanel glJPanel) {
   try {
     if (SwingUtilities.isEventDispatchThread()) {
       if (null != frame) {
         frame.setVisible(false);
         if (null != glJPanel) {
           frame.getContentPane().remove(glJPanel);
         }
         frame.remove(glJPanel);
       }
       if (null != glJPanel) {
         glJPanel.destroy();
       }
       if (null != frame) {
         frame.dispose();
       }
     } else {
       SwingUtilities.invokeAndWait(
           new Runnable() {
             public void run() {
               if (null != frame) {
                 frame.setVisible(false);
                 if (null != glJPanel) {
                   frame.getContentPane().remove(glJPanel);
                 }
                 frame.remove(glJPanel);
               }
               if (null != glJPanel) {
                 glJPanel.destroy();
               }
               if (null != frame) {
                 frame.dispose();
               }
             }
           });
     }
   } catch (final Exception e) {
     e.printStackTrace();
   }
 }
  protected void runTestGL(final GLCapabilities caps)
      throws AWTException, InterruptedException, InvocationTargetException {
    final JFrame frame = new JFrame("Swing GLJPanel");
    frame.setLocation(xpos, ypos);
    Assert.assertNotNull(frame);

    final FPSAnimator animator = useAnimator ? new FPSAnimator(60) : null;
    final SnapshotGLEventListener snap = new SnapshotGLEventListener();
    final GLJPanel glJPanel = newGLJPanel(frame, caps, animator, snap);
    if (null != animator) {
      animator.start();
      Assert.assertEquals(true, animator.isAnimating());
    }
    final Screen screen = NewtFactoryAWT.createScreen(glJPanel, true);
    screen.addReference(); // initial native creation - keep alive!
    System.err.println("GetPixelScale: AWT -> Screen: " + screen);

    final QuitAdapter quitAdapter = new QuitAdapter();
    new AWTKeyAdapter(new TraceKeyAdapter(quitAdapter), glJPanel).addTo(glJPanel);
    new AWTWindowAdapter(new TraceWindowAdapter(quitAdapter), glJPanel).addTo(frame);

    final JFrame[] frame2 = {null};
    final GLJPanel[] glJPanel2 = {null};

    final com.jogamp.newt.event.KeyListener kl =
        new com.jogamp.newt.event.KeyAdapter() {
          @Override
          public void keyPressed(final KeyEvent e) {
            if (e.isAutoRepeat()) {
              return;
            }
            if (e.getKeySymbol() == KeyEvent.VK_P) {
              System.err.println();
              {
                // Just for manual validation!
                final java.awt.Point los = glJPanel.getLocationOnScreen();
                final RectangleImmutable r =
                    new Rectangle(los.x, los.y, glJPanel.getWidth(), glJPanel.getHeight());
                System.err.printf("GetPixelScale: Panel Bounds: %s window-units%n", r.toString());
                System.err.printf(
                    "GetPixelScale: Panel Resolution: %d x %d pixel-units%n",
                    glJPanel.getSurfaceWidth(), glJPanel.getSurfaceHeight());
              }
              final MonitorDevice monitor = NewtFactoryAWT.getMonitorDevice(screen, glJPanel);
              System.err.printf("GetPixelScale: %s%n", monitor.toString());
              final float[] pixelPerMM;
              final boolean cached;
              if (e.isShiftDown()) {
                // SHIFT: query current mode!
                pixelPerMM = monitor.getPixelsPerMM(monitor.queryCurrentMode(), new float[2]);
                cached = false;
              } else {
                // Default: Use cached mode!
                pixelPerMM = monitor.getPixelsPerMM(new float[2]);
                cached = true;
              }
              System.err.println(
                  "  pixel/mm ["
                      + pixelPerMM[0]
                      + ", "
                      + pixelPerMM[1]
                      + "], cached-mode "
                      + cached);
              System.err.println(
                  "  pixel/in ["
                      + pixelPerMM[0] * 25.4f
                      + ", "
                      + pixelPerMM[1] * 25.4f
                      + "], cached-mode "
                      + cached);
              System.err.println();
            } else if (e.getKeyChar() == 'x') {
              final float[] hadSurfacePixelScale = glJPanel.getCurrentSurfaceScale(new float[2]);
              final float[] reqSurfacePixelScale;
              if (hadSurfacePixelScale[0] == ScalableSurface.IDENTITY_PIXELSCALE) {
                reqSurfacePixelScale =
                    new float[] {
                      ScalableSurface.AUTOMAX_PIXELSCALE, ScalableSurface.AUTOMAX_PIXELSCALE
                    };
              } else {
                reqSurfacePixelScale =
                    new float[] {
                      ScalableSurface.IDENTITY_PIXELSCALE, ScalableSurface.IDENTITY_PIXELSCALE
                    };
              }
              System.err.println(
                  "[set PixelScale pre]: had "
                      + hadSurfacePixelScale[0]
                      + "x"
                      + hadSurfacePixelScale[1]
                      + " -> req "
                      + reqSurfacePixelScale[0]
                      + "x"
                      + reqSurfacePixelScale[1]);
              glJPanel.setSurfaceScale(reqSurfacePixelScale);
              final float[] valReqSurfacePixelScale =
                  glJPanel.getRequestedSurfaceScale(new float[2]);
              final float[] hasSurfacePixelScale1 = glJPanel.getCurrentSurfaceScale(new float[2]);
              System.err.println(
                  "[set PixelScale post]: "
                      + hadSurfacePixelScale[0]
                      + "x"
                      + hadSurfacePixelScale[1]
                      + " (had) -> "
                      + reqSurfacePixelScale[0]
                      + "x"
                      + reqSurfacePixelScale[1]
                      + " (req) -> "
                      + valReqSurfacePixelScale[0]
                      + "x"
                      + valReqSurfacePixelScale[1]
                      + " (val) -> "
                      + hasSurfacePixelScale1[0]
                      + "x"
                      + hasSurfacePixelScale1[1]
                      + " (has)");
              setTitle(frame, glJPanel, caps);
            } else if (e.getKeyChar() == 'm') {
              final GLCapabilitiesImmutable capsPre = glJPanel.getChosenGLCapabilities();
              final GLCapabilities capsNew = new GLCapabilities(capsPre.getGLProfile());
              capsNew.copyFrom(capsPre);
              final boolean msaa;
              if (capsPre.getSampleBuffers()) {
                capsNew.setSampleBuffers(false);
                msaa = false;
              } else {
                capsNew.setSampleBuffers(true);
                capsNew.setNumSamples(4);
                msaa = true;
              }
              System.err.println("[set MSAA " + msaa + " Caps had]: " + capsPre);
              System.err.println("[set MSAA " + msaa + " Caps new]: " + capsNew);
              System.err.println("XXX-A1: " + animator.toString());
              glJPanel.setRequestedGLCapabilities(capsNew);
              System.err.println("XXX-A2: " + animator.toString());
              System.err.println("XXX: " + glJPanel.toString());
            } else if (e.getKeyChar() == 'n') {
              System.err.println("XXX: frame2: " + frame2[0]);
              if (null != frame2[0]) {
                System.err.println("XXX: frame2.isShowing: " + frame2[0].isShowing());
              }
              System.err.println("XXX: glJPanel2: " + glJPanel2[0]);
              if (null != frame2[0] && frame2[0].isShowing()) {
                destroy(frame2[0], glJPanel2[0]);
                frame2[0] = null;
                glJPanel2[0] = null;
              } else {
                frame2[0] = new JFrame("GLJPanel2");
                frame2[0].setLocation(frame.getX() + frame.getWidth() + 64, frame.getY());
                final FPSAnimator animator2 = useAnimator ? new FPSAnimator(60) : null;
                if (null != animator2) {
                  animator2.start();
                }
                final SnapshotGLEventListener snap2 = new SnapshotGLEventListener();
                try {
                  glJPanel2[0] = newGLJPanel(frame2[0], caps, animator2, snap2);
                } catch (final Exception e2) {
                  e2.printStackTrace();
                  destroy(frame2[0], glJPanel2[0]);
                  frame2[0] = null;
                  glJPanel2[0] = null;
                }
              }
            }
          }
        };
    new AWTKeyAdapter(kl, glJPanel).addTo(glJPanel);

    snap.setMakeSnapshot();

    if (null != rwsize) {
      Thread.sleep(500); // 500ms delay
      setFrameSize(frame, true, rwsize);
      System.err.println(
          "window resize pos/siz: "
              + glJPanel.getX()
              + "/"
              + glJPanel.getY()
              + " "
              + glJPanel.getSurfaceWidth()
              + "x"
              + glJPanel.getSurfaceHeight());
    }

    snap.setMakeSnapshot();

    final long t0 = System.currentTimeMillis();
    long t1 = t0;
    boolean triggerSnap = false;
    while (!quitAdapter.shouldQuit() && t1 - t0 < duration) {
      Thread.sleep(100);
      t1 = System.currentTimeMillis();
      snap.getDisplayCount();
      if (!triggerSnap && snap.getDisplayCount() > 1) {
        // Snapshot only after one frame has been rendered to suite FBO MSAA!
        snap.setMakeSnapshot();
        triggerSnap = true;
      }
    }

    Assert.assertNotNull(frame);
    Assert.assertNotNull(glJPanel);

    if (useAnimator) {
      Assert.assertNotNull(animator);
      animator.stop();
      Assert.assertEquals(false, animator.isAnimating());
    } else {
      Assert.assertNull(animator);
    }

    screen.removeReference(); // final native destroy
    destroy(frame, glJPanel);
    if (null != frame2[0]) {
      destroy(frame2[0], glJPanel2[0]);
    }
  }
  protected GLJPanel newGLJPanel(
      final JFrame frame,
      final GLCapabilities caps,
      final FPSAnimator animator,
      final SnapshotGLEventListener snap)
      throws AWTException, InterruptedException, InvocationTargetException {
    final GLJPanel glJPanel = new GLJPanel(caps);
    Assert.assertNotNull(glJPanel);
    glJPanel.setSkipGLOrientationVerticalFlip(skipGLOrientationVerticalFlip);
    glJPanel.setMinimumSize(wsize);
    glJPanel.setPreferredSize(wsize);
    glJPanel.setSize(wsize);
    glJPanel.setSurfaceScale(reqSurfacePixelScale);
    {
      final GLEventListener demo = createDemo(caps);
      if (null != demo) {
        glJPanel.addGLEventListener(demo);
      }
    }
    if (null != snap) {
      glJPanel.addGLEventListener(snap);
    }
    glJPanel.addGLEventListener(
        new GLEventListener() {
          @Override
          public void init(final GLAutoDrawable drawable) {}

          @Override
          public void dispose(final GLAutoDrawable drawable) {}

          @Override
          public void display(final GLAutoDrawable drawable) {}

          @Override
          public void reshape(
              final GLAutoDrawable drawable,
              final int x,
              final int y,
              final int width,
              final int height) {
            setTitle(frame, glJPanel, caps);
          }
        });
    setTitle(frame, glJPanel, caps);

    frame.addComponentListener(
        new ComponentListener() {
          @Override
          public void componentResized(final ComponentEvent e) {
            setTitle(frame, glJPanel, caps);
          }

          @Override
          public void componentMoved(final ComponentEvent e) {
            setTitle(frame, glJPanel, caps);
          }

          @Override
          public void componentShown(final ComponentEvent e) {}

          @Override
          public void componentHidden(final ComponentEvent e) {}
        });

    if (SwingUtilities.isEventDispatchThread()) {
      frame.getContentPane().add(glJPanel, BorderLayout.CENTER);
      frame.getContentPane().validate();
      frame.pack();
      frame.setVisible(true);
    } else {
      SwingUtilities.invokeAndWait(
          new Runnable() {
            public void run() {
              frame.getContentPane().add(glJPanel, BorderLayout.CENTER);
              frame.getContentPane().validate();
              frame.pack();
              frame.setVisible(true);
            }
          });
      Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame, true));
      Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glJPanel, true));

      final float[] minSurfacePixelScale = glJPanel.getMinimumSurfaceScale(new float[2]);
      final float[] maxSurfacePixelScale = glJPanel.getMaximumSurfaceScale(new float[2]);
      final float[] valReqSurfacePixelScale = glJPanel.getRequestedSurfaceScale(new float[2]);
      final float[] hasSurfacePixelScale = glJPanel.getCurrentSurfaceScale(new float[2]);
      System.err.println(
          "HiDPI PixelScale: min "
              + minSurfacePixelScale[0]
              + "x"
              + minSurfacePixelScale[1]
              + ", max "
              + maxSurfacePixelScale[0]
              + "x"
              + maxSurfacePixelScale[1]
              + ", req "
              + reqSurfacePixelScale[0]
              + "x"
              + reqSurfacePixelScale[1]
              + " -> val "
              + valReqSurfacePixelScale[0]
              + "x"
              + valReqSurfacePixelScale[1]
              + " -> has "
              + hasSurfacePixelScale[0]
              + "x"
              + hasSurfacePixelScale[1]);
      setTitle(frame, glJPanel, caps);
    }

    if (null != animator) {
      animator.add(glJPanel);
      animator.setUpdateFPSFrames(60, System.err);
    }
    return glJPanel;
  }