private void ThreadRun()
{
stopReceive = false;
Socket socket =new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
ipEndPoint = new IPEndPoint (IPAddress.Any, BLACK_BOX_CLIENT_PORT);
socket.Bind (ipEndPoint);
MulticastOption mo = new MulticastOption (IPAddress.Parse ("224.1.1.1"));
socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, mo);
nBytesReceived = 0;
lastLoadedBuffer = b1;
lastLoadedBufferMS = b1ms;
lastLoadedFrame = 0;
byte[] newPacketBuffer = b2;
MemoryStream newPacketBufferMS = b2ms;
long newPacketFrame = 0;
byte[] tempBuffer;
MemoryStream tempBufferMS;
while (true) {
Debug.Log("PRERECV");
nBytesReceived = socket.Receive(newPacketBuffer);
Debug.Log("RECV");
nPackets++;
newPacketBufferMS.Position = 0;
update_protocol.Update update = Serializer.Deserialize<update_protocol.Update>(new MemoryStream(newPacketBuffer, 0, nBytesReceived));
newPacketFrame = update.mod_version;
if(newPacketFrame > lastLoadedFrame) {
// Swap the buffers and reset the positions.
lastLoadedBufferMS.Position = 0;
newPacketBufferMS.Position = 0;
tempBuffer = lastLoadedBuffer;
tempBufferMS = lastLoadedBufferMS;
lastLoadedBuffer = newPacketBuffer;
lastLoadedBufferMS = newPacketBufferMS;
newPacketBuffer = tempBuffer;
newPacketBufferMS = tempBufferMS;
lastLoadedFrame = newPacketFrame;
Mocap mocap = update.mocap;
if (mocap != null) {
for (int j = 0; j < mocap.tracked_bodies.Count; j++) {
TrackedBody body = mocap.tracked_bodies[j];
string label = body.label;
RigidBody rb;
if (!labelToRigidBody.TryGetValue(label, out rb)) {
rb = new RigidBody();
labelToRigidBody[label] = rb;
} else {
rb = labelToRigidBody[label];
}
rb.pos = new Vector3(-(float)body.position.x, (float)body.position.y, (float)body.position.z);
rb.rot = new Quaternion(-(float)body.rotation.x, (float)body.rotation.y, (float)body.rotation.z, -(float)body.rotation.w);
}
}
for (int j = 0; j < update.motes.Count; j++) {
Mote m = update.motes[j];
buttons[m.label] = m.button_bits;
}
}
if (stopReceive) {
break;
}
}
socket.Close ();
}