//

package render;

import java.awt.*;

/*
 * Created on Jan 13, 2004
 *  
 */

/**
 * @author Du Nguyen
 *  
 */

public class InteractiveMesh extends Geometry {

   int pixels[];
   Texture texture;
   int W, H;

   boolean dragging = true;
   boolean damage = true;
   
   public InteractiveMesh() {
   }

   /**
	  *  Constructor
	  * @param m number of rows in the mesh
	  * @param n number of columns in the mesh
	  * @param w width of the mesh in pixels
	  * @param h height of the mesh in pixels
	  */
   public InteractiveMesh(int m, int n, int w, int h, int[] pix) {
      super();
      pixels = pix;
      Geometry g = this.add();
      W = w;
      H = h;
      texture = new Texture(pixels, W, H, "grid", false);
      Material material = new Material();
      material.setTexture(texture);
      g.setMaterial(material);
      g.setDoubleSided(true);
      g.mesh(m, n);
   }

   /**
    * Converts world coordinates to relative coordinates
    * @param wp
    * @return
    */
   public double[] getXYZ(double wp[]) {
      double[] p = new double[4];
      Matrix transmat = new Matrix();
      transmat.invert(matrix);
      xf(transmat, wp[0], wp[1], wp[2], p);
      return p;
   }

   /**
    * Converts relative coordinates to world coordinates
    * @param xyz
    * @return
    */
   public int[] getXY(double[] xyz) {
      double p[] = getXYZ(xyz);
      int point[] = new int[2];
      point[0] = (int) ((p[0] + 1) * W / 2);
      point[1] = (int) ((p[1] + 1) * H / 2);
      return point;
   }

   /**
    * Returns true if Geometry g is selected
    * @param g
    * @return
    */
   public boolean isSelected(Geometry g) {
      Geometry mg = this;
      if (mg == g)
         return true;
      return find(mg, g);
   }

   public boolean find(Geometry level, Geometry g) {
      if (level.child == null)
         return false;
      if (level.child.length == 0)
         return false;
      for (int i = 0; i < level.child.length; i++) {
         if (level.child[i] == g)
            return true;
         return find(level.child[i], g);
      }
      return false;

   }

   private void xf(Matrix m, double x, double y, double z, double v[]) {
      for (int j = 0; j < 3; j++)
         v[j] = m.get(j, 0) * x + m.get(j, 1) * y + m.get(j, 2) * z + m.get(j, 3);
   }
      
   
   public void animate(double time) {
   }


   //Mouse handling
   public boolean mouseUp(Event evt, double[] xyz) {
      boolean ret = dragging;
      dragging = false;
      return ret;
   }

   public boolean mouseDown(Event evt, double[] xyz, Geometry g) {
      dragging = isSelected(g);
      return dragging;
   }

   public boolean mouseDrag(Event evt, double[] xyz) {
      return dragging;
   }

}