/*
    4 Small boxes to show a bug (?) in the Z buffering with transparent objects.
    Use mouse to rotate.
*/
    
import java.awt.*;
import javax.swing.JFrame;
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;

class ZBuffer extends JFrame
{
    Canvas3D canvas;
    BranchGroup worldRoot;
    SimpleUniverse u;

    ZBuffer()
    {
        Container container = getContentPane();
        container.setLayout(new BorderLayout());
        canvas = new Canvas3D(null);
        canvas.setSize(800, 600);
        container.add("Center", canvas);

        u = new SimpleUniverse(canvas);
        BranchGroup branchgroup = new BranchGroup();

        BoundingSphere boundingsphere = new BoundingSphere(new Point3d(0.0D, 0.0D, 0.0D), 1000D);

        TransformGroup transformgroup = new TransformGroup();
        transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        transformgroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

        TransparencyAttributes transparencyattributes = new TransparencyAttributes();
        transparencyattributes.setTransparencyMode(TransparencyAttributes.NICEST);
        transparencyattributes.setTransparency(0.1F);
        Appearance appearance0 = new Appearance();
        appearance0.setTransparencyAttributes(transparencyattributes);
        appearance0.setColoringAttributes(new ColoringAttributes(0.0F, 1.0F, 0.0F, 1));
        Appearance appearance1 = new Appearance();
        appearance1.setTransparencyAttributes(transparencyattributes);
        appearance1.setColoringAttributes(new ColoringAttributes(1.0F, 0.0F, 0.0F, 1));
        Appearance appearance2 = new Appearance();
        appearance2.setColoringAttributes(new ColoringAttributes(0.0F, 1.0F, 0.0F, 1));
        Appearance appearance3 = new Appearance();
        appearance3.setColoringAttributes(new ColoringAttributes(1.0F, 0.0F, 0.0F, 1));

        Primitive box[] = new Primitive[4];
        box[0] = new Box(0.1F, 0.1F, 0.1F, appearance0);
        box[1] = new Box(0.1F, 0.1F, 0.1F, appearance1);
        box[2] = new Box(0.1F, 0.1F, 0.1F, appearance2);
        box[3] = new Box(0.1F, 0.1F, 0.1F, appearance3);

        Transform3D transform3d = new Transform3D();
        TransformGroup transform[] = new TransformGroup[4];
        transform[0] = new TransformGroup();
        transform[1] = new TransformGroup();
        transform[2] = new TransformGroup();
        transform[3] = new TransformGroup();
        transform3d.setTranslation(new Vector3f(-0.2F, 0.0F, 0.2F));
        transform[0].setTransform(transform3d);
        transform3d.setTranslation(new Vector3f(-0.2F, 0.0F, -0.2F));
        transform[1].setTransform(transform3d);
        transform3d.setTranslation(new Vector3f(0.2F, 0.0F, 0.2F));
        transform[2].setTransform(transform3d);
        transform3d.setTranslation(new Vector3f(0.2F, 0.0F, -0.2F));
        transform[3].setTransform(transform3d);

        transform[0].addChild(box[0]);
        transform[1].addChild(box[1]);
        transform[2].addChild(box[2]);
        transform[3].addChild(box[3]);
        transformgroup.addChild(transform[0]);
        transformgroup.addChild(transform[1]);
        transformgroup.addChild(transform[2]);
        transformgroup.addChild(transform[3]);

        branchgroup.addChild(transformgroup);

        MouseRotate mouserotate = new MouseRotate();
        mouserotate.setTransformGroup(transformgroup);
        transformgroup.addChild(mouserotate);
        mouserotate.setSchedulingBounds(boundingsphere);

        branchgroup.compile();
        u.getViewingPlatform().setNominalViewingTransform();
        u.addBranchGraph(branchgroup);
    }

    public static void main(String args[])
    {
        ZBuffer zbuffer = new ZBuffer();
        zbuffer.pack();
        zbuffer.setVisible(true);
    }

}
