/*
 * Copyright (c) 1998 Michel Beaudouin-Lafon, mbl@lri.fr
 *
 *	Programme de démonstration du package ThreeD.
 */

import java.applet.Applet;
import java.awt.Event;
import java.awt.Button;
import java.awt.Label;
import java.net.URL;

import ThreeD.*;

/** Cette classe étend un Model3D pour permettre la manipulation du modèle par un Control3D.
 *	Si l'on veut faire des manipulations dans le repère local de l'objet,
 *	changer rotateView en rotateLocal et translateView en translateLocal.
 */
class Model extends Model3D implements Control3DListener {
	
    Model (URL base, String name) {
	super (base, name);
    }

    /** Méthode appelée par Control3D lorsque l'on utilise le contrôleur de rotation. */
    public void rotated (double alpha, Vector3D axis) {
    	rotateView (alpha, axis);
    }
    
    /** Méthode appelée par Control3D lorsque l'on utilise le contrôleur de translation. */
    public void translated (Vector3D tvec) {
    	translateView (tvec);
    }
}
/** Applet qui affiche un objet, le repère de la scène et un contrôleur permettant 
 *	de manipuler l'objet.
 */
public class Demo extends Applet {

    View3D view;	// le widget qui va contenir la vue
    Button resetView;	// le bouton qui permet de recentrer la vue
    
    /** Initialiser l'applet : charger les modeles, creer la vue et l'interface */
    public void init () {
	// regarder s'il y a un parametre qui spécifie l'échelle
	double scale = 1;
	try {
	    scale = Double.valueOf(getParameter("scale")).floatValue();
	} catch (Exception e) {
	}
	
    	// récupérer le nom du modèle dans un paramètre passé à l'applet
	String mdname = getParameter("model");
	
	// ou sinon utiliser un cube
	if (mdname == null)
	    mdname = "applet/cube.obj";
	   
	// forcer la taille a 660x450 si elle n'est pas definie
	resize (size().width <= 20 ? 600 : size().width,
	        size().height <= 20 ? 450 : size().height);
	
	// creer la vue 3D
	view = new View3D (scale);
	add (view);
	
	// creer le modele et le mettre dans la vue
	Model obj = new Model (getDocumentBase(), mdname);
	view.addModel (obj);
	
	// creer le controleur et l'affecter au modele
	Control3D cobj = new Control3D ();
	add (cobj);
	cobj.setListener (obj);
	
	// creer un second modele qui represente le repère de la scène
	Model3D axis = new Model3D (getDocumentBase(), "applet/axis.obj");
	view.addModel (axis);
	
	// calculer la vue pour que tous les objets soient visibles
	view.setView ();
	
	// créer un bouton qui sert à recentrer la vue
	resetView = new Button ("Reset view");
	add (resetView);
    }
    
    /** Méthode appelée par le bouton "Reset view" */
    public boolean action (Event e, Object arg) {
    	if (e.target == resetView) {
    		// recentrer la vue
    		view.setView ();
    		return true;
    	}
    	return false;
    }
}
