/// <summary> /// Requests linked bubble list from connected bubble. /// </summary> public void RequestLinkedBubbleList() { ListBubblesRequest listBubblesRequest = new ListBubblesRequest(); listBubblesRequest.ListType = ListBubblesRequest.ListTypeLinked; client.Send(listBubblesRequest); }
public void Process(float timeDelta, bool avatarControlledOrChanged) { try { Client.Process(); Bubble.Process(timeDelta); if (!Client.IsConnected && !Client.IsConnecting) { deck.ReceivedAvatarObject = null; Client.Connect(serverAddress, serverPort, bubbleId, "", Location, identityProviderUrl, participantName, participantPassphrase, deck.AvatarId, true); } if (Client.IsConnected && DateTime.Now.Subtract(lastAvatarUpdateTime).TotalMilliseconds > 200) { if (deck.ReceivedAvatarObject == null) { InjectRequestMessage injectRequestMessage = (InjectRequestMessage)MessageFactory.Current.ReserveMessage(typeof(InjectRequestMessage)); injectRequestMessage.ObjectFragment.OwnerId = ParticipantId; injectRequestMessage.ObjectFragment.ObjectId = deck.AvatarId; injectRequestMessage.ObjectFragment.ObjectName = deck.AvatarName; injectRequestMessage.ObjectFragment.TypeId = deck.AvatarTypeId; injectRequestMessage.ObjectFragment.TypeName = deck.AvatarTypeName; injectRequestMessage.ObjectFragment.Location.X = deck.AvatarLocation.X / 10f; injectRequestMessage.ObjectFragment.Location.Y = deck.AvatarLocation.Y / 10f; injectRequestMessage.ObjectFragment.Location.Z = deck.AvatarLocation.Z / 10f; injectRequestMessage.ObjectFragment.Orientation.X = deck.AvatarOrientation.X; injectRequestMessage.ObjectFragment.Orientation.Y = deck.AvatarOrientation.Y; injectRequestMessage.ObjectFragment.Orientation.Z = deck.AvatarOrientation.Z; injectRequestMessage.ObjectFragment.Orientation.W = deck.AvatarOrientation.W; injectRequestMessage.ObjectFragment.BoundingSphereRadius = deck.AvatarBoundingSphereRadius; Client.Send(injectRequestMessage); } else { MovementEventMessage movementEvent = new MovementEventMessage(); movementEvent.ObjectIndex = deck.ReceivedAvatarObject.ObjectIndex; movementEvent.Location.X = deck.AvatarLocation.X / 10f; movementEvent.Location.Y = deck.AvatarLocation.Y / 10f; movementEvent.Location.Z = deck.AvatarLocation.Z / 10f; movementEvent.Orientation.X = deck.AvatarOrientation.X; movementEvent.Orientation.Y = deck.AvatarOrientation.Y; movementEvent.Orientation.Z = deck.AvatarOrientation.Z; movementEvent.Orientation.W = deck.AvatarOrientation.W; Client.Send(movementEvent); } lastAvatarUpdateTime = DateTime.Now; } } catch (Exception e) { Trace.TraceError(e.ToString()); Thread.Sleep(1000); } }
private void Process() { while (!isExitRequested) { try { client.Process(); if (((DateTime.Now.Subtract(lastInjectEjectTime).TotalSeconds > 300 && isInjected) || (DateTime.Now.Subtract(lastInjectEjectTime).TotalSeconds > 1 && !isInjected)) && client.IsConnected) { if (!isInjected) { for (int i = 0; i < NumberOfObjects; i++) { // Reset objects InjectRequestMessage injectRequestMessage = (InjectRequestMessage)MessageFactory.Current.ReserveMessage(typeof(InjectRequestMessage)); injectRequestMessage.ObjectFragment.OwnerId = ParticipantId; injectRequestMessage.ObjectFragment.ObjectId = ObjectArray[i].ObjectId; injectRequestMessage.ObjectFragment.ObjectName = ObjectArray[i].ObjectName; injectRequestMessage.ObjectFragment.TypeId = TypeId; injectRequestMessage.ObjectFragment.TypeName = "TestType"; ObjectArray[i].Location[0] = (float)(ObjectArray[i].OrbitRadius * Math.Cos(ObjectArray[i].OrbitAngle)); ObjectArray[i].Location[1] = 0.5f; ObjectArray[i].Location[2] = (float)(ObjectArray[i].OrbitRadius * Math.Sin(ObjectArray[i].OrbitAngle)); injectRequestMessage.ObjectFragment.Location.X = ObjectArray[i].Location[0]; injectRequestMessage.ObjectFragment.Location.Y = ObjectArray[i].Location[1]; injectRequestMessage.ObjectFragment.Location.Z = ObjectArray[i].Location[2]; injectRequestMessage.ObjectFragment.BoundingSphereRadius = ObjectArray[i].ObjectBoundingSphereRadius; client.Send(injectRequestMessage); if (i % 10 == 9) { client.Process(); Thread.Sleep(10); } } isInjected = true; } else { for (int i = 0; i < NumberOfObjects; i++) { EjectRequestMessage ejectRequestMessage = (EjectRequestMessage)MessageFactory.Current.ReserveMessage(typeof(EjectRequestMessage)); ejectRequestMessage.ObjectId = ObjectArray[i].ObjectId; client.Send(ejectRequestMessage); if (i % 10 == 9) { client.Process(); Thread.Sleep(10); } } isInjected = false; } lastInjectEjectTime = DateTime.Now; } else { if (!client.IsConnecting && !client.IsConnected && !isExitRequested) { // Mark for reinject on reconnect isInjected = false; client.Connect(serverAddress, serverPort, bubbleId, "", location, identityProviderUrl, participantName, participantPassphrase, Guid.Empty, false); } } if (client.IsConnected && DateTime.Now.Subtract(lastUpdateTime).TotalMilliseconds > 500 && isInjected) { float timeDelta = (float)DateTime.Now.Subtract(lastUpdateTime).TotalSeconds; for (int i = 0; i < NumberOfObjects; i++) { //if (ObjectArray[i].Velocity[0] >= 0.01f || ObjectArray[i].Velocity[1] >= 0.01f || ObjectArray[i].Velocity[2] >= 0.01f) //{ ObjectArray[i].Location[0] += ObjectArray[i].Velocity[0] * timeDelta; ObjectArray[i].Location[1] += ObjectArray[i].Velocity[1] * timeDelta; ObjectArray[i].Location[2] += ObjectArray[i].Velocity[2] * timeDelta; ObjectArray[i].Velocity[0] *= 0.9f; ObjectArray[i].Velocity[1] *= 0.9f; ObjectArray[i].Velocity[2] *= 0.9f; //} if (Math.Sqrt(ObjectArray[i].Velocity[0] * ObjectArray[i].Velocity[0] + ObjectArray[i].Velocity[1] * ObjectArray[i].Velocity[1] + ObjectArray[i].Velocity[2] * ObjectArray[i].Velocity[2]) < 0.01f) { ObjectArray[i].Velocity[0] = 0; ObjectArray[i].Velocity[1] = 0; ObjectArray[i].Velocity[2] = 0; } else { InjectRequestMessage injectRequestMessage = (InjectRequestMessage)MessageFactory.Current.ReserveMessage(typeof(InjectRequestMessage)); injectRequestMessage.ObjectFragment.OwnerId = ParticipantId; injectRequestMessage.ObjectFragment.ObjectId = ObjectArray[i].ObjectId; injectRequestMessage.ObjectFragment.ObjectName = ObjectArray[i].ObjectName; injectRequestMessage.ObjectFragment.TypeId = TypeId; injectRequestMessage.ObjectFragment.TypeName = "TestType"; injectRequestMessage.ObjectFragment.Location.X = ObjectArray[i].Location[0]; injectRequestMessage.ObjectFragment.Location.Y = ObjectArray[i].Location[1]; injectRequestMessage.ObjectFragment.Location.Z = ObjectArray[i].Location[2]; injectRequestMessage.ObjectFragment.BoundingSphereRadius = ObjectArray[i].ObjectBoundingSphereRadius; client.Send(injectRequestMessage); } } lastUpdateTime = DateTime.Now; } } catch (ThreadAbortException) { break; } catch (Exception e) { LogUtil.Error(e.ToString()); Thread.Sleep(1000); } Thread.Sleep(50); } }
private void Process() { while (!isExitRequested) { try { client.Process(); if (client.IsConnected && DateTime.Now.Subtract(lastUpdateTime).TotalMilliseconds > 500 && isInjected) { for (int i = 0; i < NumberOfObjects; i++) { Objects[i].OrbitAngle += Objects[i].OrbitAngularVelocity * ((float)DateTime.Now.Subtract(lastUpdateTime).TotalMilliseconds) / 1000f; } } if (((DateTime.Now.Subtract(lastInjectEjectTime).TotalSeconds > 5 && isInjected) || (DateTime.Now.Subtract(lastInjectEjectTime).TotalSeconds > 1 && !isInjected)) && client.IsConnected) { if (!isInjected) { for (int i = 0; i < NumberOfObjects; i++) { InjectRequestMessage injectRequestMessage = (InjectRequestMessage)MessageFactory.Current.ReserveMessage(typeof(InjectRequestMessage)); injectRequestMessage.ObjectFragment.OwnerId = ParticipantId; injectRequestMessage.ObjectFragment.ObjectId = Objects[i].ObjectId; injectRequestMessage.ObjectFragment.ObjectName = Objects[i].ObjectName; injectRequestMessage.ObjectFragment.TypeId = TypeId; injectRequestMessage.ObjectFragment.TypeName = "TestType"; injectRequestMessage.ObjectFragment.Location.X = (float)(Objects[i].OrbitRadius * Math.Cos(Objects[i].OrbitAngle)); injectRequestMessage.ObjectFragment.Location.Y = 0; injectRequestMessage.ObjectFragment.Location.Z = (float)(Objects[i].OrbitRadius * Math.Sin(Objects[i].OrbitAngle)); injectRequestMessage.ObjectFragment.BoundingSphereRadius = 1; client.Send(injectRequestMessage); if (i % 10 == 9) { client.Process(); Thread.Sleep(1); } } isInjected = true; } else { for (int i = 0; i < NumberOfObjects; i++) { EjectRequestMessage ejectRequestMessage = (EjectRequestMessage)MessageFactory.Current.ReserveMessage(typeof(EjectRequestMessage)); ejectRequestMessage.ObjectId = Objects[i].ObjectId; client.Send(ejectRequestMessage); if (i % 10 == 9) { client.Process(); Thread.Sleep(1); } } isInjected = false; } lastInjectEjectTime = DateTime.Now; } else { if (!client.IsConnecting && !client.IsConnected && !isExitRequested) { client.Connect(serverAddress, serverPort, bubbleId, "", location, identityProviderUrl, participantName, participantPassphrase, Guid.Empty, false); } } if (client.IsConnected && DateTime.Now.Subtract(lastUpdateTime).TotalMilliseconds > 500 && isInjected) { for (int i = 0; i < NumberOfObjects; i++) { InjectRequestMessage injectRequestMessage = (InjectRequestMessage)MessageFactory.Current.ReserveMessage(typeof(InjectRequestMessage)); injectRequestMessage.ObjectFragment.OwnerId = ParticipantId; injectRequestMessage.ObjectFragment.ObjectId = Objects[i].ObjectId; injectRequestMessage.ObjectFragment.ObjectName = Objects[i].ObjectName; injectRequestMessage.ObjectFragment.TypeId = TypeId; injectRequestMessage.ObjectFragment.TypeName = "TestType"; injectRequestMessage.ObjectFragment.Location.X = (float)(Objects[i].OrbitRadius * Math.Cos(Objects[i].OrbitAngle)); injectRequestMessage.ObjectFragment.Location.Y = 0; injectRequestMessage.ObjectFragment.Location.Z = (float)(Objects[i].OrbitRadius * Math.Sin(Objects[i].OrbitAngle)); injectRequestMessage.ObjectFragment.BoundingSphereRadius = 1; client.Send(injectRequestMessage); } lastUpdateTime = DateTime.Now; } } catch (ThreadAbortException) { break; } catch (Exception e) { LogUtil.Error(e.ToString()); Thread.Sleep(1000); } Thread.Sleep(50); } }
public void ClientServerThrottling() { Guid bubbleGuid = Guid.NewGuid(); MxpServer server = new MxpServer("http://test.cloud.url", MxpConstants.DefaultHubPort, "TestServerProgram", 1, 2); MxpBubble bubble = new MxpBubble(bubbleGuid, "TestBubbleName", 100, 1000); server.AddBubble(bubble); Session serverSession = null; bubble.ParticipantConnectAuthorize += delegate(Session session, JoinRequestMessage message, out Guid participantId, out Guid avatarId ) { participantId = Guid.Empty; avatarId = Guid.Empty; return(true); }; bubble.ParticipantConnected += delegate(Session session, JoinRequestMessage message, Guid participantId, Guid avatarId) { serverSession = session; }; server.Startup(false); MxpClient client = new MxpClient("TestClientProgram", 1, 2); client.ServerMessageReceived += delegate(Message message) { }; client.Connect("127.0.0.1", MxpConstants.DefaultHubPort, bubbleGuid, "", "TestLocation", "TestIdentityProviderUrl", "TestUserName", "TestUserPassword", Guid.Empty, false); Thread.Sleep(100); server.Process(); Assert.IsNotNull(serverSession); Assert.IsTrue(serverSession.IsConnected); Thread.Sleep(100); client.Process(); Thread.Sleep(100); Assert.IsTrue(client.IsConnected); int loopCount = 100; int messagesPerLoop = 50; double[] transmitterSendRates = new double[2 * loopCount]; double[] transmitterReceiveRates = new double[2 * loopCount]; double[] sessionSendRates = new double[2 * loopCount]; int messagesReceived = 0; bubble.ParticipantMessageReceived += delegate(Session session, Message message) { messagesReceived++; }; for (int i = 0; i < loopCount; i++) { for (int j = 0; j < messagesPerLoop; j++) { MovementEventMessage originalMessage = new MovementEventMessage(); originalMessage.ObjectIndex = 1; originalMessage.Location.X = 1; originalMessage.Location.Y = 2; originalMessage.Location.Z = 3; originalMessage.Orientation.X = 10; originalMessage.Orientation.Y = 11; originalMessage.Orientation.Z = 12; originalMessage.Orientation.W = 13; client.Send(originalMessage); } client.Process(); Thread.Sleep(8); server.Process(); Thread.Sleep(8); transmitterSendRates[i] = client.SendRate; transmitterReceiveRates[i] = server.ReceiveRate; sessionSendRates[i] = client.SessionSendRate; } for (int i = 0; i < loopCount; i++) { client.Process(); server.Process(); Thread.Sleep(16); transmitterSendRates[loopCount + i] = client.SendRate; transmitterReceiveRates[loopCount + i] = server.ReceiveRate; sessionSendRates[loopCount + i] = client.SessionSendRate; } Assert.IsTrue(loopCount * messagesPerLoop >= messagesReceived); server.Shutdown(); }