diff --git a/core/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java b/core/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java index 045a7012f..2c01eedf5 100644 --- a/core/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java +++ b/core/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java @@ -26,6 +26,8 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; +import com.jogamp.opengl.JoglVersion; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.communication.BugReporter; import net.sf.openrocket.gui.components.SelectableLabel; @@ -273,6 +275,7 @@ public class BugReportDialog extends JDialog { sb.append("OpenRocket version: " + BuildProperties.getVersion() + "\n"); sb.append("OpenRocket source: " + BuildProperties.getBuildSource() + "\n"); sb.append("OpenRocket location: " + JarUtil.getCurrentJarFile() + "\n"); + sb.append("JOGL version: " + JoglVersion.getInstance().getImplementationVersion() + "\n"); sb.append("Current default locale: " + Locale.getDefault() + "\n"); sb.append("System properties:\n"); diff --git a/core/src/net/sf/openrocket/gui/figure3d/JoglDebugAdaptor.java b/core/src/net/sf/openrocket/gui/figure3d/JoglDebugAdaptor.java new file mode 100644 index 000000000..bd8120a14 --- /dev/null +++ b/core/src/net/sf/openrocket/gui/figure3d/JoglDebugAdaptor.java @@ -0,0 +1,48 @@ +package net.sf.openrocket.gui.figure3d; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.startup.Application; + +/** + * Redirects system err into OpenRocket's log.debug() if openrocket.debug is enabled. + * This lets me capture JOGL debug as log events, which can be included in error reports etc. + * I wish I could get the JOGL debug log on a separate printstream, so I do not have to take + * over all of ERR. + * + * @author bkuker + * + */ +final class JoglDebugAdaptor { + private static final LogHelper log = Application.getLogger(); + + final static void plumbJoglDebug() { + if (RocketFigure3d.is3dEnabled() && System.getProperty("openrocket.debug") != null) { + System.setProperty("jogl.debug", "all"); + + System.setErr(new PrintStream(new OutputStream() { + StringBuilder sb = new StringBuilder(); + + @Override + public synchronized void write(int b) throws IOException { + if (b == '\r' || b == '\n') { + if (sb.toString().trim().length() > 0){ + String s = sb.toString(); + if ( Character.isWhitespace(s.charAt(0))){ + log.verbose(sb.toString()); + } else { + log.debug(sb.toString()); + } + } + sb = new StringBuilder(); + } else { + sb.append((char) b); + } + } + })); + } + } +} diff --git a/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java b/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java index b095adb8b..0b15e19cb 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java +++ b/core/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java @@ -52,6 +52,8 @@ public class RocketFigure3d extends JPanel implements GLEventListener { private static final LogHelper log = Application.getLogger(); static { + JoglDebugAdaptor.plumbJoglDebug(); + //this allows the GL canvas and things like the motor selection //drop down to z-order themselves. JPopupMenu.setDefaultLightWeightPopupEnabled(false); @@ -370,12 +372,12 @@ public class RocketFigure3d extends JPanel implements GLEventListener { @Override public void dispose(GLAutoDrawable drawable) { - log.verbose("GL - dispose() called"); + log.verbose("GL - dispose()"); } @Override public void init(GLAutoDrawable drawable) { - log.verbose("GL - init() called"); + log.verbose("GL - init()"); rr.init(drawable); GL2 gl = drawable.getGL().getGL2(); @@ -400,13 +402,11 @@ public class RocketFigure3d extends JPanel implements GLEventListener { extrasOverlay = new Overlay(drawable); caretOverlay = new Overlay(drawable); - - log.verbose("GL - init() complete"); } @Override public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) { - log.verbose("GL - reshape() called"); + log.verbose("GL - reshape()"); GL2 gl = drawable.getGL().getGL2(); GLU glu = new GLU(); @@ -419,7 +419,6 @@ public class RocketFigure3d extends JPanel implements GLEventListener { gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); redrawExtras = true; - log.verbose("GL - reshape() complete"); } @SuppressWarnings("unused") @@ -458,7 +457,6 @@ public class RocketFigure3d extends JPanel implements GLEventListener { } private void setupView(GL2 gl, GLU glu) { - log.verbose("GL - setupView() called"); gl.glLoadIdentity(); gl.glLightfv(GLLightingFunc.GL_LIGHT1, GLLightingFunc.GL_POSITION, @@ -494,8 +492,6 @@ public class RocketFigure3d extends JPanel implements GLEventListener { gl.glScaled(-1, 1, 1); gl.glTranslated(-1, 0, 0); gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); - - log.verbose("GL - setupView() complete"); } /** @@ -508,19 +504,15 @@ public class RocketFigure3d extends JPanel implements GLEventListener { } private void internalRepaint() { - log.verbose("GL - internalRepaint() called"); super.repaint(); if (canvas != null) canvas.display(); - log.verbose("GL - internalRepaint() complete"); } @Override public void repaint() { - log.verbose("GL - repaint() called"); redrawExtras = true; internalRepaint(); - log.verbose("GL - repaint() complete"); } private Set selection = new HashSet(); @@ -551,7 +543,6 @@ public class RocketFigure3d extends JPanel implements GLEventListener { // ///////////// Extra methods private Coordinate project(Coordinate c, GL2 gl, GLU glu) { - log.verbose("GL - project() called"); double[] mvmatrix = new double[16]; double[] projmatrix = new double[16]; int[] viewport = new int[4]; @@ -564,7 +555,6 @@ public class RocketFigure3d extends JPanel implements GLEventListener { glu.gluProject(c.x, c.y, c.z, mvmatrix, 0, projmatrix, 0, viewport, 0, out, 0); - log.verbose("GL - project() complete"); return new Coordinate(out[0], out[1], out[2]); }