001: /*
002: * $RCSfile: PickMouseBehavior.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/09 17:20:26 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.utils.picking.behaviors;
046:
047: import com.sun.j3d.utils.picking.*;
048: import com.sun.j3d.internal.*;
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: * Base class that allows users to adding picking and mouse manipulation to
057: * the scene graph (see PickDragBehavior for an example of how to extend
058: * this base class). This class is useful for interactive apps.
059: */
060:
061: public abstract class PickMouseBehavior extends Behavior {
062:
063: protected PickCanvas pickCanvas;
064:
065: protected WakeupCriterion[] conditions;
066: protected WakeupOr wakeupCondition;
067: protected boolean buttonPress = false;
068:
069: protected TransformGroup currGrp;
070: protected static final boolean debug = false;
071: protected MouseEvent mevent;
072:
073: /**
074: * Creates a PickMouseBehavior given current canvas, root of the tree to
075: * operate on, and the bounds.
076: */
077: public PickMouseBehavior(Canvas3D canvas, BranchGroup root,
078: Bounds bounds) {
079: super ();
080: currGrp = new TransformGroup();
081: currGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
082: currGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
083: root.addChild(currGrp);
084: pickCanvas = new PickCanvas(canvas, root);
085: }
086:
087: /**
088: * Sets the pick mode
089: * @see PickTool#setMode
090: **/
091: public void setMode(int pickMode) {
092: pickCanvas.setMode(pickMode);
093: }
094:
095: /**
096: * Returns the pickMode
097: * @see PickTool#getMode
098: */
099:
100: public int getMode() {
101: return pickCanvas.getMode();
102: }
103:
104: /**
105: * Sets the pick tolerance
106: * @see PickCanvas#setTolerance
107: */
108: public void setTolerance(float tolerance) {
109: pickCanvas.setTolerance(tolerance);
110: }
111:
112: /**
113: * Returns the pick tolerance
114: * @see PickCanvas#getTolerance
115: */
116: public float getTolerance() {
117: return pickCanvas.getTolerance();
118: }
119:
120: public void initialize() {
121:
122: conditions = new WakeupCriterion[2];
123: conditions[0] = new WakeupOnAWTEvent(Event.MOUSE_MOVE);
124: conditions[1] = new WakeupOnAWTEvent(Event.MOUSE_DOWN);
125: wakeupCondition = new WakeupOr(conditions);
126:
127: wakeupOn(wakeupCondition);
128: }
129:
130: private void processMouseEvent(MouseEvent evt) {
131: buttonPress = false;
132:
133: if (evt.getID() == MouseEvent.MOUSE_PRESSED
134: | evt.getID() == MouseEvent.MOUSE_CLICKED) {
135: buttonPress = true;
136: return;
137: } else if (evt.getID() == MouseEvent.MOUSE_MOVED) {
138: // Process mouse move event
139: }
140: }
141:
142: public void processStimulus(Enumeration criteria) {
143: WakeupCriterion wakeup;
144: AWTEvent[] evt = null;
145: int xpos = 0, ypos = 0;
146:
147: while (criteria.hasMoreElements()) {
148: wakeup = (WakeupCriterion) criteria.nextElement();
149: if (wakeup instanceof WakeupOnAWTEvent)
150: evt = ((WakeupOnAWTEvent) wakeup).getAWTEvent();
151: }
152:
153: if (evt[0] instanceof MouseEvent) {
154: mevent = (MouseEvent) evt[0];
155:
156: if (debug)
157: System.out.println("got mouse event");
158: processMouseEvent((MouseEvent) evt[0]);
159: xpos = mevent.getPoint().x;
160: ypos = mevent.getPoint().y;
161: }
162:
163: if (debug)
164: System.out.println("mouse position " + xpos + " " + ypos);
165:
166: if (buttonPress) {
167: updateScene(xpos, ypos);
168: }
169: wakeupOn(wakeupCondition);
170: }
171:
172: /** Subclasses shall implement this update function
173: */
174: public abstract void updateScene(int xpos, int ypos);
175:
176: }
|