import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame; 
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class genShape extends Applet
{
 public static void main( String args[] )
 {
  new MainFrame( new genShape(), 650,500);
 }
 public genShape()
 {
  Canvas3D canvas = new Canvas3D( null );
  setLayout( new BorderLayout() );
  add( "Center", canvas );

  SimpleUniverse sUni = new SimpleUniverse( canvas );
  sUni.getViewingPlatform().setNominalViewingTransform();
  sUni.addBranchGraph( getScene() );
 }
 public BranchGroup getScene()
 {
  BoundingSphere bounds = new  BoundingSphere();
  BranchGroup branchRoot = new BranchGroup();

  //move the whole scene back along the z axis a little
  Transform3D back = new Transform3D();
  back.set( new Vector3f( 0,0,-3.0f) );
  TransformGroup zMove = new TransformGroup( back );
  branchRoot.addChild( zMove );

  Transform3D spin = new Transform3D();
  TransformGroup spinner = new TransformGroup( spin );
   spinner.setCapability( TransformGroup.ALLOW_TRANSFORM_WRITE);
  zMove.addChild( spinner );
  Alpha rot = new Alpha( -1, 4000 );
  RotationInterpolator rotator = new RotationInterpolator( rot, spinner );
  rotator.setSchedulingBounds( bounds );
  spinner.addChild( rotator );
  //add the plane made from a triangle strip array
  spinner.addChild( getPlane() );

  branchRoot.compile();
  return branchRoot;
 }
 public Appearance getPlaneAppearance()
 {
  Appearance appearance = new Appearance();
  PolygonAttributes polyAttrib = new PolygonAttributes();
  polyAttrib.setCullFace( PolygonAttributes.CULL_NONE );
  polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
  appearance.setPolygonAttributes(polyAttrib);

  return appearance;
 }
 public Shape3D getPlane()
 {
  TriangleStripArray tsa;
  Point3f coords[] = new Point3f[12];

  //we are only using a single strip with 6 coords
  int stripCounts[] = {12};
  
  coords[0] = new Point3f( 0.0f,0.0f,0.0f);
  coords[1] = new Point3f( 1.0f,0.0f,-0.5f);
  coords[2] = new Point3f( 1.0f,0.5f,0.0f);

  coords[3]=new Point3f( 1.0f,0.5f,0.0f);
  coords[4]=new Point3f( 0.0f,1.0f,0.0f);
  coords[5]=new Point3f( 1.0f,1.0f,-0.5f);

  coords[6]=new Point3f( 0.0f,1.0f,0.0f);
  coords[7]=new Point3f( -1.0f, 1.0f,-0.5f);
  coords[8]=new Point3f( -1.0f,0.5f,0.0f );

  coords[9]=new Point3f( -1.0f,0.5f,0.0f);
  coords[10]=new Point3f( 0.0f,0.0f,0.0f);
  coords[11]=new Point3f( -1.0f,0.0f,-0.5f);
    
  tsa = new TriangleStripArray( 12, TriangleStripArray.COORDINATES, stripCounts);
  tsa.setCoordinates( 0, coords );
  Shape3D tPlane = new Shape3D();
  tPlane.setGeometry( tsa );
  tPlane.setAppearance( getPlaneAppearance() );
  return tPlane;
 }
}
