import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.picking.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.picking.*;

/**
 * Class:       IntersectInfoBehavior
 * 
 * Description: Used to respond to mouse pick and drag events
 *              in the 3D window. Displays information about the pick.
 *
 * Version:     1.0
 *
 */
public class IntersectInfoBehavior extends Behavior 
{
    Canvas3D         canvas;
    float            size;
    PickCanvas       pickCanvas;
    PickObject       pickObject;
    PickResult[]     pickResult;
    Appearance       oldlook, redlookwf, redlook, greenlook, bluelook;  
    Node             oldNode  = null;
    GeometryArray    oldGeom  = null;
    Color3f          redColor = new Color3f (1.0f, 0.0f, 0.0f);
    TransformGroup[] sphTrans = new TransformGroup [6];
    Sphere[]         sph      = new Sphere [6];
    Transform3D      spht3    = new Transform3D();

  public IntersectInfoBehavior(Canvas3D canvas3D, BranchGroup branchGroup, 
                float size) {
      canvas = canvas3D;
          pickObject = new PickObject(canvas3D, branchGroup);
  }

  public void initialize() {
    wakeupOn (new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED 
        | MouseEvent.MOUSE_MOTION_EVENT_MASK));
  }

  public void processStimulus (Enumeration criteria) {
    WakeupCriterion wakeup;
    AWTEvent[]      event;
    int             eventId;
        Node                    node = null;

    while (criteria.hasMoreElements()) {
      wakeup = (WakeupCriterion) criteria.nextElement();

      if (wakeup instanceof WakeupOnAWTEvent) {
                  event = ((WakeupOnAWTEvent)wakeup).getAWTEvent();

        for (int i=0; i<event.length; i++) { 
          eventId = event[i].getID();

          if (eventId == MouseEvent.MOUSE_PRESSED) {
            int x = ((MouseEvent)event[i]).getX();
            int y = ((MouseEvent)event[i]).getY();
                
                SceneGraphPath sgp = pickObject.pickClosest(x, y);
                if(sgp != null) node=sgp.getNode(0);

            if (node != null) {
                        System.out.println("Picked object = " + node.toString());
                        // Get closest intersection results
      // my codes
      PickRay ray = (PickRay) pickObject.generatePickRay(x, y);
      PickResult pr = new PickResult(sgp, ray);
      
      if(pr.numIntersections() > 0) {
        System.out.println("Num of Intersection :" + pr.numIntersections());      
      }
      //
            }
            else {
                        Cursor cursor = new Cursor(Cursor.DEFAULT_CURSOR);
                        canvas.setCursor(cursor);
            } // end of else
          }
          else if (eventId == MouseEvent.MOUSE_MOVED) {
              int x = ((MouseEvent)event[i]).getX();
              int y = ((MouseEvent)event[i]).getY();
              
                  SceneGraphPath sgp = pickObject.pickClosest(x, y);
                  if(sgp != null) node = sgp.getNode(0);

              if (node != null) {
                          Cursor cursor = new Cursor(Cursor.CROSSHAIR_CURSOR);
                          canvas.setCursor(cursor);
              }
              else {
                          Cursor cursor = new Cursor(Cursor.DEFAULT_CURSOR);
                          canvas.setCursor(cursor);
              } // end of 
              
          } // end of 
        }
      }
    }
    wakeupOn (new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED 
        | MouseEvent.MOUSE_MOTION_EVENT_MASK));
  }
}
