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