/**
 * @(#) DrawColoredPrimitives2.java
 * @(#) author: Joe Zimmerman (converted to Java by Sven Goethel)
 */

/* This program is free software under the license of LGPL */

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.util.*;
import java.io.*;
import java.util.*;
import gl4java.GLContext;
import gl4java.awt.GLAnimCanvas;
import gl4java.applet.SimpleGLAnimApplet1;

public class DrawColoredPrimitives2 extends SimpleGLAnimApplet1 
{

    public void init()
    {
	super.init();
        Dimension d = getSize();
        canvas = new gldemo(d.width, d.height);
        add("Center", canvas);
    }

	public static void main( String args[] ) {
		DrawColoredPrimitives2 applet = 
		         new DrawColoredPrimitives2();

		Frame f = new Frame("DrawColoredPrimitives2");

		f.addWindowListener( new WindowAdapter()
				{
					public void windowClosed(WindowEvent e)
					{
						System.exit(0);
					}
					public void windowClosing(WindowEvent e)
					{
						windowClosed(e);
					}
				}
			);

		f.setLayout(new BorderLayout());
		f.add("Center", applet);
		applet.setSize(500,300);
		applet.init();
		applet.start();
		Dimension ps = applet.getPreferredSize();
		f.setBounds(-100,-100,99,99);
		f.setVisible(true);
		f.setVisible(false);
		f.setVisible(true);
		Insets i = f.getInsets();
		f.setBounds(0,0,
			    ps.width+i.left+i.right, 
		            ps.height+i.top+i.bottom);
		f.setVisible(true);
	}

    private class gldemo extends GLAnimCanvas
        implements MouseListener, ActionListener
    {
        private PopupMenu menu = null;
        private boolean menu_showing = false;
        private boolean save_suspended = false;
        private final String VIEW_FRONT  = "View Front";
        private final String VIEW_TOP    = "View Top";
        private final String VIEW_BOTTOM = "View Bottom";

        final float M_PI   = 3.14159265f;
        final float M_PI_2 = 1.57079632f;
	float rotate;
	float rotationStep = 1;
	int view = 0; /* 0 = front, 1 = top, 2 = bottom */

	float LightAmbient[]  = { 0.75f, 0.75f, 0.75f, 1.5f};
	float LightDiffuse[]  = { 1.0f, 1.0f, 1.0f, 0.9f};
	float LightSpecular[] = { 0.8f, 0.8f, 0.8f, 1.0f};

        public gldemo(int w, int h)
        {
            super(w, h);
            GLContext.gljNativeDebug = false;
            GLContext.gljClassDebug = false;
            setAnimateFps(30.0);
        }
    
        public void preInit()
        {
            doubleBuffer = true;
            stereoView = false;
        }
    
        public void init()
        {
		reshape(getSize().width, getSize().height);

		gl.glEnable(GL_LIGHT0);
		gl.glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
		gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
		gl.glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);

		glj.gljCheckGL();

		menu = new PopupMenu("Options");
		menu.add(VIEW_FRONT);
		menu.add(VIEW_TOP);
		menu.add(VIEW_BOTTOM);
		menu.addActionListener(this);
		add(menu);

                addMouseListener(this);
        }
    
        public void doCleanup()
        {
            removeMouseListener(this);
            menu.removeActionListener(this);
        }
    
        public void reshape(int width, int height)
        {
		gl.glMatrixMode(GL_PROJECTION);
		gl.glLoadIdentity();
		glu.gluPerspective(45, (float)width/(float)height, 1, 700);
		gl.glMatrixMode(GL_MODELVIEW);
		gl.glLoadIdentity();
            	gl.glViewport(0,0,width,height);
        }

        public void display()
        {
            	if (glj.gljMakeCurrent() == false) return;

		gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

		gl.glMatrixMode(GL_MODELVIEW);
		gl.glLoadIdentity();

		gl.glTranslatef(0, 0, -5);

	        if(view==1)	
		{
			gl.glRotatef(90f, 1, 0, 0);
		} else if(view==2)	
		{
			gl.glRotatef(-90f, 1, 0, 0);
		}

		gl.glColor4f(1, 1, 1, 1);

		rotate+=rotationStep;
		if(rotate>=180.0f || rotate<=0.0f)
			rotationStep*=-1.0f;

		gl.glRotatef(rotate, 0, 1, 0);


		gl.glBegin(GL_POLYGON);
			gl.glNormal3f( 1, 0, 0);
			
			// top vertex
			gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0,  1,  0);
			// bottom left vertex
			gl.glColor4f(0, 1, 0, 1); gl.glVertex3f(-1, -1,  1);
			// bottom right vertex
			gl.glColor4f(0, 0, 1, 1); gl.glVertex3f( 1, -1,  1);
		gl.glEnd();

		gl.glBegin(GL_POLYGON);
			gl.glNormal3f( 1, 0, 0);
			
			// top vertex
			gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0,  1,  0);
			// bottom left vertex
			gl.glColor4f(0, 1, 0, 1); gl.glVertex3f( 1, -1, -1);
			// bottom right vertex
			gl.glColor4f(0, 0, 1, 1); gl.glVertex3f( 1, -1,  1);
		gl.glEnd();

		gl.glBegin(GL_POLYGON);
			gl.glNormal3f( 1, 0, 0);
			
			// top vertex
			gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0,  1,  0);
			// bottom left vertex
			gl.glColor4f(0, 1, 0, 1); gl.glVertex3f( 1, -1, -1);
			// bottom right vertex
			gl.glColor4f(0, 0, 1, 1); gl.glVertex3f(-1, -1, -1);
		gl.glEnd();

		gl.glBegin(GL_POLYGON);
			gl.glNormal3f( 1, 0, 0);
			
			// top vertex
			gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0,  1,  0);
			// bottom left vertex
			gl.glColor4f(0, 1, 0, 1); gl.glVertex3f(-1, -1,  1);
			// bottom right vertex
			gl.glColor4f(0, 0, 1, 1); gl.glVertex3f(-1, -1, -1);
		gl.glEnd();


		// bottom square polygon
		gl.glBegin(GL_POLYGON);
			gl.glNormal3f( 1, 0, 0);
			
			gl.glColor4f(0, 0, 1, 1); gl.glVertex3f( 1, -1,  1);
			gl.glColor4f(0, 1, 0, 1); gl.glVertex3f(-1, -1,  1);
			gl.glColor4f(0, 0, 1, 1); gl.glVertex3f(-1, -1, -1);
			gl.glColor4f(0, 1, 0, 1); gl.glVertex3f( 1, -1, -1);
		gl.glEnd();


		glj.gljSwap();
		glj.gljCheckGL();
		glj.gljFree();
        }

        // Methods required for the implementation of MouseListener
        public void mouseEntered(MouseEvent evt)
        {
        }
    
        public void mouseExited(MouseEvent evt)
        {
        }
    
        public void mousePressed(MouseEvent evt)
        {
            if (!menu_showing)
            {
                if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
                {
                    menu_showing = true;
                    save_suspended = isSuspended();
                    if (!save_suspended)
                    {
                        setSuspended(true);
                        repaint(100);
                        try
                        {
                            Thread.currentThread().sleep(200);
                        }
                        catch (Exception e)
                        { }
                    }
                    menu.show(this,evt.getX(),evt.getY());
                }
                else
                {
                        // Must be left button.
                    if (isSuspended()) repaint();
                }
            }
            else
            {
                menu_showing = false;
                setSuspended(save_suspended);
            }
        }
    
        public void mouseReleased(MouseEvent evt)
        {
        }
    
        public void mouseClicked(MouseEvent evt)
        {
        }

        // Method required for the implementation of ActionListener
        public void actionPerformed(ActionEvent evt)
        {
            String c = evt.getActionCommand();
            if (c.equals(VIEW_FRONT))
            {
	    	view=0;
            }
            else if (c.equals(VIEW_TOP))
            {
	    	view=1;
            }
            else if (c.equals(VIEW_BOTTOM))
            {
	    	view=2;
            }
            if (menu_showing)
            {
                menu_showing = false;
                setSuspended(save_suspended);
            }
        }
    


   }
}
