/// <summary> /// Creates a new snapshot from the given group /// </summary> /// <param name="sog"></param> /// <returns></returns> public static SceneObjectGroupSnapshot FromSceneObjectGroup(SceneObjectGroup sog, SerializationFlags flags) { SceneObjectGroupSnapshot snapshot = new SceneObjectGroupSnapshot { RootPart = SceneObjectPartSnapshot.FromSceneObjectPart(sog.RootPart, flags) }; SceneObjectPart[] parts = sog.GetParts(); SceneObjectPartSnapshot[] partsSnap; //do we have more than just the root? if (parts.Length > 1) { List <SceneObjectPartSnapshot> partsCollect = new List <SceneObjectPartSnapshot>(); for (int i = 0; i < parts.Length; i++) { SceneObjectPart part = parts[i]; if (!part.IsRootPart()) { partsCollect.Add(SceneObjectPartSnapshot.FromSceneObjectPart(parts[i], flags)); } } partsSnap = partsCollect.ToArray(); } else { //nope, just the root partsSnap = new SceneObjectPartSnapshot[0]; } snapshot.ChildParts = partsSnap; if (sog.IsAttachment && sog.HasGroupChanged) { snapshot.TaintedAttachment = true; } else { snapshot.TaintedAttachment = false; } if (sog.IsAttachment && sog.IsTempAttachment) { snapshot.TempAttachment = true; } else { snapshot.TempAttachment = false; } return(snapshot); }
static public SceneObjectPartSnapshot FromSceneObjectPart(SceneObjectPart part, SerializationFlags flags) { bool serializePhysicsShapes = (flags & SerializationFlags.SerializePhysicsShapes) != 0; bool serializeScriptBytecode = (flags & SerializationFlags.SerializeScriptBytecode) != 0; StopScriptReason stopScriptReason; if ((flags & SerializationFlags.StopScripts) == 0) { stopScriptReason = StopScriptReason.None; } else { if ((flags & SerializationFlags.FromCrossing) != 0) { stopScriptReason = StopScriptReason.Crossing; } else { stopScriptReason = StopScriptReason.Derez; } } SceneObjectPartSnapshot partSnap = new SceneObjectPartSnapshot { AngularVelocity = part.PhysicalAngularVelocity, AngularVelocityTarget = part.AngularVelocity, BaseMask = part.BaseMask, Category = part.Category, ClickAction = part.ClickAction, CollisionSound = part.CollisionSound.Guid, CollisionSoundVolume = part.CollisionSoundVolume, CreationDate = part.CreationDate, CreatorId = part.CreatorID.Guid, Description = part.Description, EveryoneMask = part.EveryoneMask, Flags = part.Flags, GroupId = part.GroupID.Guid, GroupMask = part.GroupMask, //if this is an attachment, dont fill out the group position. This prevents an issue where //a user is crossing to a new region and the vehicle has already been sent. Since the attachment's //group position is actually the wearer's position and the wearer's position is the vehicle position, //trying to get the attachment grp pos triggers an error and a ton of log spam. GroupPosition = part.ParentGroup.IsAttachment ? OpenMetaverse.Vector3.Zero : part.GroupPosition, HoverText = part.Text, Id = part.UUID.Guid, Inventory = TaskInventorySnapshot.FromTaskInventory(part), KeyframeAnimation = KeyframeAnimationSnapshot.FromKeyframeAnimation(part.KeyframeAnimation), LastOwnerId = part.LastOwnerID.Guid, LinkNumber = part.LinkNum, LocalId = part.LocalId, Material = (OpenMetaverse.Material)part.Material, MediaUrl = part.MediaUrl, Name = part.Name, NextOwnerMask = part.NextOwnerMask, ObjectFlags = (OpenMetaverse.PrimFlags)part.ObjectFlags, ObjectSaleType = part.ObjectSaleType, OffsetPosition = part.OffsetPosition, OwnerId = part.OwnerID.Guid, OwnerMask = part.OwnerMask, OwnershipCost = part.OwnershipCost, ParentId = part.ParentID, ParticleSystem = part.ParticleSystem, PassTouches = part.PassTouches, PayPrice = part.PayPrice, RegionHandle = part.RegionHandle, RotationOffset = part.RotationOffset, SalePrice = part.SalePrice, SavedAttachmentPoint = part.SavedAttachmentPoint, SavedAttachmentPos = part.SavedAttachmentPos, SavedAttachmentRot = part.SavedAttachmentRot, Scale = part.Scale, ScriptAccessPin = part.ScriptAccessPin, SerializedPhysicsData = part.SerializedPhysicsData, ServerWeight = part.ServerWeight, Shape = PrimShapeSnapshot.FromShape(part.Shape), SitName = part.SitName, SitTargetOrientation = part.SitTargetOrientation, SitTargetPosition = part.SitTargetPosition, Sound = part.Sound.Guid, SoundFlags = part.SoundOptions, SoundGain = part.SoundGain, SoundRadius = part.SoundRadius, StreamingCost = part.StreamingCost, TextColor = part.TextColor, TextureAnimation = part.TextureAnimation, TouchName = part.TouchName, Velocity = part.Velocity, FromItemId = part.FromItemID.Guid }; Dictionary <OpenMetaverse.UUID, byte[]> states; Dictionary <OpenMetaverse.UUID, byte[]> byteCode; if (serializeScriptBytecode) { Tuple <Dictionary <OpenMetaverse.UUID, byte[]>, Dictionary <OpenMetaverse.UUID, byte[]> > statesAndBytecode = part.Inventory.GetBinaryScriptStatesAndCompiledScripts(stopScriptReason); states = statesAndBytecode.Item1; byteCode = statesAndBytecode.Item2; } else { states = part.Inventory.GetBinaryScriptStates(stopScriptReason); byteCode = null; } partSnap.SerializedScriptStates = new Dictionary <Guid, byte[]>(states.Count); foreach (var kvp in states) { //map from UUID to Guid partSnap.SerializedScriptStates[kvp.Key.Guid] = kvp.Value; } if (byteCode != null) { partSnap.SeralizedScriptBytecode = new Dictionary <Guid, byte[]>(); foreach (var kvp in byteCode) { //map from UUID to Guid partSnap.SeralizedScriptBytecode[kvp.Key.Guid] = kvp.Value; } } if (serializePhysicsShapes) { partSnap.SerializedPhysicsShapes = part.SerializedPhysicsShapes; } return(partSnap); }
static public SceneObjectPartSnapshot FromSceneObjectPart(SceneObjectPart part, SerializationFlags flags) { bool serializePhysicsShapes = (flags & SerializationFlags.SerializePhysicsShapes) != 0; bool serializeScriptBytecode = (flags & SerializationFlags.SerializeScriptBytecode) != 0; StopScriptReason stopScriptReason; if ((flags & SerializationFlags.StopScripts) == 0) { stopScriptReason = StopScriptReason.None; } else { if ((flags & SerializationFlags.FromCrossing) != 0) stopScriptReason = StopScriptReason.Crossing; else stopScriptReason = StopScriptReason.Derez; } SceneObjectPartSnapshot partSnap = new SceneObjectPartSnapshot { AngularVelocity = part.PhysicalAngularVelocity, AngularVelocityTarget = part.AngularVelocity, BaseMask = part.BaseMask, Category = part.Category, ClickAction = part.ClickAction, CollisionSound = part.CollisionSound.Guid, CollisionSoundVolume = part.CollisionSoundVolume, CreationDate = part.CreationDate, CreatorId = part.CreatorID.Guid, Description = part.Description, EveryoneMask = part.EveryoneMask, Flags = part.Flags, GroupId = part.GroupID.Guid, GroupMask = part.GroupMask, //if this is an attachment, dont fill out the group position. This prevents an issue where //a user is crossing to a new region and the vehicle has already been sent. Since the attachment's //group position is actually the wearer's position and the wearer's position is the vehicle position, //trying to get the attachment grp pos triggers an error and a ton of log spam. GroupPosition = part.ParentGroup.IsAttachment ? OpenMetaverse.Vector3.Zero : part.GroupPosition, HoverText = part.Text, Id = part.UUID.Guid, Inventory = TaskInventorySnapshot.FromTaskInventory(part), KeyframeAnimation = KeyframeAnimationSnapshot.FromKeyframeAnimation(part.KeyframeAnimation), LastOwnerId = part.LastOwnerID.Guid, LinkNumber = part.LinkNum, LocalId = part.LocalId, Material = (OpenMetaverse.Material)part.Material, MediaUrl = part.MediaUrl, Name = part.Name, NextOwnerMask = part.NextOwnerMask, ObjectFlags = (OpenMetaverse.PrimFlags)part.ObjectFlags, ObjectSaleType = part.ObjectSaleType, OffsetPosition = part.OffsetPosition, OwnerId = part.OwnerID.Guid, OwnerMask = part.OwnerMask, OwnershipCost = part.OwnershipCost, ParentId = part.ParentID, ParticleSystem = part.ParticleSystem, PassTouches = part.PassTouches, PayPrice = part.PayPrice, RegionHandle = part.RegionHandle, RotationOffset = part.RotationOffset, SalePrice = part.SalePrice, SavedAttachmentPoint = part.SavedAttachmentPoint, SavedAttachmentPos = part.SavedAttachmentPos, SavedAttachmentRot = part.SavedAttachmentRot, Scale = part.Scale, ScriptAccessPin = part.ScriptAccessPin, SerializedPhysicsData = part.SerializedPhysicsData, ServerWeight = part.ServerWeight, Shape = PrimShapeSnapshot.FromShape(part.Shape), SitName = part.SitName, SitTargetOrientation = part.SitTargetOrientation, SitTargetPosition = part.SitTargetPosition, Sound = part.Sound.Guid, SoundFlags = part.SoundOptions, SoundGain = part.SoundGain, SoundRadius = part.SoundRadius, StreamingCost = part.StreamingCost, TextColor = part.TextColor, TextureAnimation = part.TextureAnimation, TouchName = part.TouchName, Velocity = part.Velocity, FromItemId = part.FromItemID.Guid }; Dictionary<OpenMetaverse.UUID, byte[]> states; Dictionary<OpenMetaverse.UUID, byte[]> byteCode; if (serializeScriptBytecode) { Tuple<Dictionary<OpenMetaverse.UUID, byte[]>, Dictionary<OpenMetaverse.UUID, byte[]>> statesAndBytecode = part.Inventory.GetBinaryScriptStatesAndCompiledScripts(stopScriptReason); states = statesAndBytecode.Item1; byteCode = statesAndBytecode.Item2; } else { states = part.Inventory.GetBinaryScriptStates(stopScriptReason); byteCode = null; } partSnap.SerializedScriptStates = new Dictionary<Guid, byte[]>(states.Count); foreach (var kvp in states) { //map from UUID to Guid partSnap.SerializedScriptStates[kvp.Key.Guid] = kvp.Value; } if (byteCode != null) { partSnap.SeralizedScriptBytecode = new Dictionary<Guid, byte[]>(); foreach (var kvp in byteCode) { //map from UUID to Guid partSnap.SeralizedScriptBytecode[kvp.Key.Guid] = kvp.Value; } } if (serializePhysicsShapes) { partSnap.SerializedPhysicsShapes = part.SerializedPhysicsShapes; } return partSnap; }
/// <summary> /// Creates a new snapshot from the given group /// </summary> /// <param name="sog"></param> /// <returns></returns> public static SceneObjectGroupSnapshot FromSceneObjectGroup(SceneObjectGroup sog, SerializationFlags flags) { SceneObjectGroupSnapshot snapshot = new SceneObjectGroupSnapshot { RootPart = SceneObjectPartSnapshot.FromSceneObjectPart(sog.RootPart, flags) }; var parts = sog.GetParts(); SceneObjectPartSnapshot[] partsSnap; //do we have more than just the root? if (parts.Count > 1) { List<SceneObjectPartSnapshot> partsCollect = new List<SceneObjectPartSnapshot>(); foreach (SceneObjectPart part in parts) { if (!part.IsRootPart()) { partsCollect.Add(SceneObjectPartSnapshot.FromSceneObjectPart(part, flags)); } } partsSnap = partsCollect.ToArray(); } else { //nope, just the root partsSnap = new SceneObjectPartSnapshot[0]; } snapshot.ChildParts = partsSnap; if (sog.IsAttachment && sog.HasGroupChanged) { snapshot.TaintedAttachment = true; } else { snapshot.TaintedAttachment = false; } if (sog.IsAttachment && sog.IsTempAttachment) { snapshot.TempAttachment = true; } else { snapshot.TempAttachment = false; } return snapshot; }
/// <summary> /// /// </summary> /// <param name="osPart"></param> /// <returns></returns> private SceneObjectPartSnapshot ConvertOpenSimPartToPartSnapshot(dynamic osPart) { //we need server weight and streaming cost SceneObjectPartSnapshot snap = new SceneObjectPartSnapshot { AngularVelocity = new Vector3(osPart.AngularVelocity.X, osPart.AngularVelocity.Y, osPart.AngularVelocity.Z), AngularVelocityTarget = new Vector3(osPart.AngularVelocity.X, osPart.AngularVelocity.Y, osPart.AngularVelocity.Z), BaseMask = osPart.BaseMask, Category = osPart.Category, ClickAction = osPart.ClickAction, CollisionSound = osPart.CollisionSound.Guid, CollisionSoundVolume = osPart.CollisionSoundVolume, CreationDate = osPart.CreationDate, CreatorId = m_creatorOverride == Guid.Empty ? osPart.CreatorID.Guid : m_creatorOverride, Description = osPart.Description, EveryoneMask = osPart.EveryoneMask, Flags = osPart.Flags, FromItemId = Guid.Empty, GroupId = osPart.GroupID.Guid, GroupMask = osPart.GroupMask, GroupPosition = osPart.GroupPosition, HoverText = osPart.Text, Id = osPart.UUID.Guid, Inventory = ExtractSOPInventorySnapshot(osPart), KeyframeAnimation = ExtractSOPKFASnapshot(osPart), LastOwnerId = osPart.LastOwnerID.Guid, LinkNumber = osPart.LinkNum, LocalId = osPart.LocalId, Material = (Material)osPart.Material, MediaUrl = osPart.MediaUrl, Name = osPart.Name, NextOwnerMask = osPart.NextOwnerMask, ObjectFlags = (PrimFlags)osPart.ObjectFlags, ObjectSaleType = osPart.ObjectSaleType, OffsetPosition = osPart.OffsetPosition, OwnerMask = osPart.OwnerMask, OwnershipCost = osPart.OwnershipCost, ParentId = osPart.ParentID, ParticleSystem = osPart.ParticleSystem, PassTouches = osPart.PassTouches, PayPrice = osPart.PayPrice, RegionHandle = osPart.RegionHandle, RotationOffset = new Quaternion(osPart.RotationOffset.X, osPart.RotationOffset.Y, osPart.RotationOffset.Z, osPart.RotationOffset.W), SalePrice = osPart.SalePrice, Scale = osPart.Scale, ScriptAccessPin = osPart.ScriptAccessPin, ServerWeight = 1, StreamingCost = 1, Shape = ExtractSOPBaseShape(osPart), OwnerId = m_ownerOverride == Guid.Empty ? osPart.OwnerID.Guid : m_ownerOverride, }; return snap; }