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);
			}
		}
	}
}
