package graph;

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

public class BugTest extends Applet {
    boolean useLight = true;
    int numViews = 0;
    double viewOffset = 10;
    SharedGroup sharedScene = new SharedGroup();
    BranchGroup sceneBG = new BranchGroup();
    
    public BugTest() {
        setLayout( new BorderLayout() );
        VirtualUniverse u = new VirtualUniverse();
        Locale locale = new Locale( u );
        BranchGroup scene = new BranchGroup();
        scene.addChild( new ColorCube( .3f ) );
        if( useLight ){
            AmbientLight al = new AmbientLight();
            al.setInfluencingBounds( new BoundingSphere( new Point3d(), Double.POSITIVE_INFINITY ) );
            scene.addChild( al );
        }

        sharedScene.addChild( scene );
        Button cloneB = new Button( "Clone" );
        cloneB.addActionListener( new ActionListener(){
            public void actionPerformed( ActionEvent e ){
                BugTest.this.cloneView();
            }
        });
        
        sceneBG.setCapability( Group.ALLOW_CHILDREN_EXTEND );
        sceneBG.setCapability( Group.ALLOW_CHILDREN_WRITE );
        locale.addBranchGraph( sceneBG );
        Panel p = createView();
        p.add( "South", cloneB );
        add( p );
    }
    public Frame cloneView(){
        Frame f = new Frame( "Clone" );
        f.setSize( 100, 100 );
        Panel p = createView();
        f.setLayout( new BorderLayout() );
        f.add( "Center", p );
        f.show();
        return f;
    }
    public Panel createView(){
        Transform3D T = new Transform3D();
        BranchGroup viewBG = new BranchGroup();
        T.set( new Vector3d( 0, 0, numViews*viewOffset ) );
        TransformGroup bubbleTG = new TransformGroup( T );
        T.set( new Vector3d( 0, 0, 2 ) );
        TransformGroup viewTG = new TransformGroup( T );
        ViewPlatform vp = new ViewPlatform();
        Link link = new Link( sharedScene );
        
        Canvas3D c = new Canvas3D( SimpleUniverse.getPreferredConfiguration() );
        View view = new View();{
            view.setPhysicalBody( new PhysicalBody() );
            view.setPhysicalEnvironment( new PhysicalEnvironment() );
            view.attachViewPlatform( vp );
            view.addCanvas3D( c );
        }
        
        viewBG.addChild( bubbleTG );
            bubbleTG.addChild( viewTG );
                viewTG.addChild( vp );
            bubbleTG.addChild( link );
        sceneBG.addChild( viewBG );
        
        Panel p = new Panel();
        p.setLayout( new BorderLayout() );
        p.add( "Center", c );
        numViews++;                        
        return p;
    }
    public static void main(String[] args) {
        new MainFrame(new BugTest(), 1000, 700 );
    }
}
