

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.BitSet;
import com.sun.j3d.utils.geometry.*;
import javax.vecmath.*;

/**
 * Title:
 * Description:
 * Copyright:    Copyright (c) 2002
 * Company:
 * @author
 * @version 1.0
 */
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.JSlider;

public class Test extends JFrame// implements ActionListener
{
    Appearance appr;
    TransformGroup tgmain;
    SimpleUniverse m_universe;

    public Test()
    {
        init();
    }

    private void init()
    {
       setSize(800,600);

       getContentPane().setLayout(null);

       JSlider but1 = new JSlider(50,320);
       but1.setBounds(10, 10, getWidth()-100, 20);

        but1.addChangeListener(new ChangeListener()
        {
            public void stateChanged(ChangeEvent theChangeEvent)
            {
                JSlider source = (JSlider)theChangeEvent.getSource();
                m_universe.getViewer().getView().setFrontClipDistance(source.getValue()/100.0);
            }
        });

       getContentPane().add(but1);


       GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
       GraphicsConfiguration config = GraphicsEnvironment.getLocalGraphicsEnvironment().
                                        getDefaultScreenDevice().getBestConfiguration(template);

       Canvas3D m_canvas3D = new Canvas3D(config);
       m_canvas3D.setBounds(0, 50, getWidth(), getHeight() - 50);
       m_universe = new SimpleUniverse(m_canvas3D);

        m_universe.getViewingPlatform().setNominalViewingTransform();
        m_universe.getViewer().getView().setProjectionPolicy(View.PARALLEL_PROJECTION);
        setClippingDistances(2.95,3.2);

        but1.setValue((int)m_universe.getViewer().getView().getFrontClipDistance() *100);

       Locale m_locale = m_universe.getLocale();

       getContentPane().add(m_canvas3D);

       BranchGroup m_mainBG = new BranchGroup();
       attachLights(m_mainBG);

        appr = new Appearance();
        appr.setMaterial(new Material());

        tgmain = new TransformGroup();
        tgmain.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        tgmain.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        tgmain.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);

//        System.out.println("random ::::: " + Math.random());

        for (int i = 0; i < 300; i++)
        {
            Sphere sphere = new Sphere(0.05f,appr);
            TransformGroup tg = new TransformGroup();
            tg.addChild(sphere);

            Transform3D transform3D = new Transform3D();
            tg.getTransform(transform3D);
            Vector3d v3d = new Vector3d(1*(Math.random()-0.5),1*(Math.random()-0.5),2*(Math.random()-0.5));
            transform3D.setTranslation(v3d);
            tg.setTransform(transform3D);

            tgmain.addChild(tg);
        }

        m_mainBG.addChild(tgmain);

        MouseRotate myMouseRotate = null;
        myMouseRotate = new MouseRotate();
        myMouseRotate.setTransformGroup(tgmain);
        myMouseRotate.setSchedulingBounds(new BoundingSphere());
        m_mainBG.addChild(myMouseRotate);

        m_locale.addBranchGraph(m_mainBG);
    }

    private void attachLights(BranchGroup theScene)
    {
        BoundingSphere bounds = new BoundingSphere(new Point3d(0, 0, 0), 1000);

        DirectionalLight lightD1 = new DirectionalLight();
        lightD1.setInfluencingBounds(bounds);
        Vector3f direction1 = new Vector3f(0.0f, 0.0f, -0.5f);
        lightD1.setDirection(direction1);
        theScene.addChild(lightD1);
    }

    public void setClippingDistances(double theFrontClipDistance, double theBackClipDistance)
    {
        m_universe.getViewer().getView().setFrontClipPolicy(View.VIRTUAL_EYE);
        m_universe.getViewer().getView().setBackClipPolicy(View.VIRTUAL_EYE);

        m_universe.getViewer().getView().setFrontClipDistance(theFrontClipDistance);
        m_universe.getViewer().getView().setBackClipDistance(theBackClipDistance);
    }



    static public void main(String[] args)
    {
        Test n = new Test();
        n.setVisible(true);
    }
}