
// TexturedPlane.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Vytvoří objekt typu QuadArray s texturou a zapnutým osvětlením.

   Pole může obsahovat jakýkoliv počet vrcholů.
   Textura se aplikuje na každý čtyřúhelník v poli, takže se
   dlaždicově skládá vedle sebe. Uživatelem zadané normálové vektory 
   se aplikují na každý vrchol (předpokládáme, že všechny vrcholy jsou
   součástí roviny).   
*/

import java.util.ArrayList;

import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.*;


public class TexturedPlane extends Shape3D 
{
  private QuadArray plane;
  private int numPoints;


  public TexturedPlane(ArrayList coords, String fnm, Vector3f normal) 
  {
    numPoints = coords.size();
    plane = new QuadArray(numPoints, 
                     GeometryArray.COORDINATES | 
					 GeometryArray.TEXTURE_COORDINATE_2 |
					 GeometryArray.NORMALS  );
    createGeometry(coords, normal);
    createAppearance(fnm);
  } // konec konstruktoru: TexturedPlane()


  private void createGeometry(ArrayList coords, Vector3f normal)
  {
    // nastav souřadnice
    Point3f[] points = new Point3f[numPoints];
    coords.toArray( points );
    plane.setCoordinates(0, points);

    // každému čtyřúhelníku přiřad souřadnice textury
    // proti směru hodinových ručiček počínaje spodním levým rohem
    TexCoord2f[] tcoords = new TexCoord2f[numPoints];
    for(int i=0; i < numPoints; i=i+4) {
      tcoords[i] = new TexCoord2f(0.0f, 0.0f);   // pro 1 bod
      tcoords[i+1] = new TexCoord2f(1.0f, 0.0f);
      tcoords[i+2] = new TexCoord2f(1.0f, 1.0f);
      tcoords[i+3] = new TexCoord2f(0.0f, 1.0f);
    }
    plane.setTextureCoordinates(0, 0, tcoords);

    // všem souřadnicím přiřaď stejné normálové vektory, poněvadž jsou všechny v jendé rovině
    for(int i=0; i < numPoints; i++)
      plane.setNormal(i, normal);

    setGeometry(plane);
  }  // konec metody: createGeometry()


  private void createAppearance(String fnm)
  {
    Appearance app = new Appearance();

    // smíchej texturu a barvu materiálu
    TextureAttributes ta = new TextureAttributes();
    ta.setTextureMode(TextureAttributes.MODULATE);
    app.setTextureAttributes(ta);

    // načti a nastav texturu
    System.out.println("Načítám texturu ze souboru " + fnm);
    TextureLoader loader = new TextureLoader(fnm, null);
    Texture2D texture = (Texture2D) loader.getTexture();
    app.setTexture(texture);      // nastav texturu

    // nastav výchozí bílý materiál
    Material mat = new Material();
    mat.setLightingEnable(true);    // osvětlení je zapnuté
    app.setMaterial(mat);

    setAppearance(app);
  }  // konec metody: createAppearance()

} // konec třídy: TexturedPlane

