コード例 #1
0
        public void OnConnected(JoinResponseMessage message)
        {
            DeckProgram.CloudView.RequestLinkedBubbleList();

            if (!m_isHandoverConnect)
            {
                InjectRequestMessage injectRequest = new InjectRequestMessage();
                injectRequest.ObjectFragment.ObjectId             = AvatarId;
                injectRequest.ObjectFragment.ObjectName           = ParticipantNickName;
                injectRequest.ObjectFragment.TypeName             = "Avatar";
                injectRequest.ObjectFragment.BoundingSphereRadius = 2f;
                injectRequest.ObjectFragment.Mass = 2f;
                OmModelPrimitiveExt modelPrimitiveExt = new OmModelPrimitiveExt();
                modelPrimitiveExt.ModelUrl = "http://assets.bubblecloud.org/Collada/Seymour/Seymour_triangulate.dae";
                modelPrimitiveExt.Scale    = 0.1f;
                injectRequest.SetExtension(modelPrimitiveExt);
                DeckProgram.CloudView.InjectObject(injectRequest);
            }
            m_isHandoverConnect = false;

            LogUtil.Info("DeckEngine connected.");

            ExpectedObjectSynchronizationCount = int.MaxValue; // This is overriden later by synchronization begin event.
            CurrentObjectSynchronizationCount  = 0;

            ParticipantId = message.ParticipantId;
            DeckProgram.HudForm.SetBubbleInformation(
                message.ProgramName + " / " + message.BubbleName + " ( Hub Software Version " + message.ProgramMajorVersion + "." + message.ProgramMinorVersion +
                ", Hub Protocol Version " + message.ProtocolMajorVersion + "." + message.ProtocolMinorVersion + ", Source Revision " + message.ProtocolSourceRevision + " )");
        }
コード例 #2
0
        private void InjectOrUpdateObject(DaemonLogic.CloudObject cloudObject)
        {
            if (!IdObjectDictionary.ContainsKey(cloudObject.CloudObjectId))
            {
                IdObjectDictionary.Add(cloudObject.CloudObjectId, cloudObject);
                Objects.Add(cloudObject);
            }

            if (!InjectedObjects.Contains(cloudObject.CloudObjectId))
            {
                InjectedObjects.Add(cloudObject.CloudObjectId);
                InjectRequestMessage injectRequestMessage = new InjectRequestMessage();
                injectRequestMessage.ObjectFragment.ObjectId             = cloudObject.CloudObjectId;
                injectRequestMessage.ObjectFragment.OwnerId              = cloudObject.Participant.ParticipantId;
                injectRequestMessage.ObjectFragment.TypeId               = cloudObject.ObjectType.ObjectTypeId;
                injectRequestMessage.ObjectFragment.ObjectName           = cloudObject.Name;
                injectRequestMessage.ObjectFragment.TypeName             = cloudObject.ObjectType.Name;
                injectRequestMessage.ObjectFragment.BoundingSphereRadius = (float)cloudObject.Radius;
                injectRequestMessage.ObjectFragment.Mass          = (float)cloudObject.Mass;
                injectRequestMessage.ObjectFragment.Location.X    = (float)cloudObject.X;
                injectRequestMessage.ObjectFragment.Location.Y    = (float)cloudObject.Y;
                injectRequestMessage.ObjectFragment.Location.Z    = (float)cloudObject.Z;
                injectRequestMessage.ObjectFragment.Orientation.X = (float)cloudObject.OX;
                injectRequestMessage.ObjectFragment.Orientation.Y = (float)cloudObject.OY;
                injectRequestMessage.ObjectFragment.Orientation.Z = (float)cloudObject.OZ;
                injectRequestMessage.ObjectFragment.Orientation.W = (float)cloudObject.OW;

                OmModelPrimitiveExt modelPrimitiveExt = new OmModelPrimitiveExt();
                modelPrimitiveExt.ModelUrl = cloudObject.ModelUrl;
                modelPrimitiveExt.Scale    = (float)cloudObject.ModelScale;
                injectRequestMessage.SetExtension(modelPrimitiveExt);

                client.InjectObject(injectRequestMessage);
            }
            else
            {
                ModifyRequestMessage modifyRequestMessage = new ModifyRequestMessage();
                modifyRequestMessage.ObjectFragment.ObjectId             = cloudObject.CloudObjectId;
                modifyRequestMessage.ObjectFragment.OwnerId              = cloudObject.Participant.ParticipantId;
                modifyRequestMessage.ObjectFragment.TypeId               = cloudObject.ObjectType.ObjectTypeId;
                modifyRequestMessage.ObjectFragment.ObjectName           = cloudObject.Name;
                modifyRequestMessage.ObjectFragment.TypeName             = cloudObject.ObjectType.Name;
                modifyRequestMessage.ObjectFragment.BoundingSphereRadius = (float)cloudObject.Radius;
                modifyRequestMessage.ObjectFragment.Mass          = (float)cloudObject.Mass;
                modifyRequestMessage.ObjectFragment.Location.X    = (float)cloudObject.X;
                modifyRequestMessage.ObjectFragment.Location.Y    = (float)cloudObject.Y;
                modifyRequestMessage.ObjectFragment.Location.Z    = (float)cloudObject.Z;
                modifyRequestMessage.ObjectFragment.Orientation.X = (float)cloudObject.OX;
                modifyRequestMessage.ObjectFragment.Orientation.Y = (float)cloudObject.OY;
                modifyRequestMessage.ObjectFragment.Orientation.Z = (float)cloudObject.OZ;
                modifyRequestMessage.ObjectFragment.Orientation.W = (float)cloudObject.OW;

                OmModelPrimitiveExt modelPrimitiveExt = new OmModelPrimitiveExt();
                modelPrimitiveExt.ModelUrl = cloudObject.ModelUrl;
                modelPrimitiveExt.Scale    = (float)cloudObject.ModelScale;
                modifyRequestMessage.SetExtension(modelPrimitiveExt);

                client.ModifyObject(modifyRequestMessage);
            }
        }
コード例 #3
0
 public void OnObjectUpdate(CloudObject cloudObject)
 {
     if (cloudObject.HasExtension)
     {
         OmModelPrimitiveExt modelPrimitiveExt = cloudObject.GetExtension <OmModelPrimitiveExt>();
         string modelUrl = modelPrimitiveExt.ModelUrl;
         if (!DeckProgram.AssetManager.IsBlackListed(modelUrl))
         {
             if (!DeckProgram.AssetManager.IsAssetDownloaded(modelUrl) &&
                 !DeckProgram.AssetManager.IsAssetDownloading(modelUrl))
             {
                 LogUtil.Info("Loading referenced model: " + modelUrl);
                 DeckProgram.AssetManager.DownloadAsset(modelUrl);
             }
             if (DeckProgram.AssetManager.IsAssetDownloaded(modelUrl))
             {
                 if (!m_objectUpdateQueue.Contains(cloudObject.ObjectId))
                 {
                     DeckProgram.AssetManager.EnsureModelIsLoadedToRenderer(modelUrl);
                     m_objectUpdateQueue.Add(cloudObject.ObjectId);
                 }
             }
             else
             {
                 if (!m_objectsWaitingAssets.ContainsKey(modelUrl))
                 {
                     m_objectsWaitingAssets.Add(modelUrl, new HashSet <Guid>());
                 }
                 if (!m_objectsWaitingAssets[modelUrl].Contains(cloudObject.ObjectId))
                 {
                     m_objectsWaitingAssets[modelUrl].Add(cloudObject.ObjectId);
                 }
             }
         }
     }
 }
コード例 #4
0
        public void Process()
        {
            if (m_objectUpdateQueue.Count > 0)
            {
                foreach (Guid objectId in m_objectUpdateQueue)
                {
                    CloudObject         cloudObject       = DeckProgram.CloudView.CloudCache.GetObject(objectId);
                    OmModelPrimitiveExt modelPrimitiveExt = cloudObject.GetExtension <OmModelPrimitiveExt>();

                    Vector3    location    = new Vector3(cloudObject.Location.X, cloudObject.Location.Y, cloudObject.Location.Z);
                    Quaternion orientation = new Quaternion(cloudObject.Orientation.W, cloudObject.Orientation.X, cloudObject.Orientation.Y, cloudObject.Orientation.Z);
                    Vector3    scale       = new Vector3(cloudObject.BoundingSphereRadius * modelPrimitiveExt.Scale, cloudObject.BoundingSphereRadius * modelPrimitiveExt.Scale, cloudObject.BoundingSphereRadius * modelPrimitiveExt.Scale);

                    bool isNewAvatar = objectId == AvatarId && !DeckProgram.DeckScene.ContainsObject(objectId);

                    if (!DeckProgram.DeckScene.ContainsObject(objectId))
                    {
                        if (IsSynchronizing)
                        {
                            CurrentObjectSynchronizationCount++;
                            if (ExpectedObjectSynchronizationCount <= CurrentObjectSynchronizationCount)
                            {
                                CurrentObjectSynchronizationCount  = 0;
                                ExpectedObjectSynchronizationCount = 0;
                                Thread.Sleep(200);
                            }
                        }

                        DeckProgram.DeckScene.AddObject(new DeckObject(objectId, cloudObject.ObjectName, cloudObject.TypeName, modelPrimitiveExt.ModelUrl, modelPrimitiveExt.Scale, location, orientation, cloudObject.BoundingSphereRadius, scale));
                    }

                    DeckObject deckObject = DeckProgram.DeckScene.GetObject(cloudObject.ObjectId);

                    if (isNewAvatar)
                    {
                        Matrix orientationMatrix;
                        Common.Rotate(out orientationMatrix, ref orientation);

                        DeckProgram.DeckRudder.AvatarTargetLocation           = location;
                        DeckProgram.DeckRudder.AvatarCurrentLocation          = location;
                        DeckProgram.DeckRudder.AvatarTargetOrientationMatrix  = orientationMatrix;
                        DeckProgram.DeckRudder.AvatarCurrentOrientationMatrix = orientationMatrix;
                        DeckProgram.DeckRudder.UpdateCameraTransformation();
                        DeckProgram.DeckRudder.SynchronizeCameraCurrentLocationWithTargetLocation();
                    }

                    deckObject.ObjectName         = cloudObject.ObjectName;
                    deckObject.NetworkLocation    = location;
                    deckObject.NetworkOrientation = orientation;
                    deckObject.Radius             = cloudObject.BoundingSphereRadius;
                    deckObject.ModelScale         = modelPrimitiveExt.Scale;
                    deckObject.NetworkScale       = scale;

                    DeckProgram.DeckScene.UpdateObject(deckObject);

                    DeckProgram.DeckScene.ActivateObject(objectId);
                }
                m_objectUpdateQueue.Clear();
            }

            if (DeckProgram.DeckRudder.IsSteered && DateTime.Now.Subtract(m_lastSteeringUpdate).TotalMilliseconds > 100)
            {
                m_lastSteeringUpdate = DateTime.Now;

                if (DeckProgram.CloudView.CloudCache.GetObject(AvatarId) != null)
                {
                    ModifyRequestMessage modifyRequestMessage = new ModifyRequestMessage();
                    modifyRequestMessage.ObjectFragment.ObjectId             = AvatarId;
                    modifyRequestMessage.ObjectFragment.OwnerId              = ParticipantId;
                    modifyRequestMessage.ObjectFragment.TypeId               = Guid.Empty;
                    modifyRequestMessage.ObjectFragment.ObjectName           = ParticipantNickName;
                    modifyRequestMessage.ObjectFragment.TypeName             = "Avatar";
                    modifyRequestMessage.ObjectFragment.BoundingSphereRadius = 2f;
                    modifyRequestMessage.ObjectFragment.Mass       = 2f;
                    modifyRequestMessage.ObjectFragment.Location.X = (float)DeckProgram.DeckRudder.AvatarTargetLocation.X;
                    modifyRequestMessage.ObjectFragment.Location.Y = (float)DeckProgram.DeckRudder.AvatarTargetLocation.Y;
                    modifyRequestMessage.ObjectFragment.Location.Z = (float)DeckProgram.DeckRudder.AvatarTargetLocation.Z;
                    Matrix     rotationMatrix = DeckProgram.DeckRudder.AvatarTargetOrientationMatrix;
                    Quaternion quaternion;
                    Common.Rotate(out quaternion, ref rotationMatrix);
                    modifyRequestMessage.ObjectFragment.Orientation.X = (float)quaternion.I;
                    modifyRequestMessage.ObjectFragment.Orientation.Y = (float)quaternion.J;
                    modifyRequestMessage.ObjectFragment.Orientation.Z = (float)quaternion.K;
                    modifyRequestMessage.ObjectFragment.Orientation.W = (float)quaternion.W;

                    OmModelPrimitiveExt modelPrimitiveExt = new OmModelPrimitiveExt();
                    modelPrimitiveExt.ModelUrl = "http://assets.bubblecloud.org/Collada/Seymour/Seymour_triangulate.dae";
                    modelPrimitiveExt.Scale    = (float)0.1f;
                    modifyRequestMessage.SetExtension(modelPrimitiveExt);

                    DeckProgram.CloudView.ModifyObject(modifyRequestMessage);
                    DeckProgram.DeckRudder.IsSteered = false;
                }
            }
        }
コード例 #5
0
        public void Process()
        {
            client.Process();

            if (client.IsConnected)
            {
                int addCount = 0;
                foreach (BallObject ball in BallArray)
                {
                    if (!ball.IsInjected)
                    {
                        ball.IsInjected = true;
                        InjectRequestMessage injectRequestMessage = new InjectRequestMessage();
                        injectRequestMessage.ObjectFragment.ObjectId             = ball.ObjectId;
                        injectRequestMessage.ObjectFragment.OwnerId              = client.ParticipantId;
                        injectRequestMessage.ObjectFragment.ObjectName           = ball.ObjectName;
                        injectRequestMessage.ObjectFragment.TypeName             = "Ball";
                        injectRequestMessage.ObjectFragment.BoundingSphereRadius = ball.ObjectBoundingSphereRadius;
                        injectRequestMessage.ObjectFragment.Mass       = ball.Mass;
                        injectRequestMessage.ObjectFragment.Location.X = ball.Location.X;
                        injectRequestMessage.ObjectFragment.Location.Y = ball.Location.Y;
                        injectRequestMessage.ObjectFragment.Location.Z = ball.Location.Z;

                        OmModelPrimitiveExt modelPrimitiveExt = new OmModelPrimitiveExt();
                        modelPrimitiveExt.ModelUrl = "http://assets.bubblecloud.org/Collada/Duck/duck_triangulate.dae";
                        modelPrimitiveExt.Scale    = 0.01f;
                        injectRequestMessage.SetExtension(modelPrimitiveExt);

                        //injectRequestMessage.ObjectFragment.SetExtensionData(new byte[50]);
                        client.InjectObject(injectRequestMessage);
                        addCount++;
                        if (addCount > 5)
                        {
                            break;
                        }
                    }
                }

                for (int i = 0; i < 20; i++)
                {
                    BallArray[updateIndex].OrbitAngle += 0.01f;
                    BallArray[updateIndex].Location.X  =
                        (float)(BallArray[updateIndex].OrbitRadius * Math.Cos(BallArray[updateIndex].OrbitAngle));
                    BallArray[updateIndex].Location.Y = 0.5f;
                    BallArray[updateIndex].Location.Z =
                        (float)(BallArray[updateIndex].OrbitRadius * Math.Sin(BallArray[updateIndex].OrbitAngle));

                    if (client.CloudCache.GetObject(BallArray[updateIndex].ObjectId) != null)
                    {
                        MovementEventMessage movementEvent = new MovementEventMessage();
                        movementEvent.ObjectIndex =
                            client.CloudCache.GetObject(BallArray[updateIndex].ObjectId).RemoteObjectIndex;
                        movementEvent.Location.X = BallArray[updateIndex].Location.X;
                        movementEvent.Location.Y = BallArray[updateIndex].Location.Y;
                        movementEvent.Location.Z = BallArray[updateIndex].Location.Z;
                        client.MoveObject(movementEvent);
                    }

                    this.updateIndex++;
                    if (this.updateIndex >= NumberOfObjects)
                    {
                        this.updateIndex = 0;
                    }
                }
            }
        }