(GL)JPanel w/o GLEventListener

Hello Javagaming-People,

is there a simple solution to connect OpenGL-Renderings to the JPanel Buffer? I dont want to use the GLEventListener/single-thread. I think of single-buffered OGL to double-buffered JPanel (if ogl to jpanel-(front/back)buffer-switch goes fast) or double-buffer OGL to single-buffered JPanel (if there are some advantages). Does anyone have experience with this.

I have read the sources (GLJPanel.java) but there seem to be many graca-vendor spec. “hacks” (sorry). So, before i do longtime-experiments, i ask here for some solutions (should be small & simple).

Eventually, the best aprroach is the combination of JPanel/BufferStrategy/direct OGL to JPanel-Buffer rendering?!

Thanks for your ideas! Cheers, Chris

PS: Sorry for my english…

There’s a reasonably simple approach called active rendering which permits you to dispense with the GLEventListener call-back method. http://fivedots.coe.psu.ac.th/~ad/jg2/ch15/jogl1v4.pdf explains the technique in detail.

–Mario

Yes, it’s a little tricky doing your own context management, particularly working with JOGL’s lazy loading. We do this in the core of Aviatrix3D with a fair amount of success. Occasionally it falls over, particularly on OS/X, but it works.

Following test-code doesnt work:


import java.awt.Dimension;
import javax.media.opengl.*;
import javax.swing.*;
import com.sun.opengl.impl.Java2D;

public final class Window extends JFrame {

	public Window() {
		super("Titel");

		JPanel panel = new JPanel(null);
		panel.setPreferredSize(new Dimension(640, 480));
		panel.setSize(640, 480);
		add(panel);

		Java2D.invokeWithOGLContextCurrent(panel.getGraphics(),
			new Runnable() {

				@Override
				public void run() {
					drawable =
						GLDrawableFactory.getFactory().createExternalGLDrawable();

					context =
						GLDrawableFactory.getFactory().createExternalGLContext();
				}

		});

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack(); setResizable(false); setVisible(true);

		try {
			context.makeCurrent();
		} catch (Exception e) {
			e.printStackTrace();
		}

		GL gl = context.getGL();

		gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity();
		gl.glOrtho(-4d / 3d, 4d / 3d, -1d, 1d, 0d, 1d);

		gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity();
		gl.glViewport(0, 0, 640, 480);

		gl.glClear(GL.GL_COLOR_BUFFER_BIT);
		gl.glRectf(-.8f, -.8f, .8f, .8f);

		gl.glFinish();

		drawable.swapBuffers(); // ?
		panel.repaint(); // ?

		context.release();
	}

	private GLDrawable drawable;
	private GLContext context;

	private static final long serialVersionUID = 0l;

	/**
	 * Startet die Anwendung.
	 * @param args Nicht verwendet
	 */
	public static void main(String[] args) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			@Override public void run() {new Window();}
		});
	}

}

Any ideas? Cheers, Chris