001: /*
002: * $RCSfile: PickRotateBehavior.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.5 $
041: * $Date: 2007/02/15 01:07:42 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.utils.pickfast.behaviors;
046:
047: import com.sun.j3d.utils.pickfast.*;
048: import com.sun.j3d.utils.behaviors.mouse.*;
049: import com.sun.j3d.internal.*;
050: import java.awt.*;
051: import java.awt.event.*;
052: import java.util.*;
053: import javax.media.j3d.*;
054: import javax.vecmath.*;
055:
056: /**
057: * A mouse behavior that allows user to pick and rotate scene graph objects.
058: * Common usage:
059: * <p>
060: * 1. Create your scene graph.
061: * <p>
062: * 2. Create this behavior with root and canvas.
063: * <p>
064: * <blockquote><pre>
065: * PickRotateBehavior behavior = new PickRotateBehavior(canvas, root, bounds);
066: * root.addChild(behavior);
067: * </pre></blockquote>
068: * <p>
069: * The above behavior will monitor for any picking events on
070: * the scene graph (below root node) and handle mouse rotates on pick hits.
071: * Note the root node can also be a subgraph node of the scene graph (rather
072: * than the topmost).
073: */
074:
075: public class PickRotateBehavior extends PickMouseBehavior implements
076: MouseBehaviorCallback {
077: MouseRotate rotate;
078: private PickingCallback callback = null;
079: private TransformGroup currentTG;
080:
081: /**
082: * Creates a pick/rotate behavior that waits for user mouse events for
083: * the scene graph. This method has its pickMode set to BOUNDS picking.
084: * @param root Root of your scene graph.
085: * @param canvas Java 3D drawing canvas.
086: * @param bounds Bounds of your scene.
087: **/
088:
089: public PickRotateBehavior(BranchGroup root, Canvas3D canvas,
090: Bounds bounds) {
091: super (canvas, root, bounds);
092: rotate = new MouseRotate(MouseRotate.MANUAL_WAKEUP);
093: rotate.setTransformGroup(currGrp);
094: currGrp.addChild(rotate);
095: rotate.setSchedulingBounds(bounds);
096: this .setSchedulingBounds(bounds);
097: }
098:
099: /**
100: * Creates a pick/rotate behavior that waits for user mouse events for
101: * the scene graph.
102: * @param root Root of your scene graph.
103: * @param canvas Java 3D drawing canvas.
104: * @param bounds Bounds of your scene.
105: * @param pickMode specifys PickTool.PICK_BOUNDS or PickTool.PICK_GEOMETRY.
106: * @see PickTool#setMode
107: **/
108:
109: public PickRotateBehavior(BranchGroup root, Canvas3D canvas,
110: Bounds bounds, int pickMode) {
111: super (canvas, root, bounds);
112: rotate = new MouseRotate(MouseRotate.MANUAL_WAKEUP);
113: rotate.setTransformGroup(currGrp);
114: currGrp.addChild(rotate);
115: rotate.setSchedulingBounds(bounds);
116: this .setSchedulingBounds(bounds);
117: this .setMode(pickMode);
118: }
119:
120: /**
121: * Update the scene to manipulate any nodes. This is not meant to be
122: * called by users. Behavior automatically calls this. You can call
123: * this only if you know what you are doing.
124: *
125: * @param xpos Current mouse X pos.
126: * @param ypos Current mouse Y pos.
127: **/
128: public void updateScene(int xpos, int ypos) {
129: TransformGroup tg = null;
130:
131: if (!mevent.isMetaDown() && !mevent.isAltDown()) {
132:
133: // System.out.println("PickRotateBeh : using pickfast pkg : PickInfo ...");
134: pickCanvas
135: .setFlags(PickInfo.NODE | PickInfo.SCENEGRAPHPATH);
136:
137: pickCanvas.setShapeLocation(xpos, ypos);
138: PickInfo pickInfo = pickCanvas.pickClosest();
139: if (pickInfo != null) {
140: // System.out.println("Intersected!");
141: tg = (TransformGroup) pickCanvas.getNode(pickInfo,
142: PickTool.TYPE_TRANSFORM_GROUP);
143: if ((tg != null)
144: && (tg
145: .getCapability(TransformGroup.ALLOW_TRANSFORM_READ))
146: && (tg
147: .getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE))) {
148: rotate.setTransformGroup(tg);
149: rotate.wakeup();
150: currentTG = tg;
151: }
152: } else if (callback != null)
153: callback
154: .transformChanged(PickingCallback.NO_PICK, null);
155: }
156: }
157:
158: /**
159: * Callback method from MouseRotate
160: * This is used when the Picking callback is enabled
161: */
162: public void transformChanged(int type, Transform3D transform) {
163: callback.transformChanged(PickingCallback.ROTATE, currentTG);
164: }
165:
166: /**
167: * Register the class @param callback to be called each
168: * time the picked object moves
169: */
170: public void setupCallback(PickingCallback callback) {
171: this.callback = callback;
172: if (callback == null)
173: rotate.setupCallback(null);
174: else
175: rotate.setupCallback(this);
176: }
177:
178: }
|