/*
 * Canvas3DintFrame.java
 *
 * Created on 08 August 2001, 18:49
 */

import java.awt.*;


import java.awt.event.*;
import javax.swing.*;

import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import com.sun.j3d.utils.geometry.*;

import javax.vecmath.*;
import javax.media.j3d.*;
import java.awt.GraphicsConfiguration;
/**
 *
 * @author  dymaxion
 * @version
 */
public class Canvas3DintFrame extends JInternalFrame implements ActionListener {

    private int layer = 1;
    private SimpleUniverse simpleU;
    private BranchGroup rootScene;
    private TransformGroup mouseTG = new TransformGroup();

    /** Creates new form Canvas3DintFrame */
    public Canvas3DintFrame(String organixName, RenderFrame parent) {

        refParent = parent;
        initComponents();
        setTitle(organixName);
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(config);
        getContentPane().add(canvas3D, java.awt.BorderLayout.CENTER);

        canvas3D.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                popupListener(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                popupListener(evt);
            }
        });

        simpleU = new SimpleUniverse(canvas3D);
        simpleU.getViewingPlatform().setNominalViewingTransform();
        rootScene = createSceneGraph();

        layerMenuItems = new JRadioButtonMenuItem[refParent.MAX_LAYERS];

        for (int i = 0; i < refParent.MAX_LAYERS; i++) {
            layerMenuItems[i] = new JRadioButtonMenuItem();
            layerButtonGroup.add(layerMenuItems[i]);
            layerMenuItems[i].setText("Layer " + (i+1));
            layerMenuItems[i].addActionListener(this);
            jPopupMenu.add(layerMenuItems[i]);
        }
        layerMenuItems[0].setSelected(true);

    }

    public void setLayer(int l) { layer = l; }
    public int getLayer() { return layer; }
    public TransformGroup getWorld() { return mouseTG; }

    public void makeLive() {
        rootScene.compile();
        simpleU.addBranchGraph(rootScene);
    }

    private BranchGroup createSceneGraph() {
        BoundingSphere bounds = new BoundingSphere(new Point3d(), 10000.0);
        BranchGroup objRoot = new BranchGroup();
        mouseTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        mouseTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

        MouseRotate mouseRotate = new MouseRotate(mouseTG);
        mouseRotate.setSchedulingBounds(bounds);
        objRoot.addChild(mouseRotate);

        MouseZoom mouseZoom = new MouseZoom(mouseTG);
        mouseZoom.setSchedulingBounds(bounds);
        objRoot.addChild(mouseZoom);

        addLights(objRoot, bounds);
        objRoot.addChild(mouseTG);
        return objRoot;
    }

    private void addLights(Group world, Bounds bounds) {
        AmbientLight light = new AmbientLight(new Color3f(0.6f, 0.6f, 0.6f));
        light.setInfluencingBounds(bounds);
        world.addChild(light);

        DirectionalLight lightD = new DirectionalLight();
        lightD.setInfluencingBounds(bounds);
        Vector3f direction1 = new Vector3f(0.8f, -1.0f, -0.8f);
        lightD.setDirection(direction1);
        lightD.setColor(new Color3f(0.4f, 0.4f, 0.4f));
        world.addChild(lightD);

        PointLight lightP1 = new PointLight();
        lightP1.setInfluencingBounds(bounds);
        Point3f position = new Point3f(0.0f, 0.0f, 0.0f);
        lightP1.setPosition(position);
        world.addChild(lightP1);
    }

    private void initComponents() {
        jPopupMenu = new javax.swing.JPopupMenu();
        detailsMenuItem = new javax.swing.JMenuItem();
        layerButtonGroup = new javax.swing.ButtonGroup();

        jPopupMenu.setLightWeightPopupEnabled(false);
        detailsMenuItem.setText("Details");
        jPopupMenu.add(detailsMenuItem);
        jPopupMenu.add(new JSeparator());

        setMaximizable(true);
        setIconifiable(true);
        setResizable(true);
        setClosable(true);

        setDefaultCloseOperation(HIDE_ON_CLOSE);
    }

    private void popupListener(java.awt.event.MouseEvent evt) {
        if (evt.isPopupTrigger())
            jPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
    }

    public void actionPerformed(java.awt.event.ActionEvent evt) {
        for (int i = 0; i < layerMenuItems.length; i++) {
            if (layerMenuItems[i].equals(evt.getSource())) {
                setLayer(i + 1);
            }
        }
    }

    private JRadioButtonMenuItem[] layerMenuItems;
    private javax.swing.JPopupMenu jPopupMenu;
    private javax.swing.JMenuItem detailsMenuItem;
    private javax.swing.ButtonGroup layerButtonGroup;
    private RenderFrame refParent;
}
