package test; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.media.opengl.DebugGL2; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLEventListener; import javax.media.opengl.GLProfile; import javax.media.opengl.awt.GLCanvas; import javax.media.opengl.glu.GLU; import com.jogamp.opengl.util.FPSAnimator; import com.jogamp.opengl.util.gl2.GLUT; public class SimpleScene implements GLEventListener { private double theta = 0; private double s = 0; private double c = 0; private int listId1 = 0; private static Frame frame1; private static Frame frame2; static CustomCanvas canvas;// = new GLCanvas(caps); static GLProfile glp;// = GLProfile.getDefault(); static GLCapabilities caps;// = new GLCapabilities(glp); private static boolean toggle = false; private static int count = 0; private static final SimpleScene sceneRenderer = new SimpleScene(); // GUT and GLUT are global objects so that // they do not have to be newed in each frame. GLUT glut = new GLUT(); GLU glu = new GLU(); public static void main(String[] args) { frame1 = new Frame("Frame1"); frame1.setSize(300, 300); frame2 = new Frame("Frame2"); frame2.setSize(300, 300); SimpleScene ss = new SimpleScene(); ss.init(frame1); ss.init(frame1); while (true) { System.err.println("Switching to count: " + count); if (toggle) { ss.cleanup(frame2); ss.init(frame1); toggle = false; } else { ss.cleanup(frame1); ss.init(frame2); toggle = true; } try { Thread.sleep(250); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } count++; } } @Override public void display(GLAutoDrawable drawable) { update(); render(drawable); } @Override public void dispose(GLAutoDrawable drawable) { } @Override public void init(GLAutoDrawable drawable) { GL2 gl2 = drawable.getGL().getGL2(); //If an error occurs, causes a GLException to be thrown at exactly the point of failure. drawable.setGL(gl2); gl2.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gl2.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_FILL); // .GL_LINE); gl2.glFrontFace(GL2.GL_CCW); float val[] = new float[2]; gl2.glGetFloatv(GL2.GL_POINT_SIZE_RANGE, val, 0); } @Override public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) { GL2 gl2 = drawable.getGL().getGL2(); } private void update() { theta += 0.01; s = Math.sin(theta); c = Math.cos(theta); } private void render(GLAutoDrawable drawable) { GL2 gl2 = drawable.getGL().getGL2(); gl2.glClear(GL2.GL_COLOR_BUFFER_BIT); gl2.glRectd(.5, .5, -.5, -.5); // draw a triangle filling the window gl2.glBegin(GL2.GL_TRIANGLES); gl2.glColor3f(1, 0, 0); gl2.glVertex2d(-c, -c); gl2.glColor3f(0, 1, 0); gl2.glVertex2d(0, c); gl2.glColor3f(0, 0, 1); gl2.glVertex2d(s, -s); gl2.glEnd(); gl2.glBegin(GL2.GL_POLYGON); if (toggle) { gl2.glColor3f(1, 0, 0); } else { gl2.glColor3f(0, 1, 0); } gl2.glVertex3f(-1f, 3f, 0f); gl2.glVertex3f(0f, 0f, 0f); gl2.glVertex3f(1f, 3f, 0f); gl2.glVertex3f(0f, 2f, 0f); gl2.glEnd(); } public void init(Frame f) { glp = GLProfile.getDefault(); caps = new GLCapabilities(glp); canvas = new CustomCanvas(caps); canvas.addGLEventListener(sceneRenderer); f.add(canvas); f.setEnabled(true); f.setVisible(true); } /** * Clean up the Panel3D. */ public void cleanup(Frame f) { f.remove(canvas); Thread.yield(); } public class CustomCanvas extends GLCanvas { public CustomCanvas(GLCapabilities caps) { super(caps); } @Override public void display() { try { super.display(); } catch(Exception e) { System.err.println("CRASHED ON COUNT #: " + count); e.printStackTrace(); System.exit(0); } } } }