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

/* Objekt typu ImagesCsSeries je "obrazovkou" se středem v bodu (0,0,0),
   která umí zobrazit obrázek ze série získané při svém vytvoření.

   Rozměry stran obrazovky jsou stanoveny v proměnné screenSize.

   Obrazovka je odvozena od třídy OrientedShape3D a nastavena tak,
   aby se otáčela kolem bodu (0,0, zCoord) vzhledem k výhledu uživatele.

   Série obrázků je uložena v poli objektu typu ImageComponent2D.
 
   Standardně se zobrazí první obrázek v poli a pro jeho změnu
   musejí být explicitně zavolány jisté metody. Žádná výchozí 
   animace zde neexistuje.

   Verze třídy ImageCsSeries s výchozí animace se nachází v adresáři
   FPShooter3D.
*/

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


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

  private ImageComponent2D[] ims;  // sekvence obrázků
  private int imIndex, numImages;
  private Texture2D texture;


  public ImageCsSeries(float zCoord, float screenSize, ImageComponent2D[] ims) 
  { 
    this.ims = ims;
    imIndex = 0;
    numImages = ims.length;

    // nastav mód natočení
    setAlignmentMode(OrientedShape3D.ROTATE_ABOUT_POINT);
    setRotationPoint(0.0f, 0.0f, zCoord);

    createGeometry(screenSize);
    createAppearance();
  } // konec metody: ImageCsSeries()



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

    // obraz je vycentrován na střed, jeho velikost je screenSize a směřuje podél kladné osy z
    Point3f p1 = new Point3f(-sz/2, -sz/2, 0.0f);
    Point3f p2 = new Point3f(sz/2, -sz/2, 0.0f);
    Point3f p3 = new Point3f(sz/2, sz/2, 0.0f);
    Point3f p4 = new Point3f(-sz/2, sz/2, 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);

    // připrav souřadnice textury pro umístění obrázku
    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()
  {                       
    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ř dvourozměrnou texturu s magnifikačním filtrováním
    // Nastav texturu z prního načteného obrázku
    texture = new Texture2D(Texture2D.BASE_LEVEL, Texture.RGBA,
                       ims[0].getWidth(), ims[0].getHeight());
    texture.setMagFilter(Texture2D.BASE_LEVEL_LINEAR);   // nejhezčí
    texture.setImage(0, ims[0]);
    texture.setCapability(Texture.ALLOW_IMAGE_WRITE);   // texturu lze změnit
    app.setTexture(texture);
   
    setAppearance(app);
  }  // konec metody: createAppearance()


  public void showImage(int i)
  // zobrazí obrázek na i-té pozici sekvence
  { 
    if (i < 0) {
      texture.setImage(0, ims[0]);
      imIndex = 0;
    }
    else if (i >= numImages) {
      texture.setImage(0, ims[numImages-1]);
      imIndex = numImages-1;
    }
    else {
      texture.setImage(0, ims[i]);
      imIndex = i;
    }
  }  // konec metody: showImage()


  public void showNext()
  // zobrazí následující obrázek v sekvenci
  { if (imIndex < numImages-1) {
      imIndex++;
      texture.setImage(0, ims[imIndex]);
    }
  }

  public void showPrev()
  // zobrazí předchozí obrázek v sekvenci
  { if (imIndex > 0) {
      imIndex--;
      texture.setImage(0, ims[imIndex]);
    }
  }

} // konec třídy: ImageCsSeries