import improv.actor.*;
import improv.actor.behavior.*;
import improv.util.*;

import vrml.external.field.*;


public class demo1 extends demo
{
EventOutSFRotation prox;

	public void defBehavior() {

// Get Access to Proximity Sensor
	
		prox = (EventOutSFRotation)(browser.getNode("AF").getEventOut("value_changed"));
	
// Create Channels;
        makeActor("Ned");

		SFVec3fChannel    rootTrans        = (SFVec3fChannel)    addChannel("ROOT","set_translation");
		SFRotationChannel rootRot          = (SFRotationChannel) addChannel("ROOT","set_rotation");
		SFRotationChannel bodyRot          = (SFRotationChannel) addChannel("Body","set_rotation");
		SFRotationChannel headRot          = (SFRotationChannel) addChannel("Head","set_rotation");
		headRot.setRotationOrder(SFRotationChannel.ZXY);
		SFRotationChannel leftEyeStalkRot  = (SFRotationChannel) addChannel("LeftEyeStalk","set_rotation");
		SFRotationChannel rightEyeStalkRot = (SFRotationChannel) addChannel("RightEyeStalk","set_rotation");
		SFRotationChannel leftEyeRot       = (SFRotationChannel) addChannel("LeftEye","set_rotation");
		SFRotationChannel rightEyeRot      = (SFRotationChannel) addChannel("RightEye","set_rotation");
		SFVec3fChannel    leftPupilScale   = (SFVec3fChannel)    addChannel("LeftPupil","set_scale");
		SFVec3fChannel    rightPupilScale  = (SFVec3fChannel)    addChannel("RightPupil","set_scale");

// Add the layers & states

		State bg;

		Layer background = actor.addLayer("Background");
		background.addBehavior(bg = new State("Background"));
		bg.addFilter(new SFVec3fFilter(rootTrans,0,0,0));
		bg.addFilter(new SFRotationFilter(rootRot,0,0,0));
		bg.addFilter(new SFRotationFilter(bodyRot,0,0,0));
		bg.addFilter(new SFRotationFilter(headRot,0,0,0));

		NoiseCurve nx1 = new NoiseCurve(-20,20,1);
		NoiseCurve nz1 = new NoiseCurve(20,-20,1);
		bg.addFilter(new SFRotationFilter(leftEyeStalkRot,nx1,null,nz1));
		NoiseCurve nx2 = new NoiseCurve(20,-20,1);
		nx2.setOffset(.3);
		NoiseCurve nz2 = new NoiseCurve(-20,20,1);
		nz2.setOffset(.3);
		bg.addFilter(new SFRotationFilter(rightEyeStalkRot,nx2,null,nz2));
		bg.addFilter(new SFRotationFilter(leftEyeRot,0,0,0));
		bg.addFilter(new SFRotationFilter(rightEyeRot,0,0,0));
		bg.addFilter(new SFVec3fFilter(leftPupilScale,1,1,1));
		bg.addFilter(new SFVec3fFilter(rightPupilScale,1,1,1));

		State def1,lookLeft,lookRight;
		Layer layer1 = actor.addLayer("Layer 1");
		layer1.addBehavior(def1 = new State("Default - Layer 1"));
		SFFloatChannel llChannel,lrChannel;
		layer1.addBehavior(lookLeft = new State("Look Left"));
		float tcx[] = { 0,1 };
		float tcy[] = { 0,1 };
		SplineCurve tc = new SplineCurve(tcx,tcy);
		float x1[] = { 0,.5f,1 };
		float y1[] = { 0,80,90 };
		SplineCurve sc1 = new SplineCurve(x1,y1);
		sc1.timeBased(false);
		lookLeft.addFilter(new SFRotationFilter(headRot,null,sc1,null));
		lookLeft.setTransitionTime(tc);
		llChannel = lookLeft.getWeightChannel();
		layer1.addBehavior(lookRight = new State("Look Right"));
		float x2[] = { 0,.5f,1 };
		float y2[] = { 0,-80,-90 };
		SplineCurve sc2 = new SplineCurve(x2,y2);
		sc2.timeBased(false);
		lookRight.addFilter(new SFRotationFilter(headRot,null,sc2,null));
		lrChannel = lookRight.getWeightChannel();

		State def2,leanForward,leanBack;
		Layer layer2 = actor.addLayer("Layer 2");
		layer2.addBehavior(def2 = new State("Default - Layer 2"));
		layer2.addBehavior(leanForward = new State("Lean Forward"));
		SFRotationFilter lf = new SFRotationFilter(headRot,60,0,0);
		lf.setOpacity(1,0,0);
		leanForward.addFilter(lf);
		layer2.addBehavior(leanBack = new State("Lean Back"));
		SFRotationFilter lb = new SFRotationFilter(headRot,-60,0,0);
		lb.setOpacity(1,0,0);
		leanBack.addFilter(lb);

		State def3,lookAtCamera;
		Layer layer3 = actor.addLayer("Layer 3");
		layer3.addBehavior(def3 = new State("Default - Layer 3"));
		layer3.addBehavior(lookAtCamera = new State("Look At Camera"));
		SFRotationFilter lc = new SFRotationFilter(headRot,0,0,1,0);
		prox.advise(this,lc);
		lookAtCamera.addFilter(lc);

		State def4,eyesTogether,eyesApart;
		Layer layer4 = actor.addLayer("Layer 4");
		layer4.addBehavior(def4 = new State("Default - Layer 4"));
		layer4.addBehavior(eyesTogether = new State("Eyes Together"));
		NoiseCurve n1,n2;
		eyesTogether.addFilter(new SFRotationFilter(leftEyeStalkRot,0,0,0,null,null,n1 = new NoiseCurve(25,55,1,.5,.75)));
		eyesTogether.addFilter(new SFRotationFilter(rightEyeStalkRot,0,0,0,null,null,n2 = new NoiseCurve(-25,-55,1,.5,.75)));
		n2.setOffset(100);
		layer4.addBehavior(eyesApart = new State("Eyes Apart"));
		eyesApart.addFilter(new SFRotationFilter(leftEyeStalkRot,0,0,0,null,null,n2));
		eyesApart.addFilter(new SFRotationFilter(rightEyeStalkRot,0,0,0,null,null,n1));

		State def5,lookAround;
		Layer layer5 = actor.addLayer("Layer 5");
		layer5.addBehavior(def5 = new State("Default - Layer 5"));
		layer5.addBehavior(lookAround = new State("Look Around"));
		lookAround.addFilter(new SFFloatFilter(llChannel,new NoiseCurve(1,0,1)));
		lookAround.addFilter(new SFFloatFilter(lrChannel,new NoiseCurve(0,1,1)));


		State minConstraints;
		Layer layerMIN = actor.addLayer("Layer MIN");
		layerMIN.addBehavior(minConstraints = new State("Constraint Minima"));
		SFRotationFilter min = new SFRotationFilter(headRot,60,90,10);
		min.setComposite("MIN");
		min.setOpacity(1,1,1);
		minConstraints.addFilter(min);
		layerMIN.setHidden(true);

		State maxConstraints;
		Layer layerMAX = actor.addLayer("Layer MAX");
		layerMAX.addBehavior(maxConstraints = new State("Constraint Maxima"));
		SFRotationFilter max = new SFRotationFilter(headRot,-60,-90,-10);
		max.setComposite("MAX");
		max.setOpacity(1,1,1);
		maxConstraints.addFilter(max);
		layerMAX.setHidden(true);



	}

	public void callback(EventOut evt, double d, Object o) {
			switch(evt.getType()) {
				case FieldTypes.SFROTATION:
					((SFRotationFilter)o).setQuat(((EventOutSFRotation)evt).getValue());
					break;
				default: super.callback(evt,d,o);
			}

	}
}

