import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.behaviors.vp.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class CrashTest extends Applet
{

    ViewingPlatform vp;
    ImageComponent2D ic2d;

    {
        BufferedImage bi = new BufferedImage(300,100,BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D g2 = (Graphics2D)bi.getGraphics();
        g2.transform(new java.awt.geom.AffineTransform(1,0,0,-1,0,100));
        g2.drawString("Test string to show overlays are possible",40,50);
        g2.setColor(new Color(192,0,0));
        g2.draw3DRect(30,20,240,60,true);
        ic2d = new ImageComponent2D(ImageComponent.FORMAT_RGB8,bi,true,true);
    }

    public BranchGroup createSceneGraph(Canvas3D c)
    {
        
        BranchGroup objRoot = new BranchGroup();

        // Create a bounds for the background and behaviors
        BoundingSphere bounds =
            new BoundingSphere(new Point3d(0.0,0.0,0.0), 1000.0);

        // Set up the background
        Color3f bgColor = new Color3f(0.95f, 0.05f, 0.2f);

        return objRoot;        
    }    
    
    private SimpleUniverse u = null;
    
    public void init()
    {
        setLayout(new BorderLayout());
        GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();

        GraphicsConfiguration config = GraphicsEnvironment.getLocalGraphicsEnvironment().
                getDefaultScreenDevice().getBestConfiguration(template);
        Canvas3D c = new Canvas3D(config);
        add(BorderLayout.CENTER, c);
        
        
        u = new SimpleUniverse(c);

        vp = u.getViewingPlatform();
        BranchGroup scene = createSceneGraph(c);
        u.addBranchGraph(scene);

        PlatformGeometry pg = new PlatformGeometry();
        javax.media.j3d.Raster rast = new Raster();
        rast.setSize(ic2d.getWidth(),ic2d.getHeight());
        rast.setPosition(new Point3f(-0.25f,-0.1f,-1f));
        rast.setImage(ic2d);
        Appearance app = new Appearance();
        app.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.BLENDED,0.5f));
        Shape3D sh = new Shape3D(rast,app);
        pg.addChild(sh);
        
        
        vp.setPlatformGeometry(pg);
    }
    
    public void destroy()
    {
        u.removeAllLocales();
    }
    
    public static void main(String[] args) throws Exception
    {
        CrashTest wt = new CrashTest();
        new MainFrame(wt, 700, 700);
    }
}