1   
2   package camera3d;
3   
4   /***
5    * Title:        Câmera Virtual - LIVES
6    * Description:  Câmera Virtual para Controle via LabVIEW
7    * Company:      Centro de Educação em Informática - SENAC - SP
8    * @author Fábio Roberto de Miranda
9    * @version 1.0
10   *
11   *  This class is derived from Sun's com.sun.j3d.utils.behaviors.keyboard.KeyNavigatorBehavior.
12   *  Instead of using a KeyNavigator, this class uses a VcKeyNavigator, and instead of
13   *  calling KeyNavigator.processKeyEvent(...) , it uses VcKeyNavigator.preProcessKeyEvent(...)
14   *
15   */
16  
17  
18  
19  //---------------
20  /*
21   *	@(#)KeyNavigatorBehavior.java 1.9 01/01/11 07:22:12
22   *
23   * Copyright (c) 1996-2001 Sun Microsystems, Inc. All Rights Reserved.
24   *
25   * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
26   * modify and redistribute this software in source and binary code form,
27   * provided that i) this copyright notice and license appear on all copies of
28   * the software; and ii) Licensee does not utilize the software in a manner
29   * which is disparaging to Sun.
30   *
31   * This software is provided "AS IS," without a warranty of any kind. ALL
32   * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
33   * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
34   * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
35   * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
36   * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
37   * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
38   * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
39   * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
40   * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
41   * POSSIBILITY OF SUCH DAMAGES.
42   *
43   * This software is not designed or intended for use in on-line control of
44   * aircraft, air traffic, aircraft navigation or aircraft communications; or in
45   * the design, construction, operation or maintenance of any nuclear
46   * facility. Licensee represents and warrants that it will not use or
47   * redistribute the Software for such purposes.
48   */
49  
50  
51  import java.awt.event.*;
52  import java.awt.AWTEvent;
53  import java.util.Enumeration;
54  import java.awt.Component;
55  import java.util.LinkedList;
56  import javax.vecmath.*;
57  import javax.media.j3d.*;
58  import com.sun.j3d.internal.J3dUtilsI18N;
59  import com.sun.j3d.utils.behaviors.keyboard.*;
60  
61  /***
62   * This class is a simple behavior that invokes the KeyNavigator
63   * to modify the view platform transform.
64   */
65  class VcKeyNavigatorBehavior extends Behavior implements KeyListener {
66      private static int instanceCounter = 0;
67      private int instance = -1;
68      private WakeupCriterion w1 = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED);
69      private WakeupCriterion w2 = new WakeupOnAWTEvent(KeyEvent.KEY_RELEASED);
70      private WakeupOnElapsedFrames w3 = new WakeupOnElapsedFrames(0);
71      private WakeupCriterion[] warray = { w1, w2, w3 };
72      private WakeupCondition w = new WakeupOr(warray);
73  
74      private KeyEvent eventKey;
75      private VcKeyNavigator keyNavigator;
76      private boolean listener = false;
77  
78      // tells whether we should update the VcView Transform;
79      // depends on mouse cursor position: in/outside the viewport frame
80      // This was removed because of a bug (in Java3D ?) which made the
81      // canvas3D disappear
82      //private boolean updating = false;
83  
84      private LinkedList eventq;
85      Canvas3D[] sourcesC3D = new Canvas3D[5];
86  
87  /*
88      void setUpdating(boolean updating){
89          this.updating = updating;
90          System.out.println("updating = " +updating);
91      }
92  */
93  
94      /***
95       *  Override Behavior's initialize method to setup wakeup criteria.
96       */
97      public void initialize() {
98  	// Establish initial wakeup criteria
99  	if (listener) {
100 	    w1 = new WakeupOnBehaviorPost(this, KeyEvent.KEY_PRESSED);
101 	    w2 = new WakeupOnBehaviorPost(this, KeyEvent.KEY_RELEASED);
102 	    warray[0] = w1;
103 	    warray[1] = w2;
104 	    w = new WakeupOr(warray);
105 	    eventq = new LinkedList();
106 	}
107 	wakeupOn(w);
108     }
109 
110     /***
111      *  Override Behavior's stimulus method to handle the event.
112      */
113     public void processStimulus(Enumeration criteria) {
114 	WakeupOnAWTEvent ev;
115 	WakeupCriterion genericEvt;
116 	AWTEvent[] events;
117 	boolean sawFrame = false;
118 
119 	while (criteria.hasMoreElements()) {
120 	    genericEvt = (WakeupCriterion) criteria.nextElement();
121 	    if (genericEvt instanceof WakeupOnAWTEvent) {
122 		ev = (WakeupOnAWTEvent) genericEvt;
123 		events = ev.getAWTEvent();
124 		processAWTEvent(events);
125 	    } else if ((genericEvt instanceof WakeupOnElapsedFrames) &&
126 		       eventKey != null) {
127                 /* notice that this section will be executed every frame after the
128                    first keystroke, since eventKey is never set to null again  */
129 		sawFrame = true;
130 	    } else if ((genericEvt instanceof WakeupOnBehaviorPost)) {
131 		while(true) {
132 		    // access to the queue must be synchronized
133 		    synchronized (eventq) {
134                          if (eventq.isEmpty()) break;
135                          eventKey  = (KeyEvent)eventq.remove(0);
136                          if ((isFromProperCanvas(eventKey))){ //Only lets certain events through
137                             if (eventKey.getID() == KeyEvent.KEY_PRESSED ||
138                                    eventKey.getID() == KeyEvent.KEY_RELEASED) {
139                                keyNavigator.processKeyEvent(eventKey);
140                              }
141                           }
142 		    }
143 		}
144 	    }
145 	}
146 	//if (sawFrame&&updating){
147 	if(sawFrame){
148             keyNavigator.integrateTransformChanges();
149             //keyNavigator.updateTime();
150             sawFrame = false;
151             //eventKey = null;
152          }
153 
154         // Set wakeup criteria for next time
155 	wakeupOn(w);
156     }
157 
158     /***
159      *  Process a keyboard event
160      */
161     private void processAWTEvent(AWTEvent[] events) {
162         for (int loop = 0; loop < events.length; loop++) {
163             if (events[loop] instanceof KeyEvent) {
164                 eventKey = (KeyEvent) events[loop];
165                 if(isFromProperCanvas(eventKey)){
166                     //  change the transformation; for example to zoom
167                     if (eventKey.getID() == KeyEvent.KEY_PRESSED ||
168                         eventKey.getID() == KeyEvent.KEY_RELEASED) {
169                         keyNavigator.processKeyEvent(eventKey);
170                     }
171                 }
172             }
173         }
174     }
175 
176     /***
177      * Adds this behavior as a KeyListener to the specified component.
178      * This method can only be called if
179      * the behavior was created with one of the constructors that takes
180      * a Component as a parameter.
181      * @param c The component to add the KeyListener to.
182      * @exception IllegalStateException if the behavior was not created
183      * as a listener
184      * @since Java 3D 1.2.1
185      */
186     public void addListener(Component c) {
187 	if (!listener) {
188 	    throw new IllegalStateException(J3dUtilsI18N.getString("Behavior0"));
189 	}
190 	c.addKeyListener(this);
191     }
192 
193 
194     public void removeListener(Component c) {
195 	if (!listener) {
196 	    throw new IllegalStateException(J3dUtilsI18N.getString("Behavior0"));
197 	}
198 	c.removeKeyListener(this);
199     }
200 
201     /***
202      * Constructs a new key navigator behavior node that operates
203      * on the specified VcView.
204      * @param targetView the target view
205      */
206     public VcKeyNavigatorBehavior(VcView targetView) {
207         instance = instanceCounter++;
208 	keyNavigator = new VcKeyNavigator(targetView);
209     }
210 
211     /***
212      * Constructs a key navigator behavior that uses AWT listeners
213      * and behavior posts rather than WakeupOnAWTEvent.  The behavior
214      * is added to the specified Component and works on the given
215      * TransformGroup.  A null component can be passed to specify
216      * the behavior should use listeners.  Components can then be added
217      * to the behavior with the addListener(Component c) method.
218      * @param c The component to add the VcKeyListener to.
219      * @param targetView The target VcView.
220      * @since Java 3D 1.2.1
221      */
222     public VcKeyNavigatorBehavior(Component c, VcView targetView) {
223 	this(targetView);
224 	if (c != null) {
225 	    c.addKeyListener(this);
226 	}
227 	listener = true;
228     }
229 
230     public void keyPressed(KeyEvent evt) {
231 	// add new event to the queue
232 	// must be MT safe
233 	synchronized (eventq) {
234 	    eventq.add(evt);
235 	    // only need to post if this is the only event in the queue
236 	    if (eventq.size() == 1) postId(KeyEvent.KEY_PRESSED);
237 	}
238     }
239 
240     public void keyReleased(KeyEvent evt) {
241 	// add new event to the queue
242 	// must be MT safe
243 	synchronized (eventq) {
244 	    eventq.add(evt);
245 	    // only need to post if this is the only event in the queue
246 	    if (eventq.size() == 1) postId(KeyEvent.KEY_RELEASED);
247 	}
248     }
249 
250     public void keyTyped(KeyEvent evt) {}
251 
252     /* New methods*/
253     public void removeCanvas3D(Canvas3D canvas){
254         for (int i=0; i< sourcesC3D.length; i++){
255             if (sourcesC3D[i]==canvas){
256                 sourcesC3D[i] = null;
257                 if(listener) removeListener(canvas);
258             }
259         }
260     }
261 
262     public void removeAllCanvas3Ds(){
263         for (int i=0; i< sourcesC3D.length; i++){
264             if(listener) removeListener(sourcesC3D[i]);
265             sourcesC3D[i] = null;
266         }
267     }
268 
269     public void addCanvas3D(Canvas3D canvas){
270         for (int i=0; i< sourcesC3D.length; i++){
271             if (sourcesC3D[i]==null){
272                 sourcesC3D[i] = canvas;
273                 return;
274             }
275         }
276     }
277 
278     boolean isFromProperCanvas(KeyEvent event){
279         Object obj = event.getSource();
280         /*
281         System.out.println("VcKeyNavBeh:"+ this.toString()+"/ sourcesC3D.length= "+sourcesC3D.length);
282         for (int i=0; i< sourcesC3D.length; i++){
283             if(sourcesC3D[i]!=null)System.out.println("VcKey...: sourcesC3D["+i+"]= "+sourcesC3D[i]);
284             else System.out.println("VcKey...: sourcesC3D["+i+"]= null");
285         }  */
286         for (int i=0; i< sourcesC3D.length; i++){
287             if ((Object)sourcesC3D[i]==obj){
288                 //System.out.println("VcKey...:I found that "+sourcesC3D[i]+" and "+obj+" are alike");
289                 return true;
290             }
291         }
292         //System.out.println("VcKey...: "+obj+" is NOT a sourceC3D");
293         return false;
294     }
295 
296 }
This page was automatically generated by Maven