001: /*
002: * $RCSfile: PickZoomBehavior.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.picking;
046:
047: import com.sun.j3d.utils.behaviors.mouse.*;
048: import java.awt.*;
049: import java.awt.event.*;
050: import java.util.*;
051: import javax.media.j3d.*;
052: import javax.vecmath.*;
053:
054: // A mouse behavior that allows user to pick and zoom scene graph objects.
055: // Common usage: 1. Create your scene graph. 2. Create this behavior with
056: // the root and canvas. See PickRotateBehavior for more details.
057:
058: /**
059: * @deprecated As of Java 3D version 1.2, replaced by
060: * <code>com.sun.j3d.utils.picking.behaviors.PickZoomBehavior</code>
061: *
062: * @see com.sun.j3d.utils.picking.behaviors.PickZoomBehavior
063: */
064:
065: public class PickZoomBehavior extends PickMouseBehavior implements
066: MouseBehaviorCallback {
067: MouseZoom zoom;
068: int pickMode = PickObject.USE_BOUNDS;
069: private PickingCallback callback = null;
070: private TransformGroup currentTG;
071:
072: /**
073: * Creates a pick/zoom behavior that waits for user mouse events for
074: * the scene graph. This method has its pickMode set to BOUNDS picking.
075: * @param root Root of your scene graph.
076: * @param canvas Java 3D drawing canvas.
077: * @param bounds Bounds of your scene.
078: **/
079:
080: public PickZoomBehavior(BranchGroup root, Canvas3D canvas,
081: Bounds bounds) {
082: super (canvas, root, bounds);
083: zoom = new MouseZoom(MouseBehavior.MANUAL_WAKEUP);
084: zoom.setTransformGroup(currGrp);
085: currGrp.addChild(zoom);
086: zoom.setSchedulingBounds(bounds);
087: this .setSchedulingBounds(bounds);
088: }
089:
090: /**
091: * Creates a pick/zoom behavior that waits for user mouse events for
092: * the scene graph.
093: * @param root Root of your scene graph.
094: * @param canvas Java 3D drawing canvas.
095: * @param bounds Bounds of your scene.
096: * @param pickMode specifys PickObject.USE_BOUNDS or PickObject.USE_GEOMETRY.
097: * Note: If pickMode is set to PickObject.USE_GEOMETRY, all geometry object in
098: * the scene graph that allows pickable must have its ALLOW_INTERSECT bit set.
099: **/
100:
101: public PickZoomBehavior(BranchGroup root, Canvas3D canvas,
102: Bounds bounds, int pickMode) {
103: super (canvas, root, bounds);
104: zoom = new MouseZoom(MouseBehavior.MANUAL_WAKEUP);
105: zoom.setTransformGroup(currGrp);
106: currGrp.addChild(zoom);
107: zoom.setSchedulingBounds(bounds);
108: this .setSchedulingBounds(bounds);
109: this .pickMode = pickMode;
110: }
111:
112: /**
113: * Sets the pickMode component of this PickZoomBehavior to the value of
114: * the passed pickMode.
115: * @param pickMode the pickMode to be copied.
116: **/
117:
118: public void setPickMode(int pickMode) {
119: this .pickMode = pickMode;
120: }
121:
122: /**
123: * Return the pickMode component of this PickZoomBehavior.
124: **/
125:
126: public int getPickMode() {
127: return pickMode;
128: }
129:
130: /**
131: * Update the scene to manipulate any nodes. This is not meant to be
132: * called by users. Behavior automatically calls this. You can call
133: * this only if you know what you are doing.
134: *
135: * @param xpos Current mouse X pos.
136: * @param ypos Current mouse Y pos.
137: **/
138:
139: public void updateScene(int xpos, int ypos) {
140: TransformGroup tg = null;
141:
142: if (mevent.isAltDown() && !mevent.isMetaDown()) {
143:
144: tg = (TransformGroup) pickScene.pickNode(pickScene
145: .pickClosest(xpos, ypos, pickMode),
146: PickObject.TRANSFORM_GROUP);
147:
148: // Check for valid selection
149: if ((tg != null)
150: && (tg
151: .getCapability(TransformGroup.ALLOW_TRANSFORM_READ))
152: && (tg
153: .getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE))) {
154: zoom.setTransformGroup(tg);
155: zoom.wakeup();
156: currentTG = tg;
157: } else if (callback != null)
158: callback
159: .transformChanged(PickingCallback.NO_PICK, null);
160: }
161: }
162:
163: /**
164: * Callback method from MouseZoom
165: * This is used when the Picking callback is enabled
166: */
167: public void transformChanged(int type, Transform3D transform) {
168: callback.transformChanged(PickingCallback.ZOOM, currentTG);
169: }
170:
171: /**
172: * Register the class @param callback to be called each
173: * time the picked object moves
174: */
175: public void setupCallback(PickingCallback callback) {
176: this.callback = callback;
177: if (callback == null)
178: zoom.setupCallback(null);
179: else
180: zoom.setupCallback(this);
181: }
182: }
|