View Javadoc

1   package org.ximtec.igesture.io.tuio.tuio2D.handler;
2   
3   import java.util.Enumeration;
4   import java.util.Vector;
5   
6   import org.ximtec.igesture.io.tuio.TuioListener;
7   import org.ximtec.igesture.io.tuio.TuioTime;
8   import org.ximtec.igesture.io.tuio.handler.AbstractTuioObjectHandler;
9   import org.ximtec.igesture.io.tuio.tuio2D.TuioObject;
10  
11  
12  import com.illposed.osc.OSCMessage;
13  
14  /**
15   * Handles /tuio/2Dobj messages.
16   * @author Bjorn Puype
17   *
18   */
19  public class TuioObjectHandler extends AbstractTuioObjectHandler<TuioObject> {
20  	
21  	/** Constructor */
22  	public TuioObjectHandler()
23  	{
24  		
25  	}
26  	
27  	public void acceptMessage(OSCMessage message, TuioTime currentTime) {
28  		Object[] args = message.getArguments();
29  		String command = (String)args[0];
30  		
31  		if (command.equals("set")) {
32  			
33  			long s_id  = ((Integer)args[1]).longValue();
34  			int c_id  = ((Integer)args[2]).intValue();
35  			float xpos = ((Float)args[3]).floatValue();
36  			float ypos = ((Float)args[4]).floatValue();
37  			float angle = ((Float)args[5]).floatValue();
38  			float xspeed = ((Float)args[6]).floatValue();
39  			float yspeed = ((Float)args[7]).floatValue();
40  			float rspeed = ((Float)args[8]).floatValue();
41  			float maccel = ((Float)args[9]).floatValue();
42  			float raccel = ((Float)args[10]).floatValue();
43  			
44  			if (objectList.get(s_id) == null) {
45  			
46  				TuioObject addObject = new TuioObject(s_id,c_id,xpos,ypos,angle);
47  				frameObjects.addElement(addObject);
48  				
49  			} else {
50  			
51  				TuioObject tobj = objectList.get(s_id);
52  				if (tobj==null) return;
53  				if ((tobj.getX()!=xpos) || (tobj.getY()!=ypos) || (tobj.getAngle()!=angle) || (tobj.getXSpeed()!=xspeed) || (tobj.getYSpeed()!=yspeed) || (tobj.getRotationSpeed()!=rspeed) || (tobj.getMotionAccel()!=maccel) || (tobj.getRotationAccel()!=raccel)) {
54  					
55  					TuioObject updateObject = new TuioObject(s_id,c_id,xpos,ypos,angle);
56  					updateObject.update(xpos,ypos,angle,xspeed,yspeed,rspeed,maccel,raccel);
57  					frameObjects.addElement(updateObject);
58  				}
59  			
60  			}
61  			
62  		} else if (command.equals("alive")) {
63  
64  			newObjectList.clear();
65  			for (int i=1;i<args.length;i++) {
66  				// get the message content
67  				long s_id = ((Integer)args[i]).longValue();
68  				newObjectList.addElement(s_id);
69  				// reduce the object list to the lost objects
70  				if (aliveObjectList.contains(s_id))
71  					 aliveObjectList.removeElement(s_id);
72  			}
73  			
74  			// remove the remaining objects
75  			for (int i=0;i<aliveObjectList.size();i++) {
76  				TuioObject removeObject = objectList.get(aliveObjectList.elementAt(i));
77  				if (removeObject==null) continue;
78  				removeObject.remove(currentTime);
79  				frameObjects.addElement(removeObject);
80  			}
81  				
82  		} else if (command.equals("fseq")) {
83  			
84  			long fseq = ((Integer)args[1]).longValue();
85  			boolean lateFrame = false;
86  			
87  			if (fseq>0) {
88  				if (fseq>currentFrame) currentTime = TuioTime.getSessionTime();
89  				if ((fseq>=currentFrame) || ((currentFrame-fseq)>100)) currentFrame=fseq;
90  				else lateFrame = true;
91  			} else if (TuioTime.getSessionTime().subtract(currentTime).getTotalMilliseconds()>100) {
92  				currentTime = TuioTime.getSessionTime();
93  			}
94  			
95  			if (!lateFrame) {
96  				Enumeration<TuioObject> frameEnum = frameObjects.elements();
97  				while(frameEnum.hasMoreElements()) {
98  					TuioObject tobj = frameEnum.nextElement();
99  					
100 					switch (tobj.getTuioState()) {
101 						case TuioObject.TUIO_REMOVED:
102 							TuioObject removeObject = tobj;
103 							removeObject.remove(currentTime);
104 							for (int i=0;i<listenerList.size();i++) {
105 								TuioListener listener = (TuioListener)listenerList.elementAt(i);
106 								if (listener!=null) listener.removeTuioObject(removeObject);
107 							}								
108 							objectList.remove(removeObject.getSessionID());
109 							break;
110 
111 						case TuioObject.TUIO_ADDED:
112 							TuioObject addObject = new TuioObject(currentTime,tobj.getSessionID(),tobj.getSymbolID(),tobj.getX(),tobj.getY(),tobj.getAngle());
113 							objectList.put(addObject.getSessionID(),addObject);
114 							for (int i=0;i<listenerList.size();i++) {
115 								TuioListener listener = (TuioListener)listenerList.elementAt(i);
116 								if (listener!=null) listener.addTuioObject(addObject);
117 							}
118 							break;
119 															
120 						default:
121 							TuioObject updateObject = objectList.get(tobj.getSessionID());
122 							if ( (tobj.getX()!=updateObject.getX() && tobj.getXSpeed()==0) || (tobj.getY()!=updateObject.getY() && tobj.getYSpeed()==0) )
123 								updateObject.update(currentTime,tobj.getX(),tobj.getY(),tobj.getAngle());
124 							else
125 								updateObject.update(currentTime,tobj.getX(),tobj.getY(),tobj.getAngle(),tobj.getXSpeed(),tobj.getYSpeed(),tobj.getRotationSpeed(),tobj.getMotionAccel(),tobj.getRotationAccel());
126 
127 							for (int i=0;i<listenerList.size();i++) {
128 								TuioListener listener = (TuioListener)listenerList.elementAt(i);
129 								if (listener!=null) listener.updateTuioObject(updateObject);
130 							}
131 					}
132 				}
133 				
134 				for (int i=0;i<listenerList.size();i++) {
135 					TuioListener listener = (TuioListener)listenerList.elementAt(i);
136 					if (listener!=null) listener.refresh(new TuioTime(currentTime));
137 				}
138 				
139 				Vector<Long> buffer = aliveObjectList;
140 				aliveObjectList = newObjectList;
141 				// recycling the vector
142 				newObjectList = buffer;					
143 			}
144 			frameObjects.clear();
145 		}
146 	}
147 }