import java.applet.Applet;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import ncsa.j3d.loaders.Loader_3DS;
import java.net.URL;

public class LoaderPalApplet extends Applet
{
        JButton a1 = new JButton("+");
        JButton a2 = new JButton("-");
        JButton b1 = new JButton("+");
        JButton b2 = new JButton("-");
        JButton c1 = new JButton("+");
        JButton c2 = new JButton("-");
	
        JTextField a = new JTextField("0.0", 4);
        JTextField b = new JTextField("0.0", 4);
        JTextField c = new JTextField("0.0", 4);
	
        URL file1, file2, file3, file4;
	
        public BranchGroup createSceneGraph()
        {
                BranchGroup objRoot = new BranchGroup();
        	
                Transform3D transScale3D = new Transform3D();
                Transform3D transMul = new Transform3D();
                transScale3D.rotX(-Math.PI/2.0d);
                transMul.rotZ(Math.PI/4.0);
                transScale3D.mul(transMul);
                transScale3D.setScale(0.1);
                transScale3D.setTranslation(new Vector3f(-10.0f, -13.0f, -50.0f));
        	
                TransformGroup objScaleTrans = new TransformGroup();
                objScaleTrans.setTransform(transScale3D);

                objRoot.addChild(objScaleTrans);
        	
                //---------*  1- 3DS  *----------------------
                TransformGroup objTrans1 = new TransformGroup();
                objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                objTrans1.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                objScaleTrans.addChild(objTrans1);
        	
                //---------*  2- 3DS  *----------------------
                TransformGroup objTrans2 = new TransformGroup();
                objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                objTrans2.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                objTrans1.addChild(objTrans2);
        	
                //---------*  3- 3DS  *----------------------
                TransformGroup objTrans3 = new TransformGroup();
                objTrans3.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                objTrans3.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                objTrans2.addChild(objTrans3);
        	
                //---------*  4- 3DS  *----------------------
                TransformGroup objTrans4 = new TransformGroup();
                objTrans4.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                objTrans4.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                objTrans3.addChild(objTrans4);
        	
                Loader_3DS loader = new Loader_3DS();
        	
                Scene scene1, scene2, scene3, scene4;
                scene1 = null;
                scene2 = null;
                scene3 = null;
                scene4 = null;

                try
                {
                        scene1 = load(loader, "1.3ds");
                        scene2 = load(loader, "2.3ds");
                        scene3 = load(loader, "3.3ds");
                        scene4 = load(loader, "4.3ds");               	
                	
                }
                catch (FileNotFoundException e)
                {
                        System.err.println(e);
                        System.exit(1);
                }
                catch (ParsingErrorException e1)
                {
                        System.err.println(e1);
                        System.exit(1);
                }
                catch (IncorrectFormatException e2)
                {
                        System.err.println(e2);
                        System.exit(1);
                }
                	
                BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
                        	
                objTrans1.addChild(scene1.getSceneGroup());
                objTrans2.addChild(scene2.getSceneGroup());     	
                objTrans3.addChild(scene3.getSceneGroup());
                objTrans4.addChild(scene4.getSceneGroup());
        	
                //---------*  2 - 3DS RotationInterpolator *----------
                LoaderPalBehavior be1 = new LoaderPalBehavior(objTrans2, a);
                a1.setActionCommand("plus1");
                a1.addActionListener(be1);
                a2.setActionCommand("minus1");
                a2.addActionListener(be1);
                be1.setSchedulingBounds(bounds);
                objTrans2.addChild(be1);        	
        	
                //---------*  3 - 3DS RotationInterpolator *----------
                LoaderPalBehavior be2 = new LoaderPalBehavior(objTrans3, b);
                b1.setActionCommand("plus2");
                b1.addActionListener(be2);
                b2.setActionCommand("minus2");
                b2.addActionListener(be2);
                be2.setSchedulingBounds(bounds);
                objTrans3.addChild(be2);        	
                        	
                //---------*  4 - 3DS RotationInterpolator *----------
                LoaderPalBehavior be3 = new LoaderPalBehavior(objTrans4, c);
                c1.setActionCommand("plus3");
                c1.addActionListener(be3);
                c2.setActionCommand("minus3");
                c2.addActionListener(be3);
                be3.setSchedulingBounds(bounds);
                objTrans4.addChild(be3);        	
                        	
                MouseRotate behavior1 = new MouseRotate();
                behavior1.setTransformGroup(objTrans1);
                behavior1.setSchedulingBounds(bounds);
                objTrans1.addChild(behavior1);
        	
                MouseZoom behavior2 = new MouseZoom();
                behavior2.setTransformGroup(objTrans1);
                behavior2.setSchedulingBounds(bounds);
                objTrans1.addChild(behavior2);
        	
                MouseTranslate behavior3 = new MouseTranslate();
                behavior3.setTransformGroup(objTrans1);
                behavior3.setSchedulingBounds(bounds);
                objTrans1.addChild(behavior3);
        	
                DirectionalLight light1 = new DirectionalLight(
                                                                        new Color3f(0.5f, 0.5f, 0.5f), 
                                                                        new Vector3f(4.0f, -7.0f, -12.0f));
                light1.setInfluencingBounds(bounds);    	
                objRoot.addChild(light1);               	
        	
                DirectionalLight light2 = new DirectionalLight(
                                                                        new Color3f(0.3f, 0.3f, 0.3f), 
                                                                        new Vector3f(-6.0f, -2.0f, -1.0f));
                light2.setInfluencingBounds(bounds);
                objRoot.addChild(light2);
        	
                Background bg = new Background(new Color3f(0.0f, 0.0f, 0.0f));
                bg.setApplicationBounds(bounds);
                objRoot.addChild(bg);
        	
                objRoot.compile();
                return objRoot;
        }
	
        public Scene load(Loader_3DS loader, String filename) throws FileNotFoundException, 
                                              IncorrectFormatException, 
                                              ParsingErrorException 
        { 
                if (loader.getBaseUrl() != null) 
                { 
            try 
                        { 
                URL url = new URL(loader.getBaseUrl(), filename); 
                return loader.load(url); 
            } 
                        catch (java.net.MalformedURLException e) 
                        { 
                                System.out.println("MalformedURLException : " + e);
                                System.exit(1);
            } 
        } 
                else if (loader.getBasePath() != null) 
                { 
            filename = loader.getBasePath() + filename; 
        } 
                return loader.load(new FileReader(filename)); 
    } 

        public void init()
        {
        }
	
        public void start()
        {
                repaint();	
        }
	
        public void paint(Graphics g)
        {
                setLayout(new BorderLayout());
                Canvas3D canvas = new Canvas3D(null);
	
                add("Center", canvas);
 
                BranchGroup scene = createSceneGraph();
                SimpleUniverse universe = new SimpleUniverse(canvas);
                universe.getViewingPlatform().setNominalViewingTransform();
                universe.addBranchGraph(scene);
        	
                JPanel p;
                JLabel label;
        	
                a.setHorizontalAlignment(JTextField.CENTER);
                b.setHorizontalAlignment(JTextField.CENTER);
                c.setHorizontalAlignment(JTextField.CENTER);
                        	
                p = new JPanel();
                p.setFont(new Font("Helvetica", Font.PLAIN, 14));
                p.add(label = new JLabel("  Joint 1"));
                p.add(a1);
                p.add(a);
                p.add(a2);
                p.add(label = new JLabel("  Joint 2"));
                p.add(b1);
                p.add(b);
                p.add(b2);
                p.add(label = new JLabel("  Joint 3"));
                p.add(c1);
                p.add(c);
                p.add(c2);
        	
                p.setBackground(Color.lightGray);
                add("North", p);	
        }
        public void destroy()
        {
        }
}
