

/*******************************************************************************
 *
 *  Version     :   janvier 2001
 *
 *  Auteur      :   Alain Berro (berro@univ-tlse1.fr)
 *
 *  Description :   Scene dfinit une scne 3D.
 *
 ******************************************************************************/

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GraphicsConfiguration;
import javax.swing.JFrame;
import javax.media.j3d.*;
import javax.vecmath.Vector3d;
import javax.vecmath.Point3d;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.SimpleUniverse;

/******************/
/* Classe SceneVU */
/******************/

public class SceneVU extends JFrame
{
    /*---------*/
    /* Donnes */
    /*---------*/

    /*----- Donnes relatives  la fentre -----*/
    private int largeur;    // Taille
    private int hauteur;
    private int posx;       // Position
    private int posy;

    /*----- Objets composants la structure principale -----*/
    private VirtualUniverse universe;
    private Locale          locale;
    private View            view;

    private BranchGroup     racineVue;      // Noeud de branchement de la vue
    private BranchGroup     racineVolume;   // Noeud de branchement du volume

    private TransformGroup  tgVue;      // Noeud de transformation attach au point de vue
    private TransformGroup  tgVolume;   // Noeud de transformation attach au volume


    /*--------------*/
    /* Constructeur */
    /*--------------*/

    public SceneVU (int l,
                    int h,
                    int px,
                    int py)
        {
        /*----- Instanciation de la fentre graphique -----*/
        this.setTitle("Visualisation 3D");
        this.largeur = l;
        this.hauteur = h;
        this.setSize(largeur,hauteur);
        this.posx = px;
        this.posy = py;
        this.setLocation(posx,posy);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        /*----- Contenu de la fentre -----*/
        Container conteneur = getContentPane();
        conteneur.setLayout(new BorderLayout());

        /*----- Cration du Canvas -----*/
        // Bad way to do it : GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        // One good way :
        GraphicsEnvironment local = GraphicsEnvironment.getLocalGraphicsEnvironment();
		GraphicsDevice screen = local.getDefaultScreenDevice();
		GraphicsConfigTemplate3D gcTemplate = new 	GraphicsConfigTemplate3D();
		GraphicsConfiguration config = screen.getBestConfiguration(gcTemplate);

        Canvas3D c = new Canvas3D(config);
        conteneur.add("Center",c);

        /*----- Cration de l'univers virtuel -----*/
        this.universe   = new VirtualUniverse();
        this.locale     = new Locale(this.universe);

        /*----- Cration du noeud pour insrer les lments de vue -----*/
        this.racineVue   = new BranchGroup();

        /*----- Position de l'observateur -----*/
        Transform3D t3d_oeil = new Transform3D();
        t3d_oeil.set(new Vector3d(0.0,0.0,10.0));

        this.tgVue = new TransformGroup(t3d_oeil);
        this.racineVue.addChild(this.tgVue);

        /*----- Cration de la plateforme de vue et attachement-----*/
        ViewPlatform vp = new ViewPlatform();
        this.tgVue.addChild(vp);

        /*----- Cration d'une vue -----*/
        this.view = new View();

        /*----- Cration de l'univers physique -----*/
        PhysicalBody        body    = new PhysicalBody();
        PhysicalEnvironment env     = new PhysicalEnvironment();

        /*----- Liaison de la plateforme de vue, du canvas et de l'univers physique  la vue-----*/
        this.view.attachViewPlatform(vp);
        this.view.addCanvas3D(c);
        this.view.setBackClipDistance(100.0);
        this.view.setPhysicalBody(body);
        this.view.setPhysicalEnvironment(env);

        /*----- Cration du noeud racine et de la matrice de transformation de la branche volume -----*/
        this.tgVolume = new TransformGroup();
        this.racineVolume = new BranchGroup();

        this.racineVolume.addChild(this.tgVolume);
        this.tgVolume.addChild(createBrancheVolume());

        /*----- Ajout  Locale de Viewplatform + SceneGraph -----*/
        this.locale.addBranchGraph(racineVue);
        this.locale.addBranchGraph(racineVolume);

        /*----- Rend la fentre visible -----*/
        this.setVisible(true);
        }

    /*----------*/
    /* Mthodes */
    /*----------*/

    /*----- Cration du volume -----*/

    private BranchGroup createBrancheVolume()
        {
        /*----- Cration du noeud racine -----*/
        BranchGroup racine = new BranchGroup();
        racine = new BranchGroup();

        /*----- Cration du Volume -----*/
        racine.addChild(new ColorCube());

        /*----- Optimisation du graphe de scne -----*/
        racine.compile();
        return racine;
        }

    /*------*/
    /* Main */
    /*------*/

    public static void main(String s[])
        {
        /*----- Fentre -----*/
        SceneVU sc = new SceneVU(200,200,0,0);
        }
}