public void TestPartSerialzationDeserialization() { SceneObjectPart rootPart = new SceneObjectPart(UUID.Zero, new OpenSim.Framework.PrimitiveBaseShape(), new Vector3(1, 2, 3), Quaternion.Identity, Vector3.Zero, false); rootPart.Name = "RootPart"; SceneObjectPart part = Util.RandomSOP("ChildPart", 2); var pgrp1 = new SceneObjectGroup(rootPart); pgrp1.AddPart(part); part.InventorySerial = 1; part.Rezzed = DateTime.Now; part.TextColor = System.Drawing.Color.FromArgb(1,2,3,4); byte[] bytes = serEngine.SceneObjectSerializer.SerializePartToBytes(part, OpenSim.Region.Framework.Scenes.Serialization.SerializationFlags.None); SceneObjectPart rootPart2 = new SceneObjectPart(UUID.Zero, new OpenSim.Framework.PrimitiveBaseShape(), new Vector3(1, 2, 3), Quaternion.Identity, Vector3.Zero, false); rootPart2.Name = "RootPart2"; SceneObjectPart deserPart = serEngine.SceneObjectSerializer.DeserializePartFromBytes(bytes); var pgrp2 = new SceneObjectGroup(rootPart2); pgrp2.AddPart(deserPart); deserPart.Rezzed = part.Rezzed; CompareObjects comp = new CompareObjects(); comp.CompareStaticFields = false; comp.CompareStaticProperties = false; comp.ElementsToIgnore = PrimCompareIgnoreList; Assert.IsTrue(comp.Compare(part, deserPart), comp.DifferencesString); }
public void TestGroupSerializationDeserialization() { var sop1 = SceneUtil.RandomSOP("Root", 1); var sop2 = SceneUtil.RandomSOP("Child1", 2); var sop3 = SceneUtil.RandomSOP("Child2", 3); SceneObjectGroup group = new SceneObjectGroup(sop1); group.AddPart(sop2); group.AddPart(sop3); SceneObjectGroup deserGroup = null; string grpBytes = null; Assert.DoesNotThrow(() => { grpBytes = SceneObjectSerializer.ToXml2Format(group, true); }); Assert.NotNull(grpBytes); Assert.DoesNotThrow(() => { deserGroup = SceneObjectSerializer.FromXml2Format(grpBytes); }); CompareObjects comp = new CompareObjects(); comp.CompareStaticFields = false; comp.CompareStaticProperties = false; comp.ElementsToIgnore = PrimCompareIgnoreList; Assert.IsTrue(comp.Compare(group, deserGroup), comp.DifferencesString); }
public void TestGroupInventorySerializationDeserialization() { var sop1 = Util.RandomSOP("Root", 1); var sop2 = Util.RandomSOP("Child1", 2); var sop3 = Util.RandomSOP("Child2", 3); SceneObjectGroup group = new SceneObjectGroup(sop1); group.AddPart(sop2); group.AddPart(sop3); var grpBytes = serEngine.InventoryObjectSerializer.SerializeGroupToInventoryBytes(group, SerializationFlags.None); SceneObjectGroup deserGroup = serEngine.InventoryObjectSerializer.DeserializeGroupFromInventoryBytes(grpBytes); CompareObjects comp = new CompareObjects(); comp.CompareStaticFields = false; comp.CompareStaticProperties = false; comp.ElementsToIgnore = PrimCompareIgnoreList; Assert.IsTrue(comp.Compare(group, deserGroup), comp.DifferencesString); }
public void TestDuplicateObject() { TestHelpers.InMethod(); // TestHelpers.EnableLogging(); Scene scene = new SceneHelpers().SetupScene(); UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010"); string part1Name = "part1"; UUID part1Id = new UUID("00000000-0000-0000-0000-000000000001"); string part2Name = "part2"; UUID part2Id = new UUID("00000000-0000-0000-0000-000000000002"); SceneObjectPart part1 = new SceneObjectPart(ownerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = part1Name, UUID = part1Id }; SceneObjectGroup so = new SceneObjectGroup(part1); SceneObjectPart part2 = new SceneObjectPart(ownerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = part2Name, UUID = part2Id }; so.AddPart(part2); scene.AddNewSceneObject(so, false); SceneObjectGroup dupeSo = scene.SceneGraph.DuplicateObject( part1.LocalId, new Vector3(10, 0, 0), 0, ownerId, UUID.Zero, Quaternion.Identity); Assert.That(dupeSo.Parts.Length, Is.EqualTo(2)); SceneObjectPart dupePart1 = dupeSo.GetLinkNumPart(1); SceneObjectPart dupePart2 = dupeSo.GetLinkNumPart(2); Assert.That(dupePart1.LocalId, Is.Not.EqualTo(part1.LocalId)); Assert.That(dupePart2.LocalId, Is.Not.EqualTo(part2.LocalId)); Assert.That(dupePart1.Flags, Is.EqualTo(part1.Flags)); Assert.That(dupePart2.Flags, Is.EqualTo(part2.Flags)); /* Assert.That(part1.PhysActor, Is.Not.Null); Assert.That(part2.PhysActor, Is.Not.Null); Assert.That(dupePart1.PhysActor, Is.Not.Null); Assert.That(dupePart2.PhysActor, Is.Not.Null); */ // TestHelpers.DisableLogging(); }
public static SceneObjectGroup FromXml2Format(string xmlData) { //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); //int time = System.Environment.TickCount; // libomv.types changes UUID to Guid xmlData = xmlData.Replace("<UUID>", "<Guid>"); xmlData = xmlData.Replace("</UUID>", "</Guid>"); // Handle Nested <UUID><UUID> property xmlData = xmlData.Replace("<Guid><Guid>", "<UUID><Guid>"); xmlData = xmlData.Replace("</Guid></Guid>", "</Guid></UUID>"); try { XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlData); XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart"); if (parts.Count == 0) { m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed: No SceneObjectPart nodes. xml was " + xmlData); return null; } StringReader sr = new StringReader(parts[0].OuterXml); XmlTextReader reader = new XmlTextReader(sr); SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(reader)); reader.Close(); sr.Close(); // Then deal with the rest for (int i = 1; i < parts.Count; i++) { sr = new StringReader(parts[i].OuterXml); reader = new XmlTextReader(sr); SceneObjectPart part = SceneObjectPart.FromXml(reader); sceneObject.AddPart(part); part.StoreUndoState(); reader.Close(); sr.Close(); } // Script state may, or may not, exist. Not having any, is NOT // ever a problem. sceneObject.LoadScriptState(doc); return sceneObject; } catch (Exception e) { m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); return null; } }
public UUID tsuccirRezLinkset(UUID host, UUID script, int numberOfChildPrims) { numberOfChildPrims = Math.Max(0, numberOfChildPrims); SceneObjectPart part = m_scene.GetSceneObjectPart(host); if (part == null || !m_scene.Permissions.CanRezObject(1 + numberOfChildPrims, part.OwnerID, Vector3.Zero)) return UUID.Zero; SceneObjectGroup newGroup = new SceneObjectGroup(part.OwnerID, part.AbsolutePosition, Quaternion.Identity, PrimitiveBaseShape.Default); for (int i = 0; i < numberOfChildPrims; ++i) { newGroup.AddPart(new SceneObjectPart(part.OwnerID, PrimitiveBaseShape.Default, part.AbsolutePosition, Quaternion.Identity, Vector3.Zero)); } if (!m_scene.SceneGraph.AddNewSceneObject(newGroup, true, part.AbsolutePosition, Quaternion.Identity, Vector3.Zero)) { ScriptError(part, "Failed to add linkset to scene graph."); return UUID.Zero; } else { newGroup.FromPartID = host; newGroup.ScheduleGroupForFullUpdate(); IScriptModule[] modules = m_scene.RequestModuleInterfaces<IScriptModule>(); foreach (IScriptModule module in modules) { module.PostObjectEvent(host, "object_rez", new object[] { new LSL_String(newGroup.UUID.ToString()) }); } return newGroup.UUID; } }
public static SceneObjectGroup FromXml2Format(string xmlData) { //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); //int time = System.Environment.TickCount; try { XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlData); XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart"); if (parts.Count == 0) { m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed: No SceneObjectPart nodes. xml was " + xmlData); return null; } StringReader sr = new StringReader(parts[0].OuterXml); XmlTextReader reader = new XmlTextReader(sr); SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(reader)); reader.Close(); sr.Close(); // Then deal with the rest for (int i = 1; i < parts.Count; i++) { sr = new StringReader(parts[i].OuterXml); reader = new XmlTextReader(sr); SceneObjectPart part = SceneObjectPart.FromXml(reader); int originalLinkNum = part.LinkNum; sceneObject.AddPart(part); // SceneObjectGroup.AddPart() tries to be smart and automatically set the LinkNum. // We override that here if (originalLinkNum != 0) part.LinkNum = originalLinkNum; reader.Close(); sr.Close(); } // Script state may, or may not, exist. Not having any, is NOT // ever a problem. sceneObject.LoadScriptState(doc); return sceneObject; } catch (Exception e) { m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); return null; } }
//////// Read ///////// public static bool Xml2ToSOG(XmlTextReader reader, SceneObjectGroup sog) { reader.Read(); reader.ReadStartElement("SceneObjectGroup"); SceneObjectPart root = Xml2ToSOP(reader); if (root != null) sog.SetRootPart(root); else { return false; } if (sog.UUID == UUID.Zero) sog.UUID = sog.RootPart.UUID; reader.Read(); // OtherParts while (!reader.EOF) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name == "SceneObjectPart") { SceneObjectPart child = Xml2ToSOP(reader); if (child != null) sog.AddPart(child); } else { //Logger.Log("Found unexpected prim XML element " + reader.Name, Helpers.LogLevel.Debug); reader.Read(); } break; case XmlNodeType.EndElement: default: reader.Read(); break; } } return true; }
/// <summary> /// Deserialize a scene object from the original xml format /// </summary> /// <param name="serialization"></param> /// <returns></returns> public static SceneObjectGroup FromOriginalXmlFormat(UUID fromUserInventoryItemID, string xmlData) { //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); //int time = System.Environment.TickCount; SceneObjectGroup sceneObject = new SceneObjectGroup(); // libomv.types changes UUID to Guid xmlData = xmlData.Replace("<UUID>", "<Guid>"); xmlData = xmlData.Replace("</UUID>", "</Guid>"); // Handle Nested <UUID><UUID> property xmlData = xmlData.Replace("<Guid><Guid>", "<UUID><Guid>"); xmlData = xmlData.Replace("</Guid></Guid>", "</Guid></UUID>"); try { StringReader sr; XmlTextReader reader; XmlNodeList parts; XmlDocument doc; int linkNum; doc = new XmlDocument(); doc.LoadXml(xmlData); parts = doc.GetElementsByTagName("RootPart"); if (parts.Count == 0) { throw new Exception("Invalid Xml format - no root part"); } else { sr = new StringReader(parts[0].InnerXml); reader = new XmlTextReader(sr); sceneObject.SetRootPart(SceneObjectPart.FromXml(fromUserInventoryItemID, reader)); reader.Close(); sr.Close(); } parts = doc.GetElementsByTagName("Part"); for (int i = 0; i < parts.Count; i++) { sr = new StringReader(parts[i].InnerXml); reader = new XmlTextReader(sr); SceneObjectPart part = SceneObjectPart.FromXml(reader); linkNum = part.LinkNum; sceneObject.AddPart(part); part.LinkNum = linkNum; part.TrimPermissions(); part.StoreUndoState(); reader.Close(); sr.Close(); } // Script state may, or may not, exist. Not having any, is NOT // ever a problem. sceneObject.LoadScriptState(doc); } catch (Exception e) { m_log.ErrorFormat( "[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); } //m_log.DebugFormat("[SERIALIZER]: Finished deserialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time); return sceneObject; }
public static SceneObjectGroup FromXml2Format(string xmlData) { //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); //int time = System.Environment.TickCount; SceneObjectGroup sceneObject = new SceneObjectGroup(); // libomv.types changes UUID to Guid xmlData = xmlData.Replace("<UUID>", "<Guid>"); xmlData = xmlData.Replace("</UUID>", "</Guid>"); // Handle Nested <UUID><UUID> property xmlData = xmlData.Replace("<Guid><Guid>", "<UUID><Guid>"); xmlData = xmlData.Replace("</Guid></Guid>", "</Guid></UUID>"); try { XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlData); XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart"); // Process the root part first if (parts.Count > 0) { StringReader sr = new StringReader(parts[0].OuterXml); XmlTextReader reader = new XmlTextReader(sr); sceneObject.SetRootPart(SceneObjectPart.FromXml(reader)); reader.Close(); sr.Close(); } // Then deal with the rest for (int i = 1; i < parts.Count; i++) { StringReader sr = new StringReader(parts[i].OuterXml); XmlTextReader reader = new XmlTextReader(sr); SceneObjectPart part = SceneObjectPart.FromXml(reader); int originalLinkNum = part.LinkNum; sceneObject.AddPart(part); // SceneObjectGroup.AddPart() tries to be smart and automatically set the LinkNum. // We override that here if (originalLinkNum != 0) part.LinkNum = originalLinkNum; part.StoreUndoState(); reader.Close(); sr.Close(); } // Script state may, or may not, exist. Not having any, is NOT // ever a problem. sceneObject.LoadScriptState(doc); //m_log.DebugFormat("[SERIALIZER]: Finished deserialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time); return sceneObject; } catch (Exception e) { m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); } return null; }
public void TestRenderMaterialsSerialization() { var sop1 = SceneUtil.RandomSOP("Root", 1); var sop2 = SceneUtil.RandomSOP("Child1", 2); var sop3 = SceneUtil.RandomSOP("Child2", 3); var mat1 = new RenderMaterial(UUID.Random(), UUID.Random()); var mat2 = new RenderMaterial(UUID.Random(), UUID.Random()); sop1.Shape.RenderMaterials.AddMaterial(mat1); sop2.Shape.RenderMaterials.AddMaterial(mat2); SceneObjectGroup group = new SceneObjectGroup(sop1); group.AddPart(sop2); group.AddPart(sop3); SceneObjectGroup deserGroup = null; string grpBytes = null; Assert.DoesNotThrow(() => { grpBytes = SceneObjectSerializer.ToXml2Format(group, true); }); Assert.NotNull(grpBytes); Assert.DoesNotThrow(() => { deserGroup = SceneObjectSerializer.FromXml2Format(grpBytes); }); var newsop1 = deserGroup.GetChildPart(1); var newsop2 = deserGroup.GetChildPart(2); var newsop3 = deserGroup.GetChildPart(3); Assert.That(sop1.Shape.RenderMaterials, Is.EqualTo(newsop1.Shape.RenderMaterials)); Assert.That(sop2.Shape.RenderMaterials, Is.EqualTo(newsop2.Shape.RenderMaterials)); Assert.That(sop3.Shape.RenderMaterials, Is.EqualTo(newsop3.Shape.RenderMaterials)); }
public void TestNullMediaEntryIsNotAnError() { var sop1 = SceneUtil.RandomSOP("Root", 1); var sop2 = SceneUtil.RandomSOP("Child1", 2); var sop3 = SceneUtil.RandomSOP("Child2", 3); sop1.Shape.Media = new PrimitiveBaseShape.PrimMedia(3); sop1.Shape.Media[0] = null; sop1.Shape.Media[1] = new MediaEntry(); sop1.Shape.Media[2] = null; SceneObjectGroup group = new SceneObjectGroup(sop1); group.AddPart(sop2); group.AddPart(sop3); SceneObjectGroup deserGroup = null; string grpBytes = null; Assert.DoesNotThrow(() => { grpBytes = SceneObjectSerializer.ToXml2Format(group, true); }); Assert.NotNull(grpBytes); Assert.DoesNotThrow(() => { deserGroup = SceneObjectSerializer.FromXml2Format(grpBytes); }); }
private SceneObjectGroup LoadObject(UUID uuid, UUID region) { SceneObjectGroup group = new SceneObjectGroup(); ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); criteria.Add(Expression.Eq("RegionID", region)); criteria.Add(Expression.Eq("ParentUUID", uuid)); criteria.AddOrder(Order.Asc("ParentID")); foreach (SceneObjectPart p in criteria.List()) { // root part if (p.UUID == uuid) { group.SetRootPart(p); } else { group.AddPart(p); } } return group; }
internal SceneObjectGroup ToSceneObjectGroup() { SceneObjectGroup sog = new SceneObjectGroup(); SceneObjectPart rootPart = RootPart.ToSceneObjectPart(); sog.SetRootPart(rootPart); if (ChildParts != null) { foreach (var partSnap in ChildParts) { SceneObjectPart childPart = partSnap.ToSceneObjectPart(); int originalLinkNum = childPart.LinkNum; sog.AddPart(childPart); // SceneObjectGroup.AddPart() tries to be smart and automatically set the LinkNum. // We override that here if (originalLinkNum != 0) childPart.LinkNum = originalLinkNum; childPart.StoreUndoState(); } } sog.TaintedAttachment = this.TaintedAttachment; sog.IsTempAttachment = this.TempAttachment; return sog; }
/// <summary> /// Create a scene object but do not add it to the scene. /// </summary> /// <param name="parts"> /// The number of parts that should be in the scene object /// </param> /// <param name="ownerId"></param> /// <param name="partNamePrefix"> /// The prefix to be given to part names. This will be suffixed with "Part<part no>" /// (e.g. mynamePart1 for the root part) /// </param> /// <param name="uuidTail"> /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}" /// will be given to the root part, and incremented for each part thereafter. /// </param> /// <returns></returns> public static SceneObjectGroup CreateSceneObject(int parts, UUID ownerId, string partNamePrefix, int uuidTail) { string rawSogId = string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail); SceneObjectGroup sog = new SceneObjectGroup( CreateSceneObjectPart(string.Format("{0}Part1", partNamePrefix), new UUID(rawSogId), ownerId)); if (parts > 1) for (int i = 2; i <= parts; i++) sog.AddPart( CreateSceneObjectPart( string.Format("{0}Part{1}", partNamePrefix, i), new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i - 1)), ownerId)); return sog; }
public void TestCoalescedSerializationDeserialization() { var sop1 = Util.RandomSOP("Root", 1); var sop2 = Util.RandomSOP("Child1", 2); var sop3 = Util.RandomSOP("Child2", 3); SceneObjectGroup group = new SceneObjectGroup(sop1); group.AddPart(sop2); group.AddPart(sop3); var sop4 = Util.RandomSOP("Root2", 1); var sop5 = Util.RandomSOP("Child12", 2); var sop6 = Util.RandomSOP("Child22", 3); SceneObjectGroup group2 = new SceneObjectGroup(sop4); group2.AddPart(sop5); group2.AddPart(sop6); var gp1perms = group.GetNewItemPermissions(UUID.Random()); var gp2perms = group2.GetNewItemPermissions(UUID.Random()); var perms = new Dictionary<UUID, ItemPermissionBlock>(); perms[group.UUID] = gp1perms; perms[group2.UUID] = gp2perms; CoalescedObject cobj = new CoalescedObject( new List<SceneObjectGroup> { group, group2 }, perms ); var colbytes = serEngine.CoalescedObjectSerializer.SerializeObjectToBytes(cobj, SerializationFlags.None); var deserColObj = serEngine.CoalescedObjectSerializer.DeserializeObjectFromBytes(colbytes); CompareObjects comp = new CompareObjects(); comp.CompareStaticFields = false; comp.CompareStaticProperties = false; comp.ElementsToIgnore = PrimCompareIgnoreList; Assert.IsTrue(comp.Compare(cobj, deserColObj), comp.DifferencesString); }
public void TestChangeSceneObjectUuid() { string rootPartName = "rootpart"; UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); string childPartName = "childPart"; UUID childPartUuid = new UUID("00000000-0000-0000-0001-000000000000"); SceneObjectPart rootPart = new SceneObjectPart(UUID.Zero, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = rootPartName, UUID = rootPartUuid }; SceneObjectPart linkPart = new SceneObjectPart(UUID.Zero, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = childPartName, UUID = childPartUuid }; SceneObjectGroup sog = new SceneObjectGroup(rootPart); sog.AddPart(linkPart); Assert.That(sog.UUID, Is.EqualTo(rootPartUuid)); Assert.That(sog.RootPart.UUID, Is.EqualTo(rootPartUuid)); Assert.That(sog.Parts.Length, Is.EqualTo(2)); UUID newRootPartUuid = new UUID("00000000-0000-0000-0000-000000000002"); sog.UUID = newRootPartUuid; Assert.That(sog.UUID, Is.EqualTo(newRootPartUuid)); Assert.That(sog.RootPart.UUID, Is.EqualTo(newRootPartUuid)); Assert.That(sog.Parts.Length, Is.EqualTo(2)); }
public void TestNullMediaEntryIsNotAnError() { var sop1 = Util.RandomSOP("Root", 1); var sop2 = Util.RandomSOP("Child1", 2); var sop3 = Util.RandomSOP("Child2", 3); sop1.Shape.Media = new PrimitiveBaseShape.PrimMedia(3); sop1.Shape.Media[0] = null; sop1.Shape.Media[1] = new MediaEntry(); sop1.Shape.Media[2] = null; SceneObjectGroup group = new SceneObjectGroup(sop1); group.AddPart(sop2); group.AddPart(sop3); byte[] serBytes = null; Assert.DoesNotThrow(() => { serBytes = serEngine.SceneObjectSerializer.SerializeGroupToBytes(group, SerializationFlags.None); }); Assert.NotNull(serBytes); Assert.DoesNotThrow(() => { var deserObj = serEngine.SceneObjectSerializer.DeserializeGroupFromBytes(serBytes); }); }
/// <summary> /// Deserialize a scene object from the original xml format /// </summary> /// <param name="xmlData"></param> /// <returns>The scene object deserialized. Null on failure.</returns> public static SceneObjectGroup FromOriginalXmlFormat(string xmlData) { //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); //int time = System.Environment.TickCount; try { StringReader sr; XmlTextReader reader; XmlNodeList parts; XmlDocument doc; int linkNum; doc = new XmlDocument(); doc.LoadXml(xmlData); parts = doc.GetElementsByTagName("RootPart"); if (parts.Count == 0) throw new Exception("Invalid Xml format - no root part"); sr = new StringReader(parts[0].InnerXml); reader = new XmlTextReader(sr); SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(reader)); reader.Close(); sr.Close(); parts = doc.GetElementsByTagName("Part"); for (int i = 0; i < parts.Count; i++) { sr = new StringReader(parts[i].InnerXml); reader = new XmlTextReader(sr); SceneObjectPart part = SceneObjectPart.FromXml(reader); linkNum = part.LinkNum; sceneObject.AddPart(part); part.LinkNum = linkNum; part.TrimPermissions(); reader.Close(); sr.Close(); } // Script state may, or may not, exist. Not having any, is NOT // ever a problem. sceneObject.LoadScriptState(doc); return sceneObject; } catch (Exception e) { m_log.ErrorFormat( "[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); return null; } }
public void TestRenderMaterialsSerialization() { var sop1 = Util.RandomSOP("Root", 1); var sop2 = Util.RandomSOP("Child1", 2); var sop3 = Util.RandomSOP("Child2", 3); var mat1 = new RenderMaterial(UUID.Random(), UUID.Random()); var mat2 = new RenderMaterial(UUID.Random(), UUID.Random()); sop1.Shape.RenderMaterials.AddMaterial(mat1); sop2.Shape.RenderMaterials.AddMaterial(mat2); SceneObjectGroup group = new SceneObjectGroup(sop1); group.AddPart(sop2); group.AddPart(sop3); byte[] serBytes = null; Assert.DoesNotThrow(() => { serBytes = serEngine.SceneObjectSerializer.SerializeGroupToBytes(group, SerializationFlags.None); }); Assert.NotNull(serBytes); SceneObjectGroup deserObj = null; Assert.DoesNotThrow(() => { deserObj = serEngine.SceneObjectSerializer.DeserializeGroupFromBytes(serBytes); }); var newsop1 = deserObj.GetChildPart(1); var newsop2 = deserObj.GetChildPart(2); var newsop3 = deserObj.GetChildPart(3); Assert.That(sop1.Shape.RenderMaterials, Is.EqualTo(newsop1.Shape.RenderMaterials)); Assert.That(sop2.Shape.RenderMaterials, Is.EqualTo(newsop2.Shape.RenderMaterials)); Assert.That(sop3.Shape.RenderMaterials, Is.EqualTo(newsop3.Shape.RenderMaterials)); }
public void TestDelinkPersistence() { TestHelpers.InMethod(); //log4net.Config.XmlConfigurator.Configure(); TestScene scene = SceneHelpers.SetupScene(); string rootPartName = "rootpart"; UUID rootPartUuid = new UUID("00000000-0000-0000-0000-000000000001"); string linkPartName = "linkpart"; UUID linkPartUuid = new UUID("00000000-0000-0000-0001-000000000000"); SceneObjectPart rootPart = new SceneObjectPart(UUID.Zero, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = rootPartName, UUID = rootPartUuid }; SceneObjectPart linkPart = new SceneObjectPart(UUID.Zero, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) { Name = linkPartName, UUID = linkPartUuid }; SceneObjectGroup sog = new SceneObjectGroup(rootPart); sog.AddPart(linkPart); scene.AddNewSceneObject(sog, true); // In a test, we have to crank the backup handle manually. Normally this would be done by the timer invoked // scene backup thread. scene.Backup(true); // These changes should occur immediately without waiting for a backup pass SceneObjectGroup groupToDelete = sog.DelinkFromGroup(linkPart, false); Assert.That(groupToDelete.HasGroupChangedDueToDelink, Is.True); scene.DeleteSceneObject(groupToDelete, false); Assert.That(groupToDelete.HasGroupChangedDueToDelink, Is.False); List<SceneObjectGroup> storedObjects = scene.SimulationDataService.LoadObjects(scene.RegionInfo.RegionID); Assert.That(storedObjects.Count, Is.EqualTo(1)); Assert.That(storedObjects[0].Parts.Length, Is.EqualTo(1)); Assert.That(storedObjects[0].ContainsPart(rootPartUuid)); }
/// <summary> /// Decode & create a SOG data structure. Due to the fact that PhysActor /// is only created when SOG.AttachToScene() is called, the returned SOG /// here only have non PhysActor properties decoded and values set. The /// PhysActor properties should be set later by the caller. /// </summary> /// <param name="data"></param> /// <param name="sog"></param> /// <param name="syncInfos"></param> /// <returns>True of decoding sucessfully</returns> protected bool DecodeSceneObject(OSDMap data, out SceneObjectGroup sog, out Dictionary<UUID, SyncInfoBase> syncInfos, Scene scene) { sog = new SceneObjectGroup(); syncInfos = new Dictionary<UUID, SyncInfoBase>(); bool ret = true; try{ OSDMap rootPart = (OSDMap)data["RootPart"]; UUID uuid = rootPart["uuid"].AsUUID(); OSDArray properties = (OSDArray)rootPart["properties"]; //m_log.WarnFormat("{0} DecodeSceneObject for RootPart uuid: {1}", LogHeader, uuid); //Decode and copy to the list of PrimSyncInfo SyncInfoPrim sip = new SyncInfoPrim(uuid, properties, scene); SceneObjectPart root = (SceneObjectPart)sip.SceneThing; sog.SetRootPart(root); sip.SetPropertyValues(SyncableProperties.GroupProperties); syncInfos.Add(root.UUID, sip); if (sog.UUID == UUID.Zero) sog.UUID = sog.RootPart.UUID; //Decode the remaining parts and add them to the object group if (data.ContainsKey("OtherParts")) { //int otherPartsCount = data["OtherPartsCount"].AsInteger(); OSDArray otherPartsArray = (OSDArray)data["OtherParts"]; foreach (OSDMap otherPart in otherPartsArray) { uuid = otherPart["uuid"].AsUUID(); properties = (OSDArray)otherPart["properties"]; //m_log.WarnFormat("{0} DecodeSceneObject for OtherParts[{1}] uuid: {2}", LogHeader, i, uuid); sip = new SyncInfoPrim(uuid, properties, scene); SceneObjectPart part = (SceneObjectPart)sip.SceneThing; if (part == null) { m_log.ErrorFormat("{0} DecodeSceneObject could not decode root part.", LogHeader); sog = null; return false; } sog.AddPart(part); // Should only need to set group properties from the root part, not other parts //sip.SetPropertyValues(SyncableProperties.GroupProperties); syncInfos.Add(part.UUID, sip); } } sog.IsAttachment = data["IsAttachment"].AsBoolean(); sog.AttachedAvatar = data["AttachedAvatar"].AsUUID(); uint ap = data["AttachmentPoint"].AsUInteger(); if (sog.RootPart == null) { //m_log.WarnFormat("{0} DecodeSceneObject - ROOT PART IS NULL", LogHeader); } else if (sog.RootPart.Shape == null) { //m_log.WarnFormat("{0} DecodeSceneObject - ROOT PART SHAPE IS NULL", LogHeader); } else { sog.AttachmentPoint = ap; //m_log.WarnFormat("{0}: DecodeSceneObject AttachmentPoint = {1}", LogHeader, sog.AttachmentPoint); } } catch (Exception e) { m_log.WarnFormat("{0} Encountered an exception: {1} {2} {3}", "DecodeSceneObject", e.Message, e.TargetSite, e.ToString()); ret = false; } //else // m_log.WarnFormat("{0}: DecodeSceneObject AttachmentPoint = null", LogHeader); return ret; }