package org.freehep.j3d.plot;
import javax.media.j3d.Behavior;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.Transform3D;
import javax.media.j3d.WakeupOnAWTEvent;
import java.awt.AWTEvent;
import java.awt.event.*;
import javax.vecmath.Vector3f;
/**
* A behaviour for 3d plots which defines certain keyboard events
* This is used instead of the default KeyNavigatorBehavior to work around
* bug 4376368 which causes the CPU used to go to 100%
* see http://developer.java.sun.com/developer/bugParade/bugs/4376368.html
*
* Use the arrow keys and page up/page down to move. Hold the shift
* key to rotate. Use the Home key to restore the default rotation.
* @author Joy Kyriakopulos (joyk@fnal.gov)
* @version $Id: PlotKeyNavigatorBehavior.java 8584 2006-08-10 23:06:37Z duns $
*
*/
public class PlotKeyNavigatorBehavior extends Behavior
{
private Transform3D init, tgr;
private TransformGroup tg;
private WakeupOnAWTEvent wup;
private float step;
private float angle;
public PlotKeyNavigatorBehavior(TransformGroup targetTG,
float moveStep, float rotStep)
{
super();
this.tgr = new Transform3D();
this.init = new Transform3D();
this.tg = targetTG;
this.wup = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
this.step = moveStep;
this.angle = (float) Math.toRadians(rotStep);
}
public void initialize()
{
wakeupOn(wup);
tg.getTransform(init);
}
public void processStimulus(java.util.Enumeration criteria)
{
KeyEvent event = (KeyEvent)(wup.getAWTEvent())[0];
int keyCode = event.getKeyCode();
boolean shift = (event.getModifiers() & event.SHIFT_MASK) != 0;
switch (keyCode)
{
case KeyEvent.VK_UP:
move(0f, -1f, 0f, shift);
break;
case KeyEvent.VK_DOWN:
move(0f, 1f, 0f, shift);
break;
case KeyEvent.VK_LEFT:
move(-1f, 0f, 0f, shift);
break;
case KeyEvent.VK_RIGHT:
move(1f, 0f, 0f, shift);
break;
case KeyEvent.VK_PAGE_UP:
move(0f, 0f, 1f, shift);
break;
case KeyEvent.VK_PAGE_DOWN:
move(0f, 0f, -1f, shift);
break;
case KeyEvent.VK_HOME:
tg.setTransform(init);
}
wakeupOn(wup);
}
private void move(float x, float y, float z, boolean shift)
{
if (!shift) translate(x * step, y * step, z * step);
else rotate(x * angle, y * angle, z * angle);
}
private void translate(float x, float y, float z)
{
Transform3D tr = new Transform3D();
Vector3f vec = new Vector3f(x, y, z);
tr.setTranslation(vec);
tg.getTransform(tgr);
tgr.mul(tr);
tg.setTransform(tgr);
}
private void rotate(float x, float y, float z)
{
Transform3D tr = new Transform3D();
if (x != 0) tr.rotX(x);
if (y != 0) tr.rotY(y);
if (z != 0) tr.rotZ(z);
tg.getTransform(tgr);
tgr.mul(tr);
tg.setTransform(tgr);
}
}