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

/* Zobrazuje série obrázku typu GIF, které jsou umístěné na 
   průhledném objektu typu QuadArray na rovině XZ se středem
   v bodě (0,0).
*/

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


public class ImagesSeries extends Shape3D
{
  private static final int DELAY = 100;   // prodleva mezi snímky v milisekundách
  private static final int NUM_VERTS = 4;

  private ImageComponent2D ims[];
  private Texture2D texture;


  public ImagesSeries(float screenSize, String fnm, int num) 
  {
    loadImages(fnm, num);
    createGeometry(screenSize);
    createAppearance();
  } // konec metody: ImagesSeries()


  private void loadImages(String fnm, int num)
  {
    String filename;
    TextureLoader loader;

    ims = new ImageComponent2D[num];

    System.out.println("Načítám " + num + " obrázky typu GIF jménem " + fnm);
    for (int i=0; i < num; i++) {
      filename = new String(fnm + i + ".gif");
      loader = new TextureLoader(filename, null);
      ims[i] = loader.getImage();
      if(ims[i] == null)
        System.out.println("Načítání obrázku selhalo: " + filename);
    }
  }  // konec metody: loadImages()



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

    // obrazovka leží v rovině XZ se středem v bodě (0,0)
    // a velikosti screenSize
    Point3f p1 = new Point3f(-screenSize/2, 0.0f, 0.0f);
    Point3f p2 = new Point3f(screenSize/2, 0.0f, 0.0f);
    Point3f p3 = new Point3f(screenSize/2, screenSize, 0.0f);
    Point3f p4 = new Point3f(-screenSize/2, screenSize, 0.0f);

    // proti směru hodinových ručiček od dolní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()
  {                       
    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 );
/*
    // smíchej texturu a barvu materiálu
    TextureAttributes ta = new TextureAttributes();
    ta.setTextureMode(TextureAttributes.MODULATE);
    app.setTextureAttributes(ta);

    Material mat = new Material();    // nastav materiál a osvětlení
    mat.setLightingEnable(true);
    app.setMaterial(mat);
*/
    // Vytvoř dvourozměrnou texturu
    // 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.setImage(0, ims[0]);
    texture.setCapability(Texture.ALLOW_IMAGE_WRITE);   // texturu lze změnit
    app.setTexture(texture);
   
    setAppearance(app);
  }  // konec metody: createAppearance()


  public void showSeries()
  {
    for (int i=0; i < ims.length; i++) {
      texture.setImage(0, ims[i]);
      try {
        Thread.sleep(DELAY);      // chvíli posečkej
      } 
      catch (Exception ex) {}
    }
  } // konec metody: showSeries()


} // konec třídy: ImagesSeries