View Javadoc

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