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.4 $
041: * $Date: 2007/02/09 17:20:13 $
042: * $State: Exp $
043: */
044:
045: package com.sun.j3d.utils.behaviors.picking;
046:
047: import java.awt.*;
048: import java.awt.event.*;
049: import java.util.*;
050: import javax.media.j3d.*;
051: import javax.vecmath.*;
052:
053: /*
054: * Base class that allows users to adding picking and mouse manipulation to
055: * his scene graph (see PickDragBehavior for an example of how to extend
056: * this base class). This class is useful for interactive apps.
057: */
058:
059: /**
060: * @deprecated As of Java 3D version 1.2, replaced by
061: * <code>com.sun.j3d.utils.picking.behaviors.PickMouseBehavior</code>
062: *
063: * @see com.sun.j3d.utils.picking.behaviors.PickMouseBehavior
064: */
065:
066: public abstract class PickMouseBehavior extends Behavior {
067:
068: /**
069: * Portion of the scene graph to operate picking on.
070: */
071: protected PickObject pickScene;
072:
073: protected WakeupCriterion[] conditions;
074: protected WakeupOr wakeupCondition;
075: protected boolean buttonPress = false;
076:
077: protected TransformGroup currGrp;
078: protected static final boolean debug = false;
079: protected MouseEvent mevent;
080:
081: /**
082: * Creates a PickMouseBehavior given current canvas, root of the tree to
083: * operate on, and the bounds.
084: */
085: public PickMouseBehavior(Canvas3D canvas, BranchGroup root,
086: Bounds bounds) {
087: super ();
088: currGrp = new TransformGroup();
089: currGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
090: currGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
091: root.addChild(currGrp);
092: pickScene = new PickObject(canvas, root);
093: }
094:
095: public void initialize() {
096:
097: conditions = new WakeupCriterion[2];
098: conditions[0] = new WakeupOnAWTEvent(Event.MOUSE_MOVE);
099: conditions[1] = new WakeupOnAWTEvent(Event.MOUSE_DOWN);
100: wakeupCondition = new WakeupOr(conditions);
101:
102: wakeupOn(wakeupCondition);
103: }
104:
105: private void processMouseEvent(MouseEvent evt) {
106: buttonPress = false;
107:
108: if (evt.getID() == MouseEvent.MOUSE_PRESSED
109: | evt.getID() == MouseEvent.MOUSE_CLICKED) {
110: buttonPress = true;
111: return;
112: } else if (evt.getID() == MouseEvent.MOUSE_MOVED) {
113: // Process mouse move event
114: }
115: }
116:
117: public void processStimulus(Enumeration criteria) {
118: WakeupCriterion wakeup;
119: AWTEvent[] evt = null;
120: int xpos = 0, ypos = 0;
121:
122: while (criteria.hasMoreElements()) {
123: wakeup = (WakeupCriterion) criteria.nextElement();
124: if (wakeup instanceof WakeupOnAWTEvent)
125: evt = ((WakeupOnAWTEvent) wakeup).getAWTEvent();
126: }
127:
128: if (evt[0] instanceof MouseEvent) {
129: mevent = (MouseEvent) evt[0];
130:
131: if (debug)
132: System.out.println("got mouse event");
133: processMouseEvent((MouseEvent) evt[0]);
134: xpos = mevent.getPoint().x;
135: ypos = mevent.getPoint().y;
136: }
137:
138: if (debug)
139: System.out.println("mouse position " + xpos + " " + ypos);
140:
141: if (buttonPress) {
142: updateScene(xpos, ypos);
143: }
144: wakeupOn(wakeupCondition);
145: }
146:
147: /** Subclasses shall implement this update function
148: */
149: public abstract void updateScene(int xpos, int ypos);
150: }
|