//Código Generado por Av3DGui
//Juan Miguel Olguin Salguero
//2001 Mexico City

//jmsalguero76@hotmail.com

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;

import javax.media.j3d.*;
import javax.vecmath.*;

public class Demo extends Applet{



public Appearance appearanceBuiltRequest(double transparency,
                                    int ambr,int ambg,int ambb,
                                    int difr,int difg,int difb,
                                    int spcr,int spcg,int spcb,
                                    double shine,
                                    boolean mapping,
                                    boolean plane,
                                    String imagepath
                                   )
  {
  Color ambient=new Color(ambr,ambg,ambb);
  Color diffuse=new Color(difr,difg,difb);
  Color specular=new Color(spcr,spcg,spcb);

  Appearance appearance=new Appearance();

  TransparencyAttributes transp=new TransparencyAttributes();
  transp.setTransparencyMode(transp.BLENDED);
  transp.setTransparency((float)transparency);
  appearance.setTransparencyAttributes(transp);
  ///ambientColor
  ///emissiveColor
  ///diffuseColor
  ///specularColor
  ///shininess
  Material material=new Material(new Color3f(ambient),
                                 new Color3f(0,0,0),
                                 new Color3f(diffuse),
                                 new Color3f(specular),(float)shine);
  appearance.setMaterial(material);
  return appearance;
  }
//clase inner
public BranchGroup createPointLight(float intensity,double[] transform)
            {
            PointLight light=new PointLight(new Color3f(intensity,intensity,intensity),new Point3f(0,0,0),new Point3f(1,0,0));
            light.setInfluencingBounds(new BoundingSphere(new Point3d(0,0,0),100));
            BranchGroup bg=new BranchGroup();
            TransformGroup tg=new TransformGroup();
            Transform3D t3d=new Transform3D(transform);
            tg.setTransform(t3d);
            bg.addChild(tg);
            tg.addChild(light);
            bg.compile();
            return bg;
            }
public BranchGroup createSphere(float radio,double[] transform,Appearance app)
             {
             Sphere sphere1=new Sphere(radio);
             sphere1.setAppearance(app);

             BranchGroup bg=new BranchGroup();
             TransformGroup tg=new TransformGroup();
             Transform3D t3d=new Transform3D(transform);
             tg.setTransform(t3d);
             bg.addChild(tg);
             tg.addChild(sphere1);
             bg.compile();
             return bg;
             }
public BranchGroup createBox(float sizx,float sizy,float sizz,double[] transform,Appearance app)
             {
             Box box1=new Box(sizx,sizy,sizz,app);
             BranchGroup bg=new BranchGroup();
             TransformGroup tg=new TransformGroup();
             Transform3D t3d=new Transform3D(transform);
             tg.setTransform(t3d);
             bg.addChild(tg);
             tg.addChild(box1);
             bg.compile();
             return bg;
             }
public Demo() {
       setLayout(new BorderLayout());
       GraphicsConfiguration config =
          SimpleUniverse.getPreferredConfiguration();
       Canvas3D canvas3D = new Canvas3D(config);
       BoundingSphere bounds=new BoundingSphere(new Point3d(0,0,0),100);
       add("Center", canvas3D);
       SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
       simpleU.getViewingPlatform().setNominalViewingTransform();
       OrbitBehavior orbit=new OrbitBehavior(canvas3D,OrbitBehavior.REVERSE_ALL);
       orbit.setSchedulingBounds(bounds);
       simpleU.getViewingPlatform().setViewPlatformBehavior(orbit);

       Background background=new Background(new Color3f(0.0f,0.0f,0.0f));
       background.setApplicationBounds(bounds);
       BranchGroup backbg=new BranchGroup();
       backbg.addChild(background);
       backbg.compile();
       simpleU.addBranchGraph(backbg);
       AmbientLight ambientlight=new AmbientLight(new Color3f(0.3f,0.3f,0.3f));
       ambientlight.setInfluencingBounds(bounds);
       BranchGroup ambientbg=new BranchGroup();
       ambientbg.addChild(ambientlight);
       ambientbg.compile();
       simpleU.addBranchGraph(ambientbg);
       //////////////////////////
       ///agregando primitivas
       double[] transform=null;
        transform=new double[]{1.0,0.0,0.0,0.64,0.0,1.0,0.0,-0.6,0.0,0.0,1.0,1.28,0.0,0.0,0.0,1.0};
        simpleU.addBranchGraph(createPointLight(0.8f,transform));

        transform=new double[]{1.0,0.0,0.0,0.72,0.0,1.0,0.0,0.56,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0};
        simpleU.addBranchGraph(createSphere(0.25f,transform,appearanceBuiltRequest(0.0,50,50,50,0,255,255,255,255,255,30.0f,false,true,"")));

        transform=new double[]{1.0,0.0,0.0,-0.76,0.0,1.0,0.0,0.4,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0};
        simpleU.addBranchGraph(createSphere(0.25f,transform,appearanceBuiltRequest(0.0,50,50,50,255,204,0,255,255,255,30.0f,false,true,"")));

        transform=new double[]{1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0};
        simpleU.addBranchGraph(createBox(0.3f,0.3f,0.3f,transform,appearanceBuiltRequest(0.0,51,51,51,135,204,255,255,255,255,30.0f,false,true,"")));

        transform=new double[]{1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0};
        simpleU.addBranchGraph(createBox(0.3f,0.3f,0.3f,transform,appearanceBuiltRequest(0.0,50,50,50,255,0,255,255,255,255,30.0f,false,true,"")));

        transform=new double[]{1.0,0.0,0.0,-0.72,0.0,1.0,0.0,1.56,0.0,0.0,1.0,1.04,0.0,0.0,0.0,1.0};
        simpleU.addBranchGraph(createPointLight(0.8f,transform));

}

 public static void main(String[] args)
        {
        new MainFrame(new Demo(), 320, 240);
        }

}
