Beispiel #1
0
        /// <summary>
        /// Requests linked bubble list from connected bubble.
        /// </summary>
        public void RequestLinkedBubbleList()
        {
            ListBubblesRequest listBubblesRequest = new ListBubblesRequest();

            listBubblesRequest.ListType = ListBubblesRequest.ListTypeLinked;
            client.Send(listBubblesRequest);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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();
        }