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

public class Simple3D extends BasicGL
{

/******* NUOVE VARIABILI DI QUESTA CLASSE *******/

    /*
    Due angoli che individuano la direzione del punto di vista:
    uno misurato sul piano xy, come distanza angolare dall'asse x, e
    uno misurato su un piano verticale, come distanza angolare dal piano xy.
    */
    float ang1 = 0.0f;
    float ang2 = 0.0f;

    /* Posizione ultima del cursore */
    int cursor_x;
    int cursor_y;

/******* NUOVE FUNZIONI DI QUESTA CLASSE *******/

    /* costruttore */
    public Simple3D() 
    {
       super();

       glc.addMouseMotionListener ( new MouseMotionAdapter()
       {
          public void mouseDragged( MouseEvent evt )
          {
             int width = evt.getComponent().getSize().width;
             int height = evt.getComponent().getSize().height;
             int x = evt.getX() - cursor_x;
             int y = evt.getY() - cursor_y;
             ang1 += x;
             ang2 += y;
             cursor_x += x;
             cursor_y += y;
             glc.repaint();
          }
       } );

       glc.addMouseListener ( new MouseAdapter()
       {
          public void mousePressed( MouseEvent evt )
          {
             cursor_x = evt.getX();
             cursor_y = evt.getY();
          }
       } );

     }

    /* Draws a pyramid */
    void draw_pyramid()
    {
       gl.glBegin(GL.GL_TRIANGLES);

       /* primo triangolo */
       gl.glColor3f(1.0f,0.0f,0.0f);
       gl.glVertex3f(0.25f,0.25f,-0.25f);
       gl.glVertex3f(-0.2f,-0.15f,-0.25f);
       gl.glVertex3f(0.2f,-0.15f,-0.25f);

    /* secondo triangolo */
       gl.glColor3f(1.0f,1.0f,0.0f);
       gl.glVertex3f(0.25f,0.25f,-0.25f);
       gl.glVertex3f(0.0f,0.0f,0.25f);
       gl.glVertex3f(0.2f,-0.15f,-0.25f);

    /* terzo triangolo */
       gl.glColor3f(0.0f,1.0f,0.0f);
       gl.glVertex3f(0.25f,0.25f,-0.25f);
       gl.glVertex3f(-0.2f,-0.15f,-0.25f);
       gl.glVertex3f(0.0f,0.0f,0.25f);

    /* quarto triangolo */
       gl.glColor3f(0.0f,0.0f,1.0f);
       gl.glVertex3f(-0.2f,-0.15f,-0.25f);
       gl.glVertex3f(0.2f,-0.15f,-0.25f);
       gl.glVertex3f(0.0f,0.0f,0.25f);

       gl.glEnd();
    }

/******* FUNZIONI EREDITATE DALLA SUPERCLASSE E RIDEFINITE *******/

    /* Initializes the application */
    public void initialize( GLDrawable component )
    {  
      gl.glEnable(GL.GL_DEPTH_TEST);
    }

    /* Renders the scene */
    public void display( GLDrawable component )
    {
      /* "pulisce il foglio" prima di mettersi a disegnare */
      gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);


      /* trasformazione di proiezione e' quella di default (ortogonale,
         inquadra il cubo di coordinate fra -1 e +1 */

      /* trasformazione di vista fa "orbitare" il punto di vista attorno
         alla scena secondo i due angoli in view_ang, tenendo lo sguardo
         sempre puntato sulla scena:
         - ruota di angolo -ang1 attorno all'asse z
         - ruota di angolo -ang2 attorno all'asse x
         - infine si porta a distanza 0.5 dalla scena
         nel codice le trasformazioni sono scritte in ordine inverso!
      */
      gl.glMatrixMode(GL.GL_MODELVIEW); 
      gl.glLoadIdentity(); 
      gl.glTranslatef(0.0f,0.0f,-0.5f);
      gl.glRotatef(-ang2,1.0f,0.0f,0.0f); 
      gl.glRotatef(-ang1,0.0f,0.0f,1.0f);

      /* visualizza la scena */
      gl.glPolygonMode(GL.GL_FRONT_AND_BACK,GL.GL_FILL);
      draw_pyramid();
    }

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

