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 + " )"); }
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); } }
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); } } } } }
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; } } }
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; } } } }