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

/* Pomocí pole QuadArray zobrazí průhledný obrázek typu GIF.

   Střed základny čtyřúhelníka je v bodě (0,0,0), takže leží 
   na zemi. Jeho strany mají velikost screenSize a je vždy
   natočen směrem v pozorovateli.

   Cílem je načíst scenérii, která může být reprezentována 2D-obrázky,
   které jsou stále natočené k pozorovateli, jako jsou stromy, rostliny, atp.

   Pro vylepšení vhledu obrázku při pohledu zblízka a zdálky se 
   používá min- a mag- filtrování.
*/

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


public class GroundShape extends OrientedShape3D
{
  private static final int NUM_VERTS = 4;


  public GroundShape(float screenSize, String fnm) 
  { 
    // pro sledování pozorovatele rotuj kolem osy y
	setAlignmentAxis( 0.0f, 1.0f, 0.0f);

    createGeometry(screenSize);
    createAppearance(fnm);
  } // konec metody: GroundShape()


  private void createGeometry(float sz)
  {
    QuadArray plane = new QuadArray(NUM_VERTS, 
							GeometryArray.COORDINATES |
							GeometryArray.TEXTURE_COORDINATE_2 );

    // střed základny je bodu (0,0,0), její velikost je screenSize, 
    // směřuje podél kládné osy z
    Point3f p1 = new Point3f(-sz/2, 0.0f, 0.0f);
    Point3f p2 = new Point3f(sz/2, 0.0f, 0.0f);
    Point3f p3 = new Point3f(sz/2, sz, 0.0f);
    Point3f p4 = new Point3f(-sz/2, sz, 0.0f);

    // proti směru hodinových ručiček od spodního levého rohu
    plane.setCoordinate(0, p1);
    plane.setCoordinate(1, p2);
    plane.setCoordinate(2, p3);
    plane.setCoordinate(3, p4);

    TexCoord2f q = new TexCoord2f();
    q.set(0.0f, 0.0f);    
    plane.setTextureCoordinate(0, 0, q);
    q.set(1.0f, 0.0f);   
    plane.setTextureCoordinate(0, 1, q);
    q.set(1.0f, 1.0f);    
    plane.setTextureCoordinate(0, 2, q);
    q.set(0.0f, 1.0f);   
    plane.setTextureCoordinate(0, 3, q);  

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


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

    // míchání barev s průhledností; textura může mít nepravidelná tvar
    TransparencyAttributes tra = new TransparencyAttributes();
    tra.setTransparencyMode( TransparencyAttributes.BLENDED );
    app.setTransparencyAttributes( tra );

    // vytvoř dvojdimenzionální texturu s min. a mag. filtorváním
    TextureLoader loader = new TextureLoader(fnm, null);
    Texture2D tex = (Texture2D) loader.getTexture();
    if (tex == null)
      System.out.println("Načítání obrázku selhalo: " + fnm);
    else {
      tex.setMinFilter(Texture2D.BASE_LEVEL_LINEAR);
      tex.setMagFilter(Texture2D.BASE_LEVEL_LINEAR);
      app.setTexture(tex);
    }

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


} // konec třídy: GroundShape