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
16
17
18
19 public class TuioObject3DHandler extends AbstractTuioObjectHandler<TuioObject3D> {
20
21
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
74 long s_id = ((Integer)args[i]).longValue();
75 newObjectList.addElement(s_id);
76
77 if (aliveObjectList.contains(s_id))
78 aliveObjectList.removeElement(s_id);
79 }
80
81
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
149 newObjectList = buffer;
150 }
151 frameObjects.clear();
152 }
153
154 }
155 }