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

/* Ukazuje řadu obrázku jako animaci, zobrazenou na průhledném poli typu QuadArray.
   Střed čtverce je ve středu, jeho strany mají rozměry screenSize a čelem
   směřuje podél kladné poloosy z.
   Obrázky jsou již načteny do pole typu ImageComponent2D, které třída obdrží ve
   svém konstruktoru.

   Tato verze třídy ImagesSeries z adresáře /Shooter3D nenačítá vlastní obrázky
   a sama stanoví střed pro příslušné čtverce.
*/

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


public class ImageCsSeries 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 ImageCsSeries(Point3f center, float screenSize, ImageComponent2D[] ims) 
  { this.ims = ims;
    createGeometry(center, screenSize);
    createAppearance();
  } // konec metody: ImageCsSeries()



  private void createGeometry(Point3f c, 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(c.x-sz/2, c.y-sz/2, c.z);
    Point3f p2 = new Point3f(c.x+sz/2, c.y-sz/2, c.z);
    Point3f p3 = new Point3f(c.x+sz/2, c.y+sz/2, c.z);
    Point3f p4 = new Point3f(c.x-sz/2, c.y+sz/2, c.z);

    // proti směru hodinových ručiček počínaje levým dolním rohem
    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 );

    // 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);   // nejkrásnější
    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: ImageCsSeries