001: /*
002: * $RCSfile: Mouse6DPointerBehavior.java,v $
003: *
004: * Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * - Redistribution of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * - Redistribution in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * Neither the name of Sun Microsystems, Inc. or the names of
019: * contributors may be used to endorse or promote products derived
020: * from this software without specific prior written permission.
021: *
022: * This software is provided "AS IS," without a warranty of any
023: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
024: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
025: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
026: * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
027: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
028: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
029: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
030: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
031: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
032: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
033: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
034: * POSSIBILITY OF SUCH DAMAGES.
035: *
036: * You acknowledge that this software is not designed, licensed or
037: * intended for use in the design, construction, operation or
038: * maintenance of any nuclear facility.
039: *
040: * $Revision: 1.4 $
041: * $Date: 2007/02/09 17:20:14 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.utils.behaviors.sensor;
046:
047: import java.util.Enumeration;
048: import javax.media.j3d.*;
049: import javax.vecmath.Point3d;
050: import javax.vecmath.Vector3f;
051:
052: /**
053: * This class provides basic behavior for a 6DOF mouse sensor. It
054: * generates a visible 3D cursor echo in the virtual world which tracks the
055: * position and orientation of the 6DOF mouse in the physical world. It
056: * can be extended to provide other functions by accessing its
057: * SensorEventAgent.
058: *
059: * @see SensorEventAgent
060: * @since Java 3D 1.3
061: */
062: public class Mouse6DPointerBehavior extends Behavior {
063: private Sensor sensor = null;
064: private SensorEventAgent eventAgent = null;
065: private TransformGroup echoTransformGroup = null;
066: private WakeupCondition conditions = new WakeupOnElapsedFrames(0);
067:
068: /**
069: * Constructs the behavior with a default echo. To make the echo visible,
070: * call getEcho() to retrieve the TransformGroup that parents the echo
071: * geometry, and then add that TransformGroup to the scene graph.
072: * <p>
073: * The default echo is a solid 6-pointed star where each point is aligned
074: * with the axes of the local coordinate system of the sensor, and with
075: * the center of the star at the location of the sensor hotspot.
076: *
077: * @param sensor a 6 degree of freedom Sensor which generates position
078: * and orientation relative to the tracker base.
079: * @param size the physical width of the echo in centimeters.
080: * @param enableLighting a boolean indicating whether the echo geometry
081: * should have lighting enabled.
082: */
083: public Mouse6DPointerBehavior(Sensor sensor, double size,
084: boolean enableLighting) {
085:
086: this .sensor = sensor;
087: echoTransformGroup = new TransformGroup();
088: echoTransformGroup
089: .setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
090:
091: Point3d hotspot = new Point3d();
092: sensor.getHotspot(hotspot);
093:
094: Transform3D t3d = new Transform3D();
095: Vector3f v3f = new Vector3f(hotspot);
096: t3d.set(v3f);
097:
098: Shape3D echo = new SensorGnomonEcho(t3d, 0.001 * size,
099: 0.005 * size, enableLighting);
100: echoTransformGroup.addChild(echo);
101:
102: eventAgent = new SensorEventAgent(this );
103: eventAgent
104: .addSensorReadListener(sensor, new EchoReadListener());
105: }
106:
107: /**
108: * Constructs the behavior with an echo parented by the specified
109: * TransformGroup.
110: *
111: * @param sensor a 6 degree of freedom Sensor which generates position
112: * and orientation relative to the tracker base.
113: * @param tg a TransformGroup with a child defining the visible echo
114: * which will track the Sensor position and orientation; the Transform3D
115: * associated with the TransformGroup will be updated in order to effect
116: * the behavior, so it must have the ALLOW_TRANSFORM_WRITE capability
117: * set before the scene graph is set live
118: */
119: public Mouse6DPointerBehavior(Sensor sensor, TransformGroup tg) {
120: this .sensor = sensor;
121: echoTransformGroup = tg;
122: eventAgent = new SensorEventAgent(this );
123: eventAgent
124: .addSensorReadListener(sensor, new EchoReadListener());
125: }
126:
127: /**
128: * Gets the sensor used by this behavior.
129: *
130: * @return the sensor used by this behavior
131: */
132: public Sensor getSensor() {
133: return sensor;
134: }
135:
136: /**
137: * Gets the echo used by this behavior.
138: *
139: * @return the TransformGroup parenting this behavior's echo geometry
140: */
141: public TransformGroup getEcho() {
142: return echoTransformGroup;
143: }
144:
145: /**
146: * Gets the SensorEventAgent used by this behavior. This can be used to
147: * add customized event bindings to this behavior.
148: *
149: * @return the SensorEventAgent
150: */
151: public SensorEventAgent getSensorEventAgent() {
152: return eventAgent;
153: }
154:
155: /**
156: * Initializes the behavior.
157: * NOTE: Applications should not call this method. It is called by the
158: * Java 3D behavior scheduler.
159: */
160: public void initialize() {
161: wakeupOn(conditions);
162: }
163:
164: /**
165: * Processes a stimulus meant for this behavior.
166: * NOTE: Applications should not call this method. It is called by the
167: * Java 3D behavior scheduler.
168: */
169: public void processStimulus(Enumeration criteria) {
170: eventAgent.dispatchEvents();
171: wakeupOn(conditions);
172: }
173:
174: /**
175: * This member class updates the echo transform in response to sensor
176: * reads.
177: */
178: public class EchoReadListener implements SensorReadListener {
179: private Transform3D t3d = new Transform3D();
180:
181: public void read(SensorEvent e) {
182: // Get the Transform3D that transforms points from local sensor
183: // coordinates to virtual world coordinates, based on the primary
184: // view associated with this Behavior. This view is defined to be
185: // the first View attached to a live ViewPlatform.
186: //
187: // Note that this will display frame lag if another behavior such
188: // as OrbitBehavior is used to manipulate the view transform while
189: // the echo is visible. In order to eliminate frame lag the
190: // behavior driving the view transform must also compute the echo
191: // transform as well. See the WandViewBehavior utility for the
192: // appropriate techniques.
193: getView().getSensorToVworld(e.getSensor(), t3d);
194: echoTransformGroup.setTransform(t3d);
195: }
196: }
197: }
|