view src/samer/j3d/MorphPoints.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
line wrap: on
line source
package samer.j3d;

import samer.core.*;
import samer.maths.*;
import samer.tools.*;
import java.io.*;
import java.awt.event.*;
import javax.media.j3d.*;
import javax.vecmath.*;

import java.util.Enumeration;

public class MorphPoints extends Util implements Agent
{
	Switch		switcher;
	Morph		morph;
	Matrix		P1,P2;
	Appearance	app=points();
	Behavior		morpher;
					
	public MorphPoints(Root root, Matrix P1, Matrix P2, VVector A) throws Exception
	{		
		Shell.print("creating PointsMatrix");

		this.P1=P1;
		this.P2=P2;

		GeometryArray geoms[] = {
			new Points3D(P2,A),
			new Points3D(P1,A)
		};

		morph=new Morph(geoms,app);
		morph.setCapability(Morph.ALLOW_WEIGHTS_WRITE);
		morpher=new MorphBehavior();
		morpher.setSchedulingBounds(getBounds());

		switcher=new Switch();
		switcher.addChild(new Shape3D(geoms[1], app));
		switcher.addChild(morph);
		switcher.setCapability(Switch.ALLOW_SWITCH_WRITE);
		switcher.setWhichChild(0);

		// root.addChild(rotaterise(morph));
		root.addChild(morpher);
		root.addChild(switcher);

		Shell.exposeCommands(this);
	}

	public void getCommands(Agent.Registry r) { r.add("switch").add("morph"); }
	public void execute(String cmd, Environment env) throws Exception
	{
		if (cmd.equals("switch")) { 
			switcher.setWhichChild(X._int(env.datum(),0));
		} else if (cmd.equals("morph")) {
		}
	}
	
	public class MorphBehavior extends Behavior 
	{
		private WakeupCriterion nextframe;
		private WakeupCriterion trigger;
		private	double t, weights[];

		public MorphBehavior() {
			trigger = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
			nextframe = new WakeupOnElapsedFrames(1);
			weights = new double[2];
		}

		public void initialize() { 
			Shell.print("behavior init");
			t=0; this.wakeupOn(trigger); 
		}

		public void processStimulus(Enumeration criteria)
		{
			if (criteria.nextElement().equals(trigger)){
				Shell.print("morphing");

				t=0;
				weights[0]=1;
				weights[1]=0;
				morph.setWeights(weights);
				wakeupOn(nextframe);

			} else { 
				t += 0.01; 
				if (t < 1){

					weights[0]=1-t;
					weights[1]=t;
					morph.setWeights(weights);
					wakeupOn(nextframe);

				} else { 
					weights[0]=0;
					weights[1]=1;
					morph.setWeights(weights);

					Shell.print("finished morphing");
					wakeupOn(trigger);
				}
			}
		}
	}
}