// model definitions class
import java.awt.*;

public class modelDEF
{
public  String  name;
public  String  bodyparts0[];
public  String  bodyparts1[];
public  int     index0[];
public  int     index1[];
public  vector  Rxyz[];
public  vector  Dxyz[];
public  vector  Crgb[];
public  String  origin;
public  vector  origin_bp_color;
private animDEF animdefs[];
private int     num;
private int     animnum;
    
public modelDEF(String nm)
    {
	name       = nm;
	bodyparts0 = new String[20]; // allow max 20 bodyparts
	bodyparts1 = new String[20]; // allow max 20 bodyparts
	index0     = new int[20];
	index1     = new int[20];
	Rxyz       = new vector[20];
	Dxyz       = new vector[20];
	Crgb       = new vector[20];
	origin     = null;
	animdefs   = new animDEF[20];// number of animations can be 1 per bodypart max
	num        = 0;
	animnum    = 0;
    }

public boolean set_origin_bp_color(vector c)
    {
	origin_bp_color = new vector(c.xyz[0], c.xyz[1], c.xyz[2]);
	return true;
    }

public boolean insert(String bpname0, int id0, String bpname1, int id1, vector r, vector d, vector c)
    {
	bodyparts0[num] = bpname0;
	index0[num]     = id0;
	bodyparts1[num] = bpname1;
	index1[num]     = id1;
	Rxyz[num]       = r;
	Dxyz[num]       = d;
	Crgb[num]       = new vector(c.xyz[0], c.xyz[1], c.xyz[2]);
	num++;
	return true;
    }

public void set_origin(String s)
    {
	origin = s;
    }

public void set_animation(String nm, int id, int trantype, int animtype, int axis, double start, double stop, int steps)
    {
	animdefs[animnum++] = new animDEF(nm, id, trantype, animtype, axis, start, stop, steps);
    }
    
public model makemodel()
    {
	model p = new model(num);
	bodypart origin_bp = bodypartDB.makebodypart(origin);
	origin_bp.color = origin_bp_color;
	p.set_origin(origin_bp);
	for(int i=0; i<num; i++)
	    {
		bodypart bp0 = bodypartDB.makebodypart(bodyparts0[i]);
		bodypart bp1 = bodypartDB.find(bodyparts1[i], index1[i]);
		p.insert(bp0, index0[i], bp1, index1[i], Rxyz[i], Dxyz[i], Crgb[i]);
	    }
	setup_animation();
	return p;
    }

private void setup_animation()
    {
	for(int i = 0; i<animnum; i++)
	    {
		bodypart p = bodypartDB.find(animdefs[i].name, animdefs[i].index);
		if(p == null)
		    {
			System.err.println("cannot setup animation for nonexistant bodypart "+ animdefs[i].name + " " + animdefs[i].index);
			return;
		    }
		if(animdefs[i].trantype == 0)
		    {
			if(animdefs[i].axis == 0)
			    p.animtrans = new rotmatX();
			else if(animdefs[i].axis == 1)
			    p.animtrans = new rotmatY();
			else if(animdefs[i].axis == 2)
			    p.animtrans = new rotmatZ();
			else
			    {
				System.err.println("cannot setup animation for bodypart "+ animdefs[i].name + " " + animdefs[i].index + " axis "+animdefs[i].axis+" undefined");
				return;
			    }
		    }
		else if(animdefs[i].trantype == 1)
		    {
			if(animdefs[i].axis == 0)
			    p.animtrans = new tramatX();
			else if(animdefs[i].axis == 1)
			    p.animtrans = new tramatY();
			else if(animdefs[i].axis == 2)
			    p.animtrans = new tramatZ();
			else
			    {
				System.err.println("cannot setup animation for bodypart "+ animdefs[i].name + " " + animdefs[i].index + " axis "+animdefs[i].axis+" undefined");
				return;
			    }
		    }
		else
		    {
			System.err.println("cannot setup animation for bodypart "+ animdefs[i].name + " " + animdefs[i].index + " transform "+animdefs[i].trantype+" undefined");
			return;
		    }
		animator anim;
		if(animdefs[i].animtype == 0)
		    anim = new ANIbounce(p, animdefs[i].steps, animdefs[i].start, animdefs[i].stop);
		else
		    anim = new ANIcycle(p, animdefs[i].steps, animdefs[i].start, animdefs[i].stop);
		animatorDB.insert(anim);
	    }
    }
}

