/*
 * Stars.java
 *
 * Created on July 10, 2001, 7:46 AM
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.applet.Applet;
import java.io.*;
import java.util.Properties;

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

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

/**
 * Stars
 *
 * @author Corysia Taware
 * @version $Revision$
 */

public class Stars
  extends Applet
{
  SimpleUniverse u = null;

  public static void main(String args[])
  {
    Frame frame = new MainFrame(new Stars(), 640, 480);
    frame.setTitle("Background Stars example");
    frame.setCursor(Cursor.CROSSHAIR_CURSOR);
  }

  public Stars()
  {
    setLayout(new BorderLayout());
    Canvas3D canvas = createCanvas();
    add("Center", canvas);
    u = new SimpleUniverse(canvas);

    BranchGroup scene = createContent();

    u.getViewingPlatform().setNominalViewingTransform();

    OrbitBehavior orbit = new OrbitBehavior(canvas);
    orbit.setSchedulingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0));
    u.getViewingPlatform().setViewPlatformBehavior(orbit);

    scene.compile();
    u.addBranchGraph(scene);
  }
  
  private Canvas3D createCanvas()
  {
    GraphicsConfigTemplate3D template = new GraphicsConfigTemplate3D();
    GraphicsConfiguration gc1 = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getBestConfiguration(template);
    return new Canvas3D(gc1);
  }

  private BranchGroup createContent()
  {
    BranchGroup objRoot = new BranchGroup();

    BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 10000.0);
    
    objRoot.addChild(new ColorCube(0.1));
    
    Background background = new Background();
    background.setApplicationBounds(bounds);
    background.setGeometry(createBackGraph());
    objRoot.addChild(background); 

    return objRoot;
  }

  public BranchGroup createBackGraph()
  {
    BranchGroup objBack = new BranchGroup();

    PointArray starGeom1 = new PointArray(7, PointArray.COORDINATES);                 
    Appearance starAppear1 = new Appearance();
    starGeom1.setCoordinate( 0, new Point3f( 0.79483311f, -0.58810995f,  0.14955615f));
    starGeom1.setCoordinate( 1, new Point3f( 0.44430932f, -0.55736839f, -0.70137505f));
    starGeom1.setCoordinate( 2, new Point3f( 0.94901367f, -0.30404968f,  0.08322775f));
    starGeom1.setCoordinate( 3, new Point3f( 0.68060123f, -0.43044807f,  0.59287173f));
    starGeom1.setCoordinate( 4, new Point3f(-0.11641672f,  0.47273532f,  0.87348049f));
    starGeom1.setCoordinate( 5, new Point3f(-0.10399289f, -0.98059412f,  0.16619437f));
    starGeom1.setCoordinate( 6, new Point3f( 0.08024400f, -0.96944100f, -0.23182900f));
    PointAttributes point1 = new PointAttributes(4.0f, false);
    starAppear1.setPointAttributes(point1);
    objBack.addChild(new Shape3D(starGeom1, starAppear1));

    PointArray starGeom2 = new PointArray(18, PointArray.COORDINATES);
    starGeom2.setCoordinate( 0, new Point3f( 0.050844f, -0.992329f,  0.112678f));
    starGeom2.setCoordinate( 1, new Point3f(-0.063091f, -0.997672f,  0.025869f));
    starGeom2.setCoordinate( 2, new Point3f( 0.096706f, -0.980384f,  0.171736f));
    starGeom2.setCoordinate( 3, new Point3f(-0.562384f,  0.073568f,  0.823595f));
    starGeom2.setCoordinate( 4, new Point3f(-0.863904f,  0.059045f,  0.500180f));
    starGeom2.setCoordinate( 5, new Point3f(-0.727033f,  0.304149f,  0.615559f));
    starGeom2.setCoordinate( 6, new Point3f(-0.724850f,  0.535590f,  0.433281f));
    starGeom2.setCoordinate( 7, new Point3f( 0.185904f, -0.976907f, -0.105311f));
    starGeom2.setCoordinate( 8, new Point3f( 0.738028f, -0.531886f, -0.415221f));
    starGeom2.setCoordinate( 9, new Point3f(-0.402152f,  0.392690f, -0.827085f));
    starGeom2.setCoordinate(10, new Point3f(-0.020020f, -0.999468f, -0.025724f));
    starGeom2.setCoordinate(11, new Point3f(-0.384103f, -0.887075f,  0.256050f));
    starGeom2.setCoordinate(12, new Point3f(-0.224464f, -0.968946f, -0.103720f));
    starGeom2.setCoordinate(13, new Point3f(-0.828880f, -0.397932f, -0.393203f));
    starGeom2.setCoordinate(14, new Point3f(-0.010557f, -0.998653f,  0.050797f));
    starGeom2.setCoordinate(15, new Point3f(-0.282122f,  0.258380f, -0.923930f));
    starGeom2.setCoordinate(16, new Point3f(-0.941342f, -0.030364f,  0.336082f));
    starGeom2.setCoordinate(17, new Point3f( 0.00057f, -0.99651f,  -0.08344f));
    Appearance starAppear2 = new Appearance();
    PointAttributes point2 = new PointAttributes(2.0f, false);
    starAppear2.setPointAttributes(point2);
    objBack.addChild(new Shape3D(starGeom2, starAppear2));

    PointArray starGeom3 = new PointArray(20, PointArray.COORDINATES);
    starGeom3.setCoordinate( 0, new Point3f( 0.07292f, -0.98862f,  -0.13153f));
    starGeom3.setCoordinate( 1, new Point3f( 0.23133f, -0.87605f,  -0.42309f));
    starGeom3.setCoordinate( 2, new Point3f(-0.08215f, -0.64657f,   0.75840f));
    starGeom3.setCoordinate( 3, new Point3f(-0.84545f,  0.53398f,   0.00691f));
    starGeom3.setCoordinate( 4, new Point3f(-0.49365f, -0.83645f,  -0.23795f));
    starGeom3.setCoordinate( 5, new Point3f( 0.06883f, -0.99319f,  -0.09396f));
    starGeom3.setCoordinate( 6, new Point3f( 0.87582f, -0.40662f,   0.25997f));
    starGeom3.setCoordinate( 7, new Point3f(-0.09095f, -0.99555f,   0.02467f));
    starGeom3.setCoordinate( 8, new Point3f( 0.45306f, -0.81575f,  -0.35955f));
    starGeom3.setCoordinate( 9, new Point3f( 0.17669f, -0.97939f,   0.09776f));
    starGeom3.setCoordinate(10, new Point3f( 0.27421f, -0.83963f,   0.46884f));
    starGeom3.setCoordinate(11, new Point3f( 0.32703f, -0.94013f,  -0.09584f));
    starGeom3.setCoordinate(12, new Point3f(-0.01615f, -0.99798f,  -0.06132f));
    starGeom3.setCoordinate(13, new Point3f(-0.76665f,  0.45998f,  -0.44791f));
    starGeom3.setCoordinate(14, new Point3f(-0.91025f, -0.07102f,   0.40791f));
    starGeom3.setCoordinate(15, new Point3f(-0.00240f, -0.97104f,  -0.23887f));
    starGeom3.setCoordinate(16, new Point3f( 0.91936f, -0.39244f,   0.02740f));
    starGeom3.setCoordinate(17, new Point3f( 0.18290f, -0.97993f,   0.07920f));
    starGeom3.setCoordinate(18, new Point3f(-0.48755f,  0.61592f,   0.61884f));
    starGeom3.setCoordinate(19, new Point3f(-0.89375f,  0.36087f,  -0.26626f));
    objBack.addChild(new Shape3D(starGeom3));                              

    PointArray orion = new PointArray(10, PointArray.COORDINATES | PointArray.COLOR_3);
    orion.setCoordinate( 0, new Point3f(0.978330f, -0.033900f, 0.204426f));
    orion.setCoordinate( 1, new Point3f(0.968007f, -0.167860f, 0.186506f));
    orion.setCoordinate( 2, new Point3f(0.981477f, -0.142660f, 0.127873f));
    orion.setCoordinate( 3, new Point3f(0.983764f, -0.005220f, 0.179391f));
    orion.setCoordinate( 4, new Point3f(0.981112f,  0.110597f, 0.158705f));
    orion.setCoordinate( 5, new Point3f(0.967377f,  0.172516f, 0.185523f));
    orion.setCoordinate( 6, new Point3f(0.961385f,  0.128845f, 0.243183f));
    orion.setCoordinate( 7, new Point3f(0.978330f, -0.033900f, 0.204426f));
    orion.setCoordinate( 8, new Point3f(0.981293f, -0.020980f, 0.191375f));
    orion.setCoordinate( 9, new Point3f(0.983764f, -0.005220f, 0.179391f));
    orion.setColor(0, new Color3f(1.0f, 1.0f, 1.0f));
    orion.setColor(1, new Color3f(0.9f, 0.9f, 0.9f));
    orion.setColor(2, new Color3f(0.8f, 0.8f, 0.8f));
    orion.setColor(3, new Color3f(0.7f, 0.7f, 0.7f));
    orion.setColor(4, new Color3f(0.6f, 0.6f, 0.6f));
    orion.setColor(5, new Color3f(0.5f, 0.5f, 0.5f));
    orion.setColor(6, new Color3f(0.4f, 0.4f, 0.4f));
    orion.setColor(7, new Color3f(0.3f, 0.3f, 0.3f));
    orion.setColor(8, new Color3f(0.2f, 0.2f, 0.2f));
    orion.setColor(9, new Color3f(0.1f, 0.1f, 0.1f));
    objBack.addChild(new Shape3D(orion));
    
    objBack.compile();
    return objBack;
  }
}