public AssetPrim(PrimObject parent, List<PrimObject> children) { Parent = parent; if (children != null) Children = children; else Children = new List<PrimObject>(0); }
static void SOPToXml(XmlTextWriter writer, PrimObject prim, PrimObject parent) { writer.WriteStartElement("SceneObjectPart"); writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); writer.WriteAttributeString("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); WriteUUID(writer, "CreatorID", prim.CreatorID); WriteUUID(writer, "FolderID", prim.FolderID); writer.WriteElementString("InventorySerial", (prim.Inventory != null) ? prim.Inventory.Serial.ToString() : "0"); // FIXME: Task inventory writer.WriteStartElement("TaskInventory"); if (prim.Inventory != null) { foreach (PrimObject.InventoryBlock.ItemBlock item in prim.Inventory.Items) { writer.WriteStartElement("", "TaskInventoryItem", ""); WriteUUID(writer, "AssetID", item.AssetID); writer.WriteElementString("BasePermissions", item.PermsBase.ToString()); writer.WriteElementString("CreationDate", (item.CreationDate.ToUniversalTime() - Utils.Epoch).TotalSeconds.ToString()); WriteUUID(writer, "CreatorID", item.CreatorID); writer.WriteElementString("Description", item.Description); writer.WriteElementString("EveryonePermissions", item.PermsEveryone.ToString()); writer.WriteElementString("Flags", item.Flags.ToString()); WriteUUID(writer, "GroupID", item.GroupID); writer.WriteElementString("GroupPermissions", item.PermsGroup.ToString()); writer.WriteElementString("InvType", ((int)item.InvType).ToString()); WriteUUID(writer, "ItemID", item.ID); WriteUUID(writer, "OldItemID", UUID.Zero); WriteUUID(writer, "LastOwnerID", item.LastOwnerID); writer.WriteElementString("Name", item.Name); writer.WriteElementString("NextPermissions", item.PermsNextOwner.ToString()); WriteUUID(writer, "OwnerID", item.OwnerID); writer.WriteElementString("CurrentPermissions", item.PermsOwner.ToString()); WriteUUID(writer, "ParentID", prim.ID); WriteUUID(writer, "ParentPartID", prim.ID); WriteUUID(writer, "PermsGranter", item.PermsGranterID); writer.WriteElementString("PermsMask", "0"); writer.WriteElementString("Type", ((int)item.Type).ToString()); writer.WriteElementString("OwnerChanged", "false"); writer.WriteEndElement(); } } writer.WriteEndElement(); PrimFlags flags = PrimFlags.None; if (prim.UsePhysics) flags |= PrimFlags.Physics; if (prim.Phantom) flags |= PrimFlags.Phantom; if (prim.DieAtEdge) flags |= PrimFlags.DieAtEdge; if (prim.ReturnAtEdge) flags |= PrimFlags.ReturnAtEdge; if (prim.Temporary) flags |= PrimFlags.Temporary; if (prim.Sandbox) flags |= PrimFlags.Sandbox; writer.WriteElementString("ObjectFlags", ((int)flags).ToString()); WriteUUID(writer, "UUID", prim.ID); writer.WriteElementString("LocalId", prim.LocalID.ToString()); writer.WriteElementString("Name", prim.Name); writer.WriteElementString("Material", ((int)prim.Material).ToString()); writer.WriteElementString("RegionHandle", prim.RegionHandle.ToString()); writer.WriteElementString("ScriptAccessPin", prim.RemoteScriptAccessPIN.ToString()); Vector3 groupPosition; if (parent == null) groupPosition = prim.Position; else groupPosition = parent.Position; WriteVector(writer, "GroupPosition", groupPosition); if (prim.ParentID == 0) WriteVector(writer, "OffsetPosition", Vector3.Zero); else WriteVector(writer, "OffsetPosition", prim.Position); WriteQuaternion(writer, "RotationOffset", prim.Rotation); WriteVector(writer, "Velocity", prim.Velocity); WriteVector(writer, "RotationalVelocity", Vector3.Zero); WriteVector(writer, "AngularVelocity", prim.AngularVelocity); WriteVector(writer, "Acceleration", prim.Acceleration); writer.WriteElementString("Description", prim.Description); writer.WriteStartElement("Color"); writer.WriteElementString("R", prim.TextColor.R.ToString(Utils.EnUsCulture)); writer.WriteElementString("G", prim.TextColor.G.ToString(Utils.EnUsCulture)); writer.WriteElementString("B", prim.TextColor.B.ToString(Utils.EnUsCulture)); writer.WriteElementString("A", prim.TextColor.G.ToString(Utils.EnUsCulture)); writer.WriteEndElement(); writer.WriteElementString("Text", prim.Text); writer.WriteElementString("SitName", prim.SitName); writer.WriteElementString("TouchName", prim.TouchName); writer.WriteElementString("LinkNum", prim.LinkNumber.ToString()); writer.WriteElementString("ClickAction", prim.ClickAction.ToString()); writer.WriteStartElement("Shape"); writer.WriteElementString("PathBegin", Primitive.PackBeginCut(prim.Shape.PathBegin).ToString()); writer.WriteElementString("PathCurve", prim.Shape.PathCurve.ToString()); writer.WriteElementString("PathEnd", Primitive.PackEndCut(prim.Shape.PathEnd).ToString()); writer.WriteElementString("PathRadiusOffset", Primitive.PackPathTwist(prim.Shape.PathRadiusOffset).ToString()); writer.WriteElementString("PathRevolutions", Primitive.PackPathRevolutions(prim.Shape.PathRevolutions).ToString()); writer.WriteElementString("PathScaleX", Primitive.PackPathScale(prim.Shape.PathScaleX).ToString()); writer.WriteElementString("PathScaleY", Primitive.PackPathScale(prim.Shape.PathScaleY).ToString()); writer.WriteElementString("PathShearX", ((byte)Primitive.PackPathShear(prim.Shape.PathShearX)).ToString()); writer.WriteElementString("PathShearY", ((byte)Primitive.PackPathShear(prim.Shape.PathShearY)).ToString()); writer.WriteElementString("PathSkew", Primitive.PackPathTwist(prim.Shape.PathSkew).ToString()); writer.WriteElementString("PathTaperX", Primitive.PackPathTaper(prim.Shape.PathTaperX).ToString()); writer.WriteElementString("PathTaperY", Primitive.PackPathTaper(prim.Shape.PathTaperY).ToString()); writer.WriteElementString("PathTwist", Primitive.PackPathTwist(prim.Shape.PathTwist).ToString()); writer.WriteElementString("PathTwistBegin", Primitive.PackPathTwist(prim.Shape.PathTwistBegin).ToString()); writer.WriteElementString("PCode", prim.PCode.ToString()); writer.WriteElementString("ProfileBegin", Primitive.PackBeginCut(prim.Shape.ProfileBegin).ToString()); writer.WriteElementString("ProfileEnd", Primitive.PackEndCut(prim.Shape.ProfileEnd).ToString()); writer.WriteElementString("ProfileHollow", Primitive.PackProfileHollow(prim.Shape.ProfileHollow).ToString()); WriteVector(writer, "Scale", prim.Scale); writer.WriteElementString("State", prim.State.ToString()); AssetPrim.ProfileShape shape = (AssetPrim.ProfileShape)(prim.Shape.ProfileCurve & 0x0F); HoleType hole = (HoleType)(prim.Shape.ProfileCurve & 0xF0); writer.WriteElementString("ProfileShape", shape.ToString()); writer.WriteElementString("HollowShape", hole.ToString()); writer.WriteElementString("ProfileCurve", prim.Shape.ProfileCurve.ToString()); writer.WriteStartElement("TextureEntry"); byte[] te; if (prim.Textures != null) te = prim.Textures.GetBytes(); else te = Utils.EmptyBytes; writer.WriteBase64(te, 0, te.Length); writer.WriteEndElement(); // FIXME: ExtraParams writer.WriteStartElement("ExtraParams"); writer.WriteEndElement(); writer.WriteEndElement(); WriteVector(writer, "Scale", prim.Scale); writer.WriteElementString("UpdateFlag", "0"); WriteVector(writer, "SitTargetOrientation", Vector3.UnitZ); // TODO: Is this really a vector and not a quaternion? WriteVector(writer, "SitTargetPosition", prim.SitOffset); WriteVector(writer, "SitTargetPositionLL", prim.SitOffset); WriteQuaternion(writer, "SitTargetOrientationLL", prim.SitRotation); writer.WriteElementString("ParentID", prim.ParentID.ToString()); writer.WriteElementString("CreationDate", ((int)Utils.DateTimeToUnixTime(prim.CreationDate)).ToString()); writer.WriteElementString("Category", "0"); writer.WriteElementString("SalePrice", prim.SalePrice.ToString()); writer.WriteElementString("ObjectSaleType", ((int)prim.SaleType).ToString()); writer.WriteElementString("OwnershipCost", "0"); WriteUUID(writer, "GroupID", prim.GroupID); WriteUUID(writer, "OwnerID", prim.OwnerID); WriteUUID(writer, "LastOwnerID", prim.LastOwnerID); writer.WriteElementString("BaseMask", ((uint)PermissionMask.All).ToString()); writer.WriteElementString("OwnerMask", ((uint)PermissionMask.All).ToString()); writer.WriteElementString("GroupMask", ((uint)PermissionMask.All).ToString()); writer.WriteElementString("EveryoneMask", ((uint)PermissionMask.All).ToString()); writer.WriteElementString("NextOwnerMask", ((uint)PermissionMask.All).ToString()); writer.WriteElementString("Flags", "None"); WriteUUID(writer, "SitTargetAvatar", UUID.Zero); writer.WriteEndElement(); }
static void CollectTextures(PrimObject prim, Dictionary<UUID, UUID> textureList) { if (prim.Textures != null) { // Add all of the textures on this prim to the save list if (prim.Textures.DefaultTexture != null) textureList[prim.Textures.DefaultTexture.TextureID] = prim.Textures.DefaultTexture.TextureID; if (prim.Textures.FaceTextures != null) { for (int i = 0; i < prim.Textures.FaceTextures.Length; i++) { Primitive.TextureEntryFace face = prim.Textures.FaceTextures[i]; if (face != null) textureList[face.TextureID] = face.TextureID; } } if(prim.Sculpt != null && prim.Sculpt.Texture != UUID.Zero) textureList[prim.Sculpt.Texture] = prim.Sculpt.Texture; } }
public static PrimObject FromPrimitive(Primitive obj) { PrimObject prim = new PrimObject(); prim.Acceleration = obj.Acceleration; prim.AllowedDrop = (obj.Flags & PrimFlags.AllowInventoryDrop) == PrimFlags.AllowInventoryDrop; prim.AngularVelocity = obj.AngularVelocity; //prim.AttachmentPosition //prim.AttachmentRotation //prim.BeforeAttachmentRotation //prim.CameraAtOffset //prim.CameraEyeOffset prim.ClickAction = (int)obj.ClickAction; //prim.CollisionSound //prim.CollisionSoundVolume; prim.CreationDate = obj.Properties.CreationDate; prim.CreatorID = obj.Properties.CreatorID; prim.Description = obj.Properties.Description; prim.DieAtEdge = (obj.Flags & PrimFlags.DieAtEdge) == PrimFlags.AllowInventoryDrop; if (obj.Flexible != null) { prim.Flexible = new FlexibleBlock(); prim.Flexible.Drag = obj.Flexible.Drag; prim.Flexible.Force = obj.Flexible.Force; prim.Flexible.Gravity = obj.Flexible.Gravity; prim.Flexible.Softness = obj.Flexible.Softness; prim.Flexible.Tension = obj.Flexible.Tension; prim.Flexible.Wind = obj.Flexible.Wind; } prim.FolderID = obj.Properties.FolderID; prim.GroupID = obj.Properties.GroupID; prim.ID = obj.Properties.ObjectID; //prim.Inventory; //prim.LastAttachmentPoint; prim.LastOwnerID = obj.Properties.LastOwnerID; if (obj.Light != null) { prim.Light = new LightBlock(); prim.Light.Color = obj.Light.Color; prim.Light.Cutoff = obj.Light.Cutoff; prim.Light.Falloff = obj.Light.Falloff; prim.Light.Intensity = obj.Light.Intensity; prim.Light.Radius = obj.Light.Radius; } //prim.LinkNumber; prim.LocalID = obj.LocalID; prim.Material = (int)obj.PrimData.Material; prim.Name = obj.Properties.Name; prim.OwnerID = obj.Properties.OwnerID; prim.ParentID = obj.ParentID; prim.Particles = new ParticlesBlock(); prim.Particles.AngularVelocity = obj.ParticleSys.AngularVelocity; prim.Particles.Acceleration = obj.ParticleSys.PartAcceleration; prim.Particles.BurstParticleCount = obj.ParticleSys.BurstPartCount; prim.Particles.BurstRate = obj.ParticleSys.BurstRadius; prim.Particles.BurstRate = obj.ParticleSys.BurstRate; prim.Particles.BurstSpeedMax = obj.ParticleSys.BurstSpeedMax; prim.Particles.BurstSpeedMin = obj.ParticleSys.BurstSpeedMin; prim.Particles.DataFlags = (int)obj.ParticleSys.PartDataFlags; prim.Particles.Flags = (int)obj.ParticleSys.PartFlags; prim.Particles.InnerAngle = obj.ParticleSys.InnerAngle; prim.Particles.MaxAge = obj.ParticleSys.MaxAge; prim.Particles.OuterAngle = obj.ParticleSys.OuterAngle; prim.Particles.ParticleEndColor = obj.ParticleSys.PartEndColor; prim.Particles.ParticleEndScale = new Vector2(obj.ParticleSys.PartEndScaleX, obj.ParticleSys.PartEndScaleY); prim.Particles.ParticleMaxAge = obj.ParticleSys.MaxAge; prim.Particles.ParticleStartColor = obj.ParticleSys.PartStartColor; prim.Particles.ParticleStartScale = new Vector2(obj.ParticleSys.PartStartScaleX, obj.ParticleSys.PartStartScaleY); prim.Particles.Pattern = (int)obj.ParticleSys.Pattern; prim.Particles.StartAge = obj.ParticleSys.StartAge; prim.Particles.TargetID = obj.ParticleSys.Target; prim.Particles.TextureID = obj.ParticleSys.Texture; //prim.PassTouches; prim.PCode = (int)obj.PrimData.PCode; prim.PermsBase = (uint)obj.Properties.Permissions.BaseMask; prim.PermsEveryone = (uint)obj.Properties.Permissions.EveryoneMask; prim.PermsGroup = (uint)obj.Properties.Permissions.GroupMask; prim.PermsNextOwner = (uint)obj.Properties.Permissions.NextOwnerMask; prim.PermsOwner = (uint)obj.Properties.Permissions.OwnerMask; prim.Phantom = (obj.Flags & PrimFlags.Phantom) == PrimFlags.Phantom; prim.Position = obj.Position; prim.RegionHandle = obj.RegionHandle; //prim.RemoteScriptAccessPIN; prim.ReturnAtEdge = (obj.Flags & PrimFlags.ReturnAtEdge) == PrimFlags.ReturnAtEdge; //prim.RezDate; prim.Rotation = obj.Rotation; prim.SalePrice = obj.Properties.SalePrice; prim.SaleType = (int)obj.Properties.SaleType; prim.Sandbox = (obj.Flags & PrimFlags.Sandbox) == PrimFlags.Sandbox; prim.Scale = obj.Scale; //prim.ScriptState; if (obj.Sculpt != null) { prim.Sculpt = new SculptBlock(); prim.Sculpt.Texture = obj.Sculpt.SculptTexture; prim.Sculpt.Type = (int)obj.Sculpt.Type; } prim.Shape = new ShapeBlock(); prim.Shape.PathBegin = obj.PrimData.PathBegin; prim.Shape.PathCurve = (int)obj.PrimData.PathCurve; prim.Shape.PathEnd = obj.PrimData.PathEnd; prim.Shape.PathRadiusOffset = obj.PrimData.PathRadiusOffset; prim.Shape.PathRevolutions = obj.PrimData.PathRevolutions; prim.Shape.PathScaleX = obj.PrimData.PathScaleX; prim.Shape.PathScaleY = obj.PrimData.PathScaleY; prim.Shape.PathShearX = obj.PrimData.PathShearX; prim.Shape.PathShearY = obj.PrimData.PathShearY; prim.Shape.PathSkew = obj.PrimData.PathSkew; prim.Shape.PathTaperX = obj.PrimData.PathTaperX; prim.Shape.PathTaperY = obj.PrimData.PathTaperY; prim.Shape.PathTwist = obj.PrimData.PathTwist; prim.Shape.PathTwistBegin = obj.PrimData.PathTwistBegin; prim.Shape.ProfileBegin = obj.PrimData.ProfileBegin; prim.Shape.ProfileCurve = obj.PrimData.profileCurve; prim.Shape.ProfileEnd = obj.PrimData.ProfileEnd; prim.Shape.ProfileHollow = obj.PrimData.ProfileHollow; prim.SitName = obj.Properties.SitName; //prim.SitOffset; //prim.SitRotation; prim.SoundFlags = (int)obj.SoundFlags; prim.SoundGain = obj.SoundGain; prim.SoundID = obj.Sound; prim.SoundRadius = obj.SoundRadius; prim.State = obj.PrimData.State; prim.Temporary = (obj.Flags & PrimFlags.Temporary) == PrimFlags.Temporary; prim.Text = obj.Text; prim.TextColor = obj.TextColor; prim.Textures = obj.Textures; //prim.TouchName; prim.UsePhysics = (obj.Flags & PrimFlags.Physics) == PrimFlags.Physics; prim.Velocity = obj.Velocity; return prim; }
public bool DecodeXml(string xmlData) { using (XmlTextReader reader = new XmlTextReader(new StringReader(xmlData))) { reader.Read(); reader.ReadStartElement("SceneObjectGroup"); Parent = LoadPrim(reader); if (Parent != null) { if (this.AssetID == UUID.Zero) this.AssetID = Parent.ID; List<PrimObject> children = new List<PrimObject>(); reader.Read(); while (!reader.EOF) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name == "SceneObjectPart") { PrimObject child = LoadPrim(reader); if (child != null) children.Add(child); } else { //Logger.Log("Found unexpected prim XML element " + reader.Name, Helpers.LogLevel.Debug); reader.Read(); } break; case XmlNodeType.EndElement: default: reader.Read(); break; } } Children = children; return true; } else { Logger.Log("Failed to load root linkset prim", Helpers.LogLevel.Error); return false; } } }
public static PrimObject LoadPrim(XmlTextReader reader) { PrimObject obj = new PrimObject(); obj.Shape = new PrimObject.ShapeBlock(); obj.Inventory = new PrimObject.InventoryBlock(); reader.ReadStartElement("SceneObjectPart"); if (reader.Name == "AllowedDrop") obj.AllowedDrop = reader.ReadElementContentAsBoolean("AllowedDrop", String.Empty); else obj.AllowedDrop = true; obj.CreatorID = ReadUUID(reader, "CreatorID"); obj.FolderID = ReadUUID(reader, "FolderID"); obj.Inventory.Serial = reader.ReadElementContentAsInt("InventorySerial", String.Empty); #region Task Inventory List<PrimObject.InventoryBlock.ItemBlock> invItems = new List<PrimObject.InventoryBlock.ItemBlock>(); reader.ReadStartElement("TaskInventory", String.Empty); while (reader.Name == "TaskInventoryItem") { PrimObject.InventoryBlock.ItemBlock item = new PrimObject.InventoryBlock.ItemBlock(); reader.ReadStartElement("TaskInventoryItem", String.Empty); item.AssetID = ReadUUID(reader, "AssetID"); item.PermsBase = (uint)reader.ReadElementContentAsInt("BasePermissions", String.Empty); item.CreationDate = Utils.UnixTimeToDateTime((uint)reader.ReadElementContentAsInt("CreationDate", String.Empty)); item.CreatorID = ReadUUID(reader, "CreatorID"); item.Description = reader.ReadElementContentAsString("Description", String.Empty); item.PermsEveryone = (uint)reader.ReadElementContentAsInt("EveryonePermissions", String.Empty); item.Flags = reader.ReadElementContentAsInt("Flags", String.Empty); item.GroupID = ReadUUID(reader, "GroupID"); item.PermsGroup = (uint)reader.ReadElementContentAsInt("GroupPermissions", String.Empty); item.InvType = (InventoryType)reader.ReadElementContentAsInt("InvType", String.Empty); item.ID = ReadUUID(reader, "ItemID"); UUID oldItemID = ReadUUID(reader, "OldItemID"); // TODO: Is this useful? item.LastOwnerID = ReadUUID(reader, "LastOwnerID"); item.Name = reader.ReadElementContentAsString("Name", String.Empty); item.PermsNextOwner = (uint)reader.ReadElementContentAsInt("NextPermissions", String.Empty); item.OwnerID = ReadUUID(reader, "OwnerID"); item.PermsOwner = (uint)reader.ReadElementContentAsInt("CurrentPermissions", String.Empty); UUID parentID = ReadUUID(reader, "ParentID"); UUID parentPartID = ReadUUID(reader, "ParentPartID"); item.PermsGranterID = ReadUUID(reader, "PermsGranter"); item.PermsBase = (uint)reader.ReadElementContentAsInt("PermsMask", String.Empty); item.Type = (AssetType)reader.ReadElementContentAsInt("Type", String.Empty); reader.ReadEndElement(); invItems.Add(item); } if (reader.NodeType == XmlNodeType.EndElement) reader.ReadEndElement(); obj.Inventory.Items = invItems.ToArray(); #endregion Task Inventory PrimFlags flags = (PrimFlags)reader.ReadElementContentAsInt("ObjectFlags", String.Empty); obj.UsePhysics = (flags & PrimFlags.Physics) != 0; obj.Phantom = (flags & PrimFlags.Phantom) != 0; obj.DieAtEdge = (flags & PrimFlags.DieAtEdge) != 0; obj.ReturnAtEdge = (flags & PrimFlags.ReturnAtEdge) != 0; obj.Temporary = (flags & PrimFlags.Temporary) != 0; obj.Sandbox = (flags & PrimFlags.Sandbox) != 0; obj.ID = ReadUUID(reader, "UUID"); obj.LocalID = (uint)reader.ReadElementContentAsLong("LocalId", String.Empty); obj.Name = reader.ReadElementString("Name"); obj.Material = reader.ReadElementContentAsInt("Material", String.Empty); if (reader.Name == "PassTouches") obj.PassTouches = reader.ReadElementContentAsBoolean("PassTouches", String.Empty); else obj.PassTouches = false; obj.RegionHandle = (ulong)reader.ReadElementContentAsLong("RegionHandle", String.Empty); obj.RemoteScriptAccessPIN = reader.ReadElementContentAsInt("ScriptAccessPin", String.Empty); if (reader.Name == "PlaySoundSlavePrims") reader.ReadInnerXml(); if (reader.Name == "LoopSoundSlavePrims") reader.ReadInnerXml(); Vector3 groupPosition = ReadVector(reader, "GroupPosition"); Vector3 offsetPosition = ReadVector(reader, "OffsetPosition"); obj.Rotation = ReadQuaternion(reader, "RotationOffset"); obj.Velocity = ReadVector(reader, "Velocity"); if (reader.Name == "RotationalVelocity") ReadVector(reader, "RotationalVelocity"); obj.AngularVelocity = ReadVector(reader, "AngularVelocity"); obj.Acceleration = ReadVector(reader, "Acceleration"); obj.Description = reader.ReadElementString("Description"); reader.ReadStartElement("Color"); if (reader.Name == "R") { obj.TextColor.R = reader.ReadElementContentAsFloat("R", String.Empty); obj.TextColor.G = reader.ReadElementContentAsFloat("G", String.Empty); obj.TextColor.B = reader.ReadElementContentAsFloat("B", String.Empty); obj.TextColor.A = reader.ReadElementContentAsFloat("A", String.Empty); reader.ReadEndElement(); } obj.Text = reader.ReadElementString("Text", String.Empty); obj.SitName = reader.ReadElementString("SitName", String.Empty); obj.TouchName = reader.ReadElementString("TouchName", String.Empty); obj.LinkNumber = reader.ReadElementContentAsInt("LinkNum", String.Empty); obj.ClickAction = reader.ReadElementContentAsInt("ClickAction", String.Empty); reader.ReadStartElement("Shape"); obj.Shape.ProfileCurve = reader.ReadElementContentAsInt("ProfileCurve", String.Empty); byte[] teData = Convert.FromBase64String(reader.ReadElementString("TextureEntry")); obj.Textures = new Primitive.TextureEntry(teData, 0, teData.Length); reader.ReadInnerXml(); // ExtraParams obj.Shape.PathBegin = Primitive.UnpackBeginCut((ushort)reader.ReadElementContentAsInt("PathBegin", String.Empty)); obj.Shape.PathCurve = reader.ReadElementContentAsInt("PathCurve", String.Empty); obj.Shape.PathEnd = Primitive.UnpackEndCut((ushort)reader.ReadElementContentAsInt("PathEnd", String.Empty)); obj.Shape.PathRadiusOffset = Primitive.UnpackPathTwist((sbyte)reader.ReadElementContentAsInt("PathRadiusOffset", String.Empty)); obj.Shape.PathRevolutions = Primitive.UnpackPathRevolutions((byte)reader.ReadElementContentAsInt("PathRevolutions", String.Empty)); obj.Shape.PathScaleX = Primitive.UnpackPathScale((byte)reader.ReadElementContentAsInt("PathScaleX", String.Empty)); obj.Shape.PathScaleY = Primitive.UnpackPathScale((byte)reader.ReadElementContentAsInt("PathScaleY", String.Empty)); obj.Shape.PathShearX = Primitive.UnpackPathShear((sbyte)reader.ReadElementContentAsInt("PathShearX", String.Empty)); obj.Shape.PathShearY = Primitive.UnpackPathShear((sbyte)reader.ReadElementContentAsInt("PathShearY", String.Empty)); obj.Shape.PathSkew = Primitive.UnpackPathTwist((sbyte)reader.ReadElementContentAsInt("PathSkew", String.Empty)); obj.Shape.PathTaperX = Primitive.UnpackPathTaper((sbyte)reader.ReadElementContentAsInt("PathTaperX", String.Empty)); obj.Shape.PathTaperY = Primitive.UnpackPathShear((sbyte)reader.ReadElementContentAsInt("PathTaperY", String.Empty)); obj.Shape.PathTwist = Primitive.UnpackPathTwist((sbyte)reader.ReadElementContentAsInt("PathTwist", String.Empty)); obj.Shape.PathTwistBegin = Primitive.UnpackPathTwist((sbyte)reader.ReadElementContentAsInt("PathTwistBegin", String.Empty)); obj.PCode = reader.ReadElementContentAsInt("PCode", String.Empty); obj.Shape.ProfileBegin = Primitive.UnpackBeginCut((ushort)reader.ReadElementContentAsInt("ProfileBegin", String.Empty)); obj.Shape.ProfileEnd = Primitive.UnpackEndCut((ushort)reader.ReadElementContentAsInt("ProfileEnd", String.Empty)); obj.Shape.ProfileHollow = Primitive.UnpackProfileHollow((ushort)reader.ReadElementContentAsInt("ProfileHollow", String.Empty)); obj.Scale = ReadVector(reader, "Scale"); obj.State = (byte)reader.ReadElementContentAsInt("State", String.Empty); ProfileShape profileShape = (ProfileShape)Enum.Parse(typeof(ProfileShape), reader.ReadElementString("ProfileShape")); HoleType holeType = (HoleType)Enum.Parse(typeof(HoleType), reader.ReadElementString("HollowShape")); obj.Shape.ProfileCurve = (int)profileShape | (int)holeType; UUID sculptTexture = ReadUUID(reader, "SculptTexture"); SculptType sculptType = (SculptType)reader.ReadElementContentAsInt("SculptType", String.Empty); if (sculptTexture != UUID.Zero) { obj.Sculpt = new PrimObject.SculptBlock(); obj.Sculpt.Texture = sculptTexture; obj.Sculpt.Type = (int)sculptType; } PrimObject.FlexibleBlock flexible = new PrimObject.FlexibleBlock(); PrimObject.LightBlock light = new PrimObject.LightBlock(); reader.ReadInnerXml(); // SculptData flexible.Softness = reader.ReadElementContentAsInt("FlexiSoftness", String.Empty); flexible.Tension = reader.ReadElementContentAsFloat("FlexiTension", String.Empty); flexible.Drag = reader.ReadElementContentAsFloat("FlexiDrag", String.Empty); flexible.Gravity = reader.ReadElementContentAsFloat("FlexiGravity", String.Empty); flexible.Wind = reader.ReadElementContentAsFloat("FlexiWind", String.Empty); flexible.Force.X = reader.ReadElementContentAsFloat("FlexiForceX", String.Empty); flexible.Force.Y = reader.ReadElementContentAsFloat("FlexiForceY", String.Empty); flexible.Force.Z = reader.ReadElementContentAsFloat("FlexiForceZ", String.Empty); light.Color.R = reader.ReadElementContentAsFloat("LightColorR", String.Empty); light.Color.G = reader.ReadElementContentAsFloat("LightColorG", String.Empty); light.Color.B = reader.ReadElementContentAsFloat("LightColorB", String.Empty); light.Color.A = reader.ReadElementContentAsFloat("LightColorA", String.Empty); light.Radius = reader.ReadElementContentAsFloat("LightRadius", String.Empty); light.Cutoff = reader.ReadElementContentAsFloat("LightCutoff", String.Empty); light.Falloff = reader.ReadElementContentAsFloat("LightFalloff", String.Empty); light.Intensity = reader.ReadElementContentAsFloat("LightIntensity", String.Empty); bool hasFlexi = reader.ReadElementContentAsBoolean("FlexiEntry", String.Empty); bool hasLight = reader.ReadElementContentAsBoolean("LightEntry", String.Empty); reader.ReadInnerXml(); // SculptEntry if (hasFlexi) obj.Flexible = flexible; if (hasLight) obj.Light = light; reader.ReadEndElement(); obj.Scale = ReadVector(reader, "Scale"); // Yes, again reader.ReadInnerXml(); // UpdateFlag reader.ReadInnerXml(); // SitTargetOrientation reader.ReadInnerXml(); // SitTargetPosition obj.SitOffset = ReadVector(reader, "SitTargetPositionLL"); obj.SitRotation = ReadQuaternion(reader, "SitTargetOrientationLL"); obj.ParentID = (uint)reader.ReadElementContentAsLong("ParentID", String.Empty); obj.CreationDate = Utils.UnixTimeToDateTime(reader.ReadElementContentAsInt("CreationDate", String.Empty)); int category = reader.ReadElementContentAsInt("Category", String.Empty); obj.SalePrice = reader.ReadElementContentAsInt("SalePrice", String.Empty); obj.SaleType = reader.ReadElementContentAsInt("ObjectSaleType", String.Empty); int ownershipCost = reader.ReadElementContentAsInt("OwnershipCost", String.Empty); obj.GroupID = ReadUUID(reader, "GroupID"); obj.OwnerID = ReadUUID(reader, "OwnerID"); obj.LastOwnerID = ReadUUID(reader, "LastOwnerID"); obj.PermsBase = (uint)reader.ReadElementContentAsInt("BaseMask", String.Empty); obj.PermsOwner = (uint)reader.ReadElementContentAsInt("OwnerMask", String.Empty); obj.PermsGroup = (uint)reader.ReadElementContentAsInt("GroupMask", String.Empty); obj.PermsEveryone = (uint)reader.ReadElementContentAsInt("EveryoneMask", String.Empty); obj.PermsNextOwner = (uint)reader.ReadElementContentAsInt("NextOwnerMask", String.Empty); reader.ReadInnerXml(); // Flags obj.CollisionSound = ReadUUID(reader, "CollisionSound"); obj.CollisionSoundVolume = reader.ReadElementContentAsFloat("CollisionSoundVolume", String.Empty); reader.ReadEndElement(); if (obj.ParentID == 0) obj.Position = groupPosition; else obj.Position = offsetPosition; return obj; }
static void CollectTextures(PrimObject prim, Dictionary<UUID, UUID> textureList) { if (prim.Faces != null) { // Add all of the textures on this prim to the save list for (int i = 0; i < prim.Faces.Length; i++) { PrimObject.FaceBlock face = prim.Faces[i]; if (!textureList.ContainsKey(face.ImageID)) textureList.Add(face.ImageID, face.ImageID); } } }
public static Primitive.TextureEntry ToTextureEntry(PrimObject.FaceBlock[] faces) { // FIXME: return new Primitive.TextureEntry(UUID.Zero); }
public static PrimObject LoadPrim(XmlTextReader reader) { PrimObject obj = new PrimObject(); obj.Shape = new PrimObject.ShapeBlock(); obj.Inventory = new PrimObject.InventoryBlock(); reader.ReadStartElement("SceneObjectPart"); obj.CreatorIdentity = ReadUUID(reader, "CreatorID").ToString(); //warning CS0219: The variable `folderID' is assigned but its value is never used //UUID folderID = ReadUUID(reader, "FolderID"); obj.Inventory.Serial = reader.ReadElementContentAsInt("InventorySerial", String.Empty); // FIXME: Parse TaskInventory obj.Inventory.Items = new PrimObject.InventoryBlock.ItemBlock[0]; reader.ReadInnerXml(); PrimFlags flags = (PrimFlags)reader.ReadElementContentAsInt("ObjectFlags", String.Empty); obj.UsePhysics = (flags & PrimFlags.Physics) != 0; obj.Phantom = (flags & PrimFlags.Phantom) != 0; obj.DieAtEdge = (flags & PrimFlags.DieAtEdge) != 0; obj.ReturnAtEdge = (flags & PrimFlags.ReturnAtEdge) != 0; obj.Temporary = (flags & PrimFlags.Temporary) != 0; obj.Sandbox = (flags & PrimFlags.Sandbox) != 0; obj.ID = ReadUUID(reader, "UUID"); obj.LocalID = (uint)reader.ReadElementContentAsLong("LocalId", String.Empty); obj.Name = reader.ReadElementString("Name"); obj.Material = reader.ReadElementContentAsInt("Material", String.Empty); reader.ReadInnerXml(); // RegionHandle obj.RemoteScriptAccessPIN = reader.ReadElementContentAsInt("ScriptAccessPin", String.Empty); Vector3 groupPosition = ReadVector(reader, "GroupPosition"); Vector3 offsetPosition = ReadVector(reader, "OffsetPosition"); obj.Rotation = ReadQuaternion(reader, "RotationOffset"); obj.Velocity = ReadVector(reader, "Velocity"); //warning CS0219: The variable `rotationalVelocity' is assigned but its value is never used //Vector3 rotationalVelocity = ReadVector(reader, "RotationalVelocity"); obj.AngularVelocity = ReadVector(reader, "AngularVelocity"); obj.Acceleration = ReadVector(reader, "Acceleration"); obj.Description = reader.ReadElementString("Description"); reader.ReadStartElement("Color"); if (reader.Name == "R") { obj.TextColor.R = reader.ReadElementContentAsFloat("R", String.Empty); obj.TextColor.G = reader.ReadElementContentAsFloat("G", String.Empty); obj.TextColor.B = reader.ReadElementContentAsFloat("B", String.Empty); obj.TextColor.A = reader.ReadElementContentAsFloat("A", String.Empty); reader.ReadEndElement(); } obj.Text = reader.ReadElementString("Text", String.Empty); obj.SitName = reader.ReadElementString("SitName", String.Empty); obj.TouchName = reader.ReadElementString("TouchName", String.Empty); obj.LinkNumber = reader.ReadElementContentAsInt("LinkNum", String.Empty); obj.ClickAction = reader.ReadElementContentAsInt("ClickAction", String.Empty); reader.ReadStartElement("Shape"); obj.Shape.ProfileCurve = reader.ReadElementContentAsInt("ProfileCurve", String.Empty); byte[] teData = Convert.FromBase64String(reader.ReadElementString("TextureEntry")); Primitive.TextureEntry te = new Primitive.TextureEntry(teData, 0, teData.Length); obj.Faces = FromTextureEntry(te); reader.ReadInnerXml(); // ExtraParams obj.Shape.PathBegin = Primitive.UnpackBeginCut((ushort)reader.ReadElementContentAsInt("PathBegin", String.Empty)); obj.Shape.PathCurve = reader.ReadElementContentAsInt("PathCurve", String.Empty); obj.Shape.PathEnd = Primitive.UnpackEndCut((ushort)reader.ReadElementContentAsInt("PathEnd", String.Empty)); obj.Shape.PathRadiusOffset = Primitive.UnpackPathTwist((sbyte)reader.ReadElementContentAsInt("PathRadiusOffset", String.Empty)); obj.Shape.PathRevolutions = Primitive.UnpackPathRevolutions((byte)reader.ReadElementContentAsInt("PathRevolutions", String.Empty)); obj.Shape.PathScaleX = Primitive.UnpackPathScale((byte)reader.ReadElementContentAsInt("PathScaleX", String.Empty)); obj.Shape.PathScaleY = Primitive.UnpackPathScale((byte)reader.ReadElementContentAsInt("PathScaleY", String.Empty)); obj.Shape.PathShearX = Primitive.UnpackPathShear((sbyte)reader.ReadElementContentAsInt("PathShearX", String.Empty)); obj.Shape.PathShearY = Primitive.UnpackPathShear((sbyte)reader.ReadElementContentAsInt("PathShearY", String.Empty)); obj.Shape.PathSkew = Primitive.UnpackPathTwist((sbyte)reader.ReadElementContentAsInt("PathSkew", String.Empty)); obj.Shape.PathTaperX = Primitive.UnpackPathTaper((sbyte)reader.ReadElementContentAsInt("PathTaperX", String.Empty)); obj.Shape.PathTaperY = Primitive.UnpackPathShear((sbyte)reader.ReadElementContentAsInt("PathTaperY", String.Empty)); obj.Shape.PathTwist = Primitive.UnpackPathTwist((sbyte)reader.ReadElementContentAsInt("PathTwist", String.Empty)); obj.Shape.PathTwistBegin = Primitive.UnpackPathTwist((sbyte)reader.ReadElementContentAsInt("PathTwistBegin", String.Empty)); obj.PCode = reader.ReadElementContentAsInt("PCode", String.Empty); obj.Shape.ProfileBegin = Primitive.UnpackBeginCut((ushort)reader.ReadElementContentAsInt("ProfileBegin", String.Empty)); obj.Shape.ProfileEnd = Primitive.UnpackEndCut((ushort)reader.ReadElementContentAsInt("ProfileEnd", String.Empty)); obj.Shape.ProfileHollow = Primitive.UnpackProfileHollow((ushort)reader.ReadElementContentAsInt("ProfileHollow", String.Empty)); obj.Scale = ReadVector(reader, "Scale"); obj.State = (byte)reader.ReadElementContentAsInt("State", String.Empty); ProfileShape profileShape = (ProfileShape)Enum.Parse(typeof(ProfileShape), reader.ReadElementString("ProfileShape")); HoleType holeType = (HoleType)Enum.Parse(typeof(HoleType), reader.ReadElementString("HollowShape")); obj.Shape.ProfileCurve = (int)profileShape | (int)holeType; UUID sculptTexture = ReadUUID(reader, "SculptTexture"); SculptType sculptType = (SculptType)reader.ReadElementContentAsInt("SculptType", String.Empty); if (sculptTexture != UUID.Zero) { obj.Sculpt = new PrimObject.SculptBlock(); obj.Sculpt.Texture = sculptTexture; obj.Sculpt.Type = (int)sculptType; } PrimObject.FlexibleBlock flexible = new PrimObject.FlexibleBlock(); PrimObject.LightBlock light = new PrimObject.LightBlock(); reader.ReadInnerXml(); // SculptData flexible.Softness = reader.ReadElementContentAsInt("FlexiSoftness", String.Empty); flexible.Tension = reader.ReadElementContentAsFloat("FlexiTension", String.Empty); flexible.Drag = reader.ReadElementContentAsFloat("FlexiDrag", String.Empty); flexible.Gravity = reader.ReadElementContentAsFloat("FlexiGravity", String.Empty); flexible.Wind = reader.ReadElementContentAsFloat("FlexiWind", String.Empty); flexible.Force.X = reader.ReadElementContentAsFloat("FlexiForceX", String.Empty); flexible.Force.Y = reader.ReadElementContentAsFloat("FlexiForceY", String.Empty); flexible.Force.Z = reader.ReadElementContentAsFloat("FlexiForceZ", String.Empty); light.Color.R = reader.ReadElementContentAsFloat("LightColorR", String.Empty); light.Color.G = reader.ReadElementContentAsFloat("LightColorG", String.Empty); light.Color.B = reader.ReadElementContentAsFloat("LightColorB", String.Empty); light.Color.A = reader.ReadElementContentAsFloat("LightColorA", String.Empty); light.Radius = reader.ReadElementContentAsFloat("LightRadius", String.Empty); light.Cutoff = reader.ReadElementContentAsFloat("LightCutoff", String.Empty); light.Falloff = reader.ReadElementContentAsFloat("LightFalloff", String.Empty); light.Intensity = reader.ReadElementContentAsFloat("LightIntensity", String.Empty); reader.ReadInnerXml(); // FlexiTension reader.ReadInnerXml(); // FlexiDrag reader.ReadInnerXml(); // FlexiGravity reader.ReadInnerXml(); // FlexiWind reader.ReadInnerXml(); // FlexiForceX reader.ReadInnerXml(); // FlexiForceY reader.ReadInnerXml(); // FlexiForceZ reader.ReadInnerXml(); // LightColorR reader.ReadInnerXml(); // LightColorG reader.ReadInnerXml(); // LightColorB reader.ReadInnerXml(); // LightColorA reader.ReadInnerXml(); // LightRadius reader.ReadInnerXml(); // LightCutoff reader.ReadInnerXml(); // LightFalloff reader.ReadInnerXml(); // LightIntensity bool hasFlexi = reader.ReadElementContentAsBoolean("FlexiEntry", String.Empty); bool hasLight = reader.ReadElementContentAsBoolean("LightEntry", String.Empty); reader.ReadInnerXml(); // SculptEntry if (hasFlexi) obj.Flexible = flexible; if (hasLight) obj.Light = light; reader.ReadEndElement(); obj.Scale = ReadVector(reader, "Scale"); // Yes, again reader.ReadInnerXml(); // UpdateFlag reader.ReadInnerXml(); // SitTargetOrientation reader.ReadInnerXml(); // SitTargetPosition obj.SitOffset = ReadVector(reader, "SitTargetPositionLL"); obj.SitRotation = ReadQuaternion(reader, "SitTargetOrientationLL"); obj.ParentID = (uint)reader.ReadElementContentAsLong("ParentID", String.Empty); obj.CreationDate = Utils.UnixTimeToDateTime(reader.ReadElementContentAsInt("CreationDate", String.Empty)); //obj.Category = reader.ReadElementContentAsInt("Category", String.Empty); //warning CS0219: The variable `category' is assigned but its value is never used //int category = reader.ReadElementContentAsInt("Category", String.Empty); obj.SalePrice = reader.ReadElementContentAsInt("SalePrice", String.Empty); obj.SaleType = reader.ReadElementContentAsInt("ObjectSaleType", String.Empty); //warning CS0219: The variable `ownershipCost' is assigned but its value is never used //int ownershipCost = reader.ReadElementContentAsInt("OwnershipCost", String.Empty); obj.GroupIdentity = ReadUUID(reader, "GroupID").ToString(); obj.OwnerIdentity = ReadUUID(reader, "OwnerID").ToString(); obj.LastOwnerIdentity = ReadUUID(reader, "LastOwnerID").ToString(); obj.PermsBase = (uint)reader.ReadElementContentAsInt("BaseMask", String.Empty); obj.PermsOwner = (uint)reader.ReadElementContentAsInt("OwnerMask", String.Empty); obj.PermsGroup = (uint)reader.ReadElementContentAsInt("GroupMask", String.Empty); obj.PermsEveryone = (uint)reader.ReadElementContentAsInt("EveryoneMask", String.Empty); obj.PermsNextOwner = (uint)reader.ReadElementContentAsInt("NextOwnerMask", String.Empty); reader.ReadInnerXml(); // Flags reader.ReadInnerXml(); // CollisionSound reader.ReadInnerXml(); // CollisionSoundVolume reader.ReadEndElement(); if (obj.ParentID == 0) obj.Position = groupPosition; else obj.Position = offsetPosition; return obj; }