View Javadoc

1   /*
2    * $RCSfile: PickTranslateBehavior.java,v $
3    *
4    * Copyright (c) 2006 Sun Microsystems, Inc. All rights reserved.
5    *
6    * Redistribution and use in source and binary forms, with or without
7    * modification, are permitted provided that the following conditions
8    * are met:
9    *
10   * - Redistribution of source code must retain the above copyright
11   *   notice, this list of conditions and the following disclaimer.
12   *
13   * - Redistribution in binary form must reproduce the above copyright
14   *   notice, this list of conditions and the following disclaimer in
15   *   the documentation and/or other materials provided with the
16   *   distribution.
17   *
18   * Neither the name of Sun Microsystems, Inc. or the names of
19   * contributors may be used to endorse or promote products derived
20   * from this software without specific prior written permission.
21   *
22   * This software is provided "AS IS," without a warranty of any
23   * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
24   * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
25   * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
26   * EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
27   * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
28   * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
29   * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
30   * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
31   * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
32   * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
33   * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
34   * POSSIBILITY OF SUCH DAMAGES.
35   *
36   * You acknowledge that this software is not designed, licensed or
37   * intended for use in the design, construction, operation or
38   * maintenance of any nuclear facility.
39   *
40   * $Revision: 1.1 $
41   * $Date: 2009/04/08 06:31:15 $
42   * $State: Exp $
43   */
44  
45  package edu.uci.ics.jung.visualization3d.control;
46  
47  import javax.media.j3d.Bounds;
48  import javax.media.j3d.BranchGroup;
49  import javax.media.j3d.Canvas3D;
50  import javax.media.j3d.Transform3D;
51  import javax.media.j3d.TransformGroup;
52  
53  import com.sun.j3d.utils.behaviors.mouse.MouseBehavior;
54  import com.sun.j3d.utils.behaviors.mouse.MouseBehaviorCallback;
55  import com.sun.j3d.utils.picking.PickResult;
56  import com.sun.j3d.utils.picking.PickTool;
57  import com.sun.j3d.utils.picking.behaviors.PickingCallback;
58  
59  /**
60   * A mouse behavior that allows user to pick and translate scene graph objects.
61   * Common usage: 1. Create your scene graph. 2. Create this behavior with
62   * the root and canvas. See PickRotateBehavior for more details. 
63   */
64  
65  public class PickTranslateBehavior extends PickMouseBehavior implements MouseBehaviorCallback {
66  	MouseTranslate translate;
67  	private PickingCallback callback = null;
68  	private TransformGroup currentTG;
69  
70  	/**
71  	 * Creates a pick/translate behavior that waits for user mouse events for
72  	 * the scene graph. 
73  	 * @param root   Root of your scene graph.
74  	 * @param canvas Java 3D drawing canvas.
75  	 * @param bounds Bounds of your scene.
76  	 **/
77  
78  	public PickTranslateBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds){
79  		super(canvas, root, bounds);
80  		translate = new MouseTranslate(MouseBehavior.MANUAL_WAKEUP);
81  		translate.setFactor(1);
82  		translate.setTransformGroup(currGrp);
83  		currGrp.addChild(translate);
84  		translate.setSchedulingBounds(bounds);
85  		this.setSchedulingBounds(bounds);
86  	}
87  
88  	/**
89  	 * Creates a pick/translate behavior that waits for user mouse events for
90  	 * the scene graph. 
91  	 * @param root   Root of your scene graph.
92  	 * @param canvas Java 3D drawing canvas.
93  	 * @param bounds Bounds of your scene.
94  	 * @param pickMode specifys PickTool.BOUNDS, PickTool.GEOMETRY or
95  	 * PickTool.GEOMETRY_INTERSECT_INFO.  
96  	 * @see PickTool#setMode
97  	 **/
98  	public PickTranslateBehavior(BranchGroup root, Canvas3D canvas,
99  			Bounds bounds, int pickMode) {
100 		super(canvas, root, bounds);
101 		translate = new MouseTranslate(MouseBehavior.MANUAL_WAKEUP);
102 		translate.setFactor(1);
103 		translate.setTransformGroup(currGrp);
104 		currGrp.addChild(translate);
105 		translate.setSchedulingBounds(bounds);
106 		this.setSchedulingBounds(bounds);
107 		this.setMode(pickMode);
108 	}
109 
110 
111 	/**
112 	 * Update the scene to manipulate any nodes. This is not meant to be 
113 	 * called by users. Behavior automatically calls this. You can call 
114 	 * this only if you know what you are doing.
115 	 * 
116 	 * @param xpos Current mouse X pos.
117 	 * @param ypos Current mouse Y pos.
118 	 **/
119 	public void updateScene(int xpos, int ypos){
120 //		System.err.println("update scene pick translate");
121 		TransformGroup tg = null;
122 
123 		if (!mevent.isAltDown() && !mevent.isMetaDown()){
124 
125 			pickCanvas.setShapeLocation(xpos, ypos);
126 			PickResult pr = pickCanvas.pickClosest();
127 			if ((pr != null) &&
128 					((tg = (TransformGroup)pr.getNode(PickResult.TRANSFORM_GROUP)) 
129 							!= null) &&
130 							(tg.getCapability(TransformGroup.ALLOW_TRANSFORM_READ)) && 
131 							(tg.getCapability(TransformGroup.ALLOW_TRANSFORM_WRITE))){
132 
133 				translate.setTransformGroup(tg);
134 				translate.wakeup();
135 				currentTG = tg;
136 				// Need to clean up Issue 123 --- Chien        
137 				// freePickResult(pr);
138 			} else if (callback!=null)
139 				callback.transformChanged( PickingCallback.NO_PICK, null );
140 		}
141 
142 	}
143 
144 	/**
145 	 * Callback method from MouseTranslate
146 	 * This is used when the Picking callback is enabled
147 	 */
148 	public void transformChanged( int type, Transform3D transform ) {
149 		callback.transformChanged( PickingCallback.TRANSLATE, currentTG );
150 	}
151 
152 	/**
153 	 * Register the class @param callback to be called each
154 	 * time the picked object moves
155 	 */
156 	public void setupCallback( PickingCallback callback ) {
157 		this.callback = callback;
158 		if (callback==null)
159 			translate.setupCallback( null );
160 		else
161 			translate.setupCallback( this );
162 	}
163 
164 }
165