import java.awt.*;
import java.awt.event.*;
import com.hermetica.magician.*;
import com.hermetica.util3d.*;

public class BasicGL extends Frame implements GLEventListener
{

    /* The OpenGL state machine */
    CoreGL gl = new CoreGL();
    CoreGLU glu = new CoreGLU();

    /* OpenGL-aware AWT Component */
    GLComponent glc = null;

    /* Dimensions of the OpenGL component */
    private static final int WIDTH = 300;
    private static final int HEIGHT = 300;

    public BasicGL()
    {

      /* Create the OpenGL Component and add it to the frame */
      glc = (GLComponent)GLDrawableFactory.createGLComponent( WIDTH, HEIGHT );
      add(glc);

      /* pack the frame and make it visible */
      pack();
      setVisible(true);

      /* Setup the capabilities of the OpenGL rendering context */
      GLCapabilities cap = glc.getContext().getCapabilities();
      cap.setColourBits( 24 );
      cap.setDepthBits( 12 );
      cap.setDoubleBuffered( GLCapabilities.DOUBLEBUFFER );

      /* Register the GLEventListener with the GLComponent */
      glc.addGLEventListener( this );

      /* Tell the component to process and generate events */
      glc.initialize();
    }

    /* Initializes the application */
    public void initialize( GLDrawable component )
    {  
      System.out.println("=======Metodo initialize=======");
      System.out.println("Chiamato quando una sola volta all'inizio");
      System.out.println("Qui mettere codice che inizializza opengl");
      System.out.println("(es: abilitazione dell'eliminazione delle");
      System.out.println("(superfici nascoste, delle luci...)");
    }

    /* Handles viewport resizing */
    public void reshape( GLDrawable component, 
                         int x, int y, int width, int height )
    {
      System.out.println("=======Metodo reshape=======");
      System.out.println("Chiamato quando la glComponent cambia dimensione.");
      System.out.println("Qui mettere codice che esegue adattamento della");
      System.out.println("resa grafica ad una finestra di dimensioni ed");
      System.out.println("eventualmente proporzioni diverse");
      gl.glViewport(component, x,y, width,height);
    }

    /* Renders the scene */
    public void display( GLDrawable component )
    {
      System.out.println("=======Metodo display=======");
      System.out.println("Chiamato quando la glComponent necessita di");
      System.out.println("ridisegnarsi.");
      System.out.println("Qui mettere codice che esegue il disegno");
      System.out.println("(pulitura dello sfondo e tracciamento delle");
      System.out.println("primitive geometriche)");
      gl.glClear(GL.GL_COLOR_BUFFER_BIT);
    }

    /* Returns the current GL pipeline for this listener */
    public GL getGL() {  return gl;  }

    public static void main( String argv[] )
    {
      BasicGL b = new BasicGL();
    }

}
