
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.Sphere;

import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.image.*;

import java.awt.image.BufferedImage;
import javax.media.j3d.ImageComponent2D;
import java.awt.image.*;

import java.awt.geom.*;

import java.util.Random;

public class AnimatedTextureJ3D extends Applet{
  int imgwidth = 256;
  int imgheight = 256;
  Texture2D tex;
  JMFTexture2D jtex;
  Random r;
  BufferedImage bi;
  Canvas3D c;
  
  public BranchGroup createSceneGraph() {
    // Create the root of the branch graph
      BranchGroup objRoot = new BranchGroup();
     
    // Create TransformGroup for scaling children
    TransformGroup objScale = new TransformGroup();
    Transform3D t3d = new Transform3D();
    t3d.setScale(0.5);
    objScale.setTransform(t3d);
    objRoot.addChild(objScale);

    // Create the TransformGroup for rotation; must enable WRITE and READ capablility bits

    TransformGroup objTrans = new TransformGroup();
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
    objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
    objScale.addChild(objTrans);
 
    Appearance app = new Appearance();
    app.setCapability(Appearance.ALLOW_TEXTURE_WRITE);
       

    Sphere sphere = new Sphere(1.f, Sphere.GENERATE_TEXTURE_COORDS, 32, app);

    objTrans.addChild(sphere);
    jtex = new JMFTexture2D(c);
  
   // app.setTexture(tex);
     
    BoundingSphere bounds =
      new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
    
    // Create the rotate behavior node
    MouseRotate behavior = new MouseRotate(objTrans);
    objTrans.addChild(behavior);
    behavior.setSchedulingBounds(bounds);
    
    return objRoot;
  }

  public AnimatedTextureJ3D (){
      
    r = new Random();  
   
    setLayout(new BorderLayout());
    GraphicsConfiguration config =
       SimpleUniverse.getPreferredConfiguration();

    c = new Canvas3D(config);
    add("Center", c);
   
    BranchGroup scene = createSceneGraph();

    KeyHandler kh = new KeyHandler(this);
    c.addKeyListener(kh);
    SimpleUniverse u = new SimpleUniverse(c);

    u.getViewingPlatform().setNominalViewingTransform();

    u.addBranchGraph(scene);
  }
  
 
    
 public static void main(String argv[]) {
    new MainFrame(new AnimatedTextureJ3D(), 750, 750);
 }
} 



class KeyHandler implements KeyListener {
     AnimatedTextureJ3D at;
     
     public KeyHandler(AnimatedTextureJ3D at) {
         this.at = at; 
     } 
     public void keyReleased(java.awt.event.KeyEvent p1) {
     }
  
     public void keyPressed(java.awt.event.KeyEvent p1) {
   
    
     }
  
     public void keyTyped(java.awt.event.KeyEvent p1) {
     }
  
}

