aboutsummaryrefslogtreecommitdiffstats
path: root/src/VirtualInputDevice/ButtonPositionControls.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/VirtualInputDevice/ButtonPositionControls.java')
-rw-r--r--src/VirtualInputDevice/ButtonPositionControls.java207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/VirtualInputDevice/ButtonPositionControls.java b/src/VirtualInputDevice/ButtonPositionControls.java
new file mode 100644
index 0000000..4335a87
--- /dev/null
+++ b/src/VirtualInputDevice/ButtonPositionControls.java
@@ -0,0 +1,207 @@
+/*
+ * $RCSfile$
+ *
+ * Copyright (c) 2004 Sun Microsystems, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any
+ * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
+ * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
+ * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
+ * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
+ * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed, licensed or
+ * intended for use in the design, construction, operation or
+ * maintenance of any nuclear facility.
+ *
+ * $Revision$
+ * $Date$
+ * $State$
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.vecmath.*;
+import javax.media.j3d.*;
+
+public class ButtonPositionControls extends Panel implements PositionControls, MouseListener {
+ private final static int STILL=0;
+ private final static int MOVING_UP=1;
+ private final static int MOVING_DOWN=2;
+ private final static int MOVING_LEFT=3;
+ private final static int MOVING_RIGHT=4;
+ private final static int MOVING_FORWARD=5;
+ private final static int MOVING_BACK=6;
+
+ // initial mode
+ private int mode = STILL;
+
+ Vector3f position = new Vector3f();
+ Vector3f orig_position = new Vector3f();
+
+ private Button leftB = new Button("Move Left");
+ private Button rightB = new Button("Move Right");
+ private Button upB = new Button("Move Up");
+ private Button downB = new Button("Move Down");
+
+ private Button forwardB = new Button("Move Forward");
+ private Button backwardB = new Button("Move Back");
+
+ private Button reset = new Button("Reset");
+ private InputDevice device;
+
+ private float step_rate = 0.0023f; // movement rate per millisecond
+ private long time_last_state_change = System.currentTimeMillis();
+
+ // the constructor arguments are the intitial X, Y, and Z positions
+ public ButtonPositionControls( float x, float y, float z ) {
+
+ // up, down, right, and left movement buttons
+ Panel panPanel = new Panel();
+ panPanel.setLayout( new BorderLayout() );
+ panPanel.add("North", upB);
+ panPanel.add("East", rightB);
+ panPanel.add("South", downB);
+ panPanel.add("West", leftB);
+
+ // forward, backward, and reset buttons
+ Panel p = new Panel();
+ p.setLayout( new GridLayout(0,1,0,0) );
+ p.add(forwardB);
+ p.add(backwardB);
+ p.add(reset);
+
+ // set the initial position
+ position.x = x;
+ position.y = y;
+ position.z = z;
+ orig_position.set(position);
+
+ // add a mouse listener to each button
+ upB.addMouseListener(this);
+ downB.addMouseListener(this);
+ leftB.addMouseListener(this);
+ rightB.addMouseListener(this);
+ forwardB.addMouseListener(this);
+ backwardB.addMouseListener(this);
+ reset.addMouseListener(this);
+
+ this.setLayout( new BorderLayout() );
+ add("East", p );
+ add("West", panPanel );
+ }
+
+ public void setDevice ( InputDevice device) {
+ this.device = device;
+ }
+
+ public void getPosition(Vector3f pos ) {
+ calculateMotion();
+ pos.set(position);
+ }
+
+ public void setPosition(Vector3f pos ) {
+ position.set(pos);
+ }
+
+ public void setStepRate( float stepRate ) {
+ step_rate = stepRate;
+ }
+
+ private void calculateMotion() {
+
+ long current_time = System.currentTimeMillis();
+ long elapsed_time = current_time - time_last_state_change;
+
+ switch(mode) {
+ case STILL:
+ break;
+ case MOVING_LEFT:
+ position.x = orig_position.x - step_rate*elapsed_time;
+ break;
+ case MOVING_RIGHT:
+ position.x = orig_position.x + step_rate*elapsed_time;
+ break;
+ case MOVING_UP:
+ position.y = orig_position.y + step_rate*elapsed_time;
+ break;
+ case MOVING_DOWN:
+ position.y = orig_position.y - step_rate*elapsed_time;
+ break;
+ case MOVING_FORWARD:
+ position.z = orig_position.z - step_rate*elapsed_time;
+ break;
+ case MOVING_BACK:
+ position.z = orig_position.z + step_rate*elapsed_time;
+ break;
+ default:
+ throw( new RuntimeException("Unknown motion"));
+ }
+ }
+
+ public void mouseClicked( MouseEvent e ) {
+ }
+
+ public void mouseEntered( MouseEvent e ) {
+ }
+
+ public void mouseExited( MouseEvent e ) {
+ }
+
+ public void mousePressed( MouseEvent e ) {
+ if (e.getSource()==leftB && mode != MOVING_LEFT) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_LEFT;
+ orig_position.set(position);
+ } else if (e.getSource()==rightB && mode != MOVING_RIGHT) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_RIGHT;
+ orig_position.set(position);
+ } else if (e.getSource()==upB && mode != MOVING_UP) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_UP;
+ orig_position.set(position);
+ } else if (e.getSource()==downB && mode != MOVING_DOWN) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_DOWN;
+ orig_position.set(position);
+ } else if (e.getSource()==forwardB && mode != MOVING_FORWARD) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_FORWARD;
+ orig_position.set(position);
+ } else if (e.getSource()==backwardB && mode != MOVING_BACK) {
+ time_last_state_change = System.currentTimeMillis();
+ mode = MOVING_BACK;
+ orig_position.set(position);
+ } else if (e.getSource()==reset) {
+ device.setNominalPositionAndOrientation();
+ }
+ }
+
+ public void mouseReleased( MouseEvent e ) {
+ mode = STILL;
+ }
+}