From 9c829c0410da89fdbb873f706d7ba63cf26b088f Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 29 Oct 2010 18:58:22 +0100 Subject: Preliminary work on appearance layers. No user functionality yet. --- OpenSim/Framework/AvatarAppearance.cs | 451 +++++++++------------ .../Shared/Api/Implementation/LSL_Api.cs | 11 +- 2 files changed, 201 insertions(+), 261 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 5da8ba1..829ad79 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -32,6 +32,125 @@ using OpenMetaverse; namespace OpenSim.Framework { + // A special dictionary for avatar appearance + public struct LayerItem + { + public UUID ItemID; + public UUID AssetID; + + public LayerItem(UUID itemID, UUID assetID) + { + ItemID = itemID; + AssetID = assetID; + } + } + + public class Layer + { + protected int m_layerType; + protected Dictionary m_items = new Dictionary(); + protected List m_ids = new List(); + + public Layer(int type) + { + m_layerType = type; + } + + public int LayerType + { + get { return m_layerType; } + } + + public int Count + { + get { return m_ids.Count; } + } + + public void Add(UUID itemID, UUID assetID) + { + if (m_items.ContainsKey(itemID)) + return; + if (m_ids.Count >= 5) + return; + + m_ids.Add(itemID); + m_items[itemID] = assetID; + } + + public void Wear(UUID itemID, UUID assetID) + { + Clear(); + Add(itemID, assetID); + } + + public void Clear() + { + m_ids.Clear(); + m_items.Clear(); + } + + public void RemoveItem(UUID itemID) + { + if (m_items.ContainsKey(itemID)) + { + m_ids.Remove(itemID); + m_items.Remove(itemID); + } + } + + public void RemoveAsset(UUID assetID) + { + UUID itemID = UUID.Zero; + + foreach (KeyValuePair kvp in m_items) + { + if (kvp.Value == assetID) + { + itemID = kvp.Key; + break; + } + } + + if (itemID != UUID.Zero) + { + m_ids.Remove(itemID); + m_items.Remove(itemID); + } + } + + public LayerItem this [int idx] + { + get + { + if (idx >= m_ids.Count || idx < 0) + return new LayerItem(UUID.Zero, UUID.Zero); + + return new LayerItem(m_ids[idx], m_items[m_ids[idx]]); + } + } + } + + public enum AppearanceLayer + { + BODY = 0, + SKIN = 1, + HAIR = 2, + EYES = 3, + SHIRT = 4, + PANTS = 5, + SHOES = 6, + SOCKS = 7, + JACKET = 8, + GLOVES = 9, + UNDERSHIRT = 10, + UNDERPANTS = 11, + SKIRT = 12, + ALPHA = 13, + TATTOO = 14, + + MAX_WEARABLES = 15 + } + /// /// Contains the Avatar's Appearance and methods to manipulate the appearance. /// @@ -39,25 +158,6 @@ namespace OpenSim.Framework { //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - // these are guessed at by the list here - - // http://wiki.secondlife.com/wiki/Avatar_Appearance. We'll - // correct them over time for when were are wrong. - public readonly static int BODY = 0; - public readonly static int SKIN = 1; - public readonly static int HAIR = 2; - public readonly static int EYES = 3; - public readonly static int SHIRT = 4; - public readonly static int PANTS = 5; - public readonly static int SHOES = 6; - public readonly static int SOCKS = 7; - public readonly static int JACKET = 8; - public readonly static int GLOVES = 9; - public readonly static int UNDERSHIRT = 10; - public readonly static int UNDERPANTS = 11; - public readonly static int SKIRT = 12; - - private readonly static int MAX_WEARABLES = 13; - private static UUID BODY_ASSET = new UUID("66c41e39-38f9-f75a-024e-585989bfab73"); private static UUID BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); private static UUID SKIN_ASSET = new UUID("77c41e39-38f9-f75a-024e-585989bbabbb"); @@ -68,6 +168,10 @@ namespace OpenSim.Framework private static UUID PANTS_ITEM = new UUID("77c41e39-38f9-f75a-0000-5859892f1111"); private static UUID HAIR_ASSET = new UUID("d342e6c0-b9d2-11dc-95ff-0800200c9a66"); private static UUID HAIR_ITEM = new UUID("d342e6c1-b9d2-11dc-95ff-0800200c9a66"); + private static UUID ALPHA_ASSET = new UUID("1578a2b1-5179-4b53-b618-fe00ca5a5594"); + private static UUID TATTOO_ASSET = new UUID("00000000-0000-2222-3333-100000001007"); + private static UUID ALPHA_ITEM = new UUID("bfb9923c-4838-4d2d-bf07-608c5b1165c8"); + private static UUID TATTOO_ITEM = new UUID("c47e22bd-3021-4ba4-82aa-2b5cb34d35e1"); public readonly static int VISUALPARAM_COUNT = 218; @@ -103,152 +207,156 @@ namespace OpenSim.Framework } public virtual UUID BodyItem { - get { return m_wearables[BODY].ItemID; } - set { m_wearables[BODY].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.BODY].ItemID; } + set { m_wearables[(int)AppearanceLayer.BODY].ItemID = value; } } public virtual UUID BodyAsset { - get { return m_wearables[BODY].AssetID; } - set { m_wearables[BODY].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.BODY].AssetID; } + set { m_wearables[(int)AppearanceLayer.BODY].AssetID = value; } } public virtual UUID SkinItem { - get { return m_wearables[SKIN].ItemID; } - set { m_wearables[SKIN].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.SKIN].ItemID; } + set { m_wearables[(int)AppearanceLayer.SKIN].ItemID = value; } } public virtual UUID SkinAsset { - get { return m_wearables[SKIN].AssetID; } - set { m_wearables[SKIN].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.SKIN].AssetID; } + set { m_wearables[(int)AppearanceLayer.SKIN].AssetID = value; } } public virtual UUID HairItem { - get { return m_wearables[HAIR].ItemID; } - set { m_wearables[HAIR].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.HAIR].ItemID; } + set { m_wearables[(int)AppearanceLayer.HAIR].ItemID = value; } } public virtual UUID HairAsset { - get { return m_wearables[HAIR].AssetID; } - set { m_wearables[HAIR].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.HAIR].AssetID; } + set { m_wearables[(int)AppearanceLayer.HAIR].AssetID = value; } } public virtual UUID EyesItem { - get { return m_wearables[EYES].ItemID; } - set { m_wearables[EYES].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.EYES].ItemID; } + set { m_wearables[(int)AppearanceLayer.EYES].ItemID = value; } } public virtual UUID EyesAsset { - get { return m_wearables[EYES].AssetID; } - set { m_wearables[EYES].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.EYES].AssetID; } + set { m_wearables[(int)AppearanceLayer.EYES].AssetID = value; } } public virtual UUID ShirtItem { - get { return m_wearables[SHIRT].ItemID; } - set { m_wearables[SHIRT].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.SHIRT].ItemID; } + set { m_wearables[(int)AppearanceLayer.SHIRT].ItemID = value; } } public virtual UUID ShirtAsset { - get { return m_wearables[SHIRT].AssetID; } - set { m_wearables[SHIRT].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.SHIRT].AssetID; } + set { m_wearables[(int)AppearanceLayer.SHIRT].AssetID = value; } } public virtual UUID PantsItem { - get { return m_wearables[PANTS].ItemID; } - set { m_wearables[PANTS].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.PANTS].ItemID; } + set { m_wearables[(int)AppearanceLayer.PANTS].ItemID = value; } } public virtual UUID PantsAsset { - get { return m_wearables[PANTS].AssetID; } - set { m_wearables[PANTS].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.PANTS].AssetID; } + set { m_wearables[(int)AppearanceLayer.PANTS].AssetID = value; } } public virtual UUID ShoesItem { - get { return m_wearables[SHOES].ItemID; } - set { m_wearables[SHOES].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.SHOES].ItemID; } + set { m_wearables[(int)AppearanceLayer.SHOES].ItemID = value; } } public virtual UUID ShoesAsset { - get { return m_wearables[SHOES].AssetID; } - set { m_wearables[SHOES].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.SHOES].AssetID; } + set { m_wearables[(int)AppearanceLayer.SHOES].AssetID = value; } } public virtual UUID SocksItem { - get { return m_wearables[SOCKS].ItemID; } - set { m_wearables[SOCKS].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.SOCKS].ItemID; } + set { m_wearables[(int)AppearanceLayer.SOCKS].ItemID = value; } } public virtual UUID SocksAsset { - get { return m_wearables[SOCKS].AssetID; } - set { m_wearables[SOCKS].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.SOCKS].AssetID; } + set { m_wearables[(int)AppearanceLayer.SOCKS].AssetID = value; } } public virtual UUID JacketItem { - get { return m_wearables[JACKET].ItemID; } - set { m_wearables[JACKET].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.JACKET].ItemID; } + set { m_wearables[(int)AppearanceLayer.JACKET].ItemID = value; } } public virtual UUID JacketAsset { - get { return m_wearables[JACKET].AssetID; } - set { m_wearables[JACKET].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.JACKET].AssetID; } + set { m_wearables[(int)AppearanceLayer.JACKET].AssetID = value; } } public virtual UUID GlovesItem { - get { return m_wearables[GLOVES].ItemID; } - set { m_wearables[GLOVES].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.GLOVES].ItemID; } + set { m_wearables[(int)AppearanceLayer.GLOVES].ItemID = value; } } public virtual UUID GlovesAsset { - get { return m_wearables[GLOVES].AssetID; } - set { m_wearables[GLOVES].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.GLOVES].AssetID; } + set { m_wearables[(int)AppearanceLayer.GLOVES].AssetID = value; } } public virtual UUID UnderShirtItem { - get { return m_wearables[UNDERSHIRT].ItemID; } - set { m_wearables[UNDERSHIRT].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.UNDERSHIRT].ItemID; } + set { m_wearables[(int)AppearanceLayer.UNDERSHIRT].ItemID = value; } } public virtual UUID UnderShirtAsset { - get { return m_wearables[UNDERSHIRT].AssetID; } - set { m_wearables[UNDERSHIRT].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.UNDERSHIRT].AssetID; } + set { m_wearables[(int)AppearanceLayer.UNDERSHIRT].AssetID = value; } } public virtual UUID UnderPantsItem { - get { return m_wearables[UNDERPANTS].ItemID; } - set { m_wearables[UNDERPANTS].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.UNDERPANTS].ItemID; } + set { m_wearables[(int)AppearanceLayer.UNDERPANTS].ItemID = value; } } public virtual UUID UnderPantsAsset { - get { return m_wearables[UNDERPANTS].AssetID; } - set { m_wearables[UNDERPANTS].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.UNDERPANTS].AssetID; } + set { m_wearables[(int)AppearanceLayer.UNDERPANTS].AssetID = value; } } public virtual UUID SkirtItem { - get { return m_wearables[SKIRT].ItemID; } - set { m_wearables[SKIRT].ItemID = value; } + get { return m_wearables[(int)AppearanceLayer.SKIRT].ItemID; } + set { m_wearables[(int)AppearanceLayer.SKIRT].ItemID = value; } } public virtual UUID SkirtAsset { - get { return m_wearables[SKIRT].AssetID; } - set { m_wearables[SKIRT].AssetID = value; } + get { return m_wearables[(int)AppearanceLayer.SKIRT].AssetID; } + set { m_wearables[(int)AppearanceLayer.SKIRT].AssetID = value; } } public virtual void SetDefaultWearables() { - m_wearables[BODY].AssetID = BODY_ASSET; - m_wearables[BODY].ItemID = BODY_ITEM; - m_wearables[SKIN].AssetID = SKIN_ASSET; - m_wearables[SKIN].ItemID = SKIN_ITEM; - m_wearables[HAIR].AssetID = HAIR_ASSET; - m_wearables[HAIR].ItemID = HAIR_ITEM; - m_wearables[SHIRT].AssetID = SHIRT_ASSET; - m_wearables[SHIRT].ItemID = SHIRT_ITEM; - m_wearables[PANTS].AssetID = PANTS_ASSET; - m_wearables[PANTS].ItemID = PANTS_ITEM; + m_wearables[(int)AppearanceLayer.BODY].AssetID = BODY_ASSET; + m_wearables[(int)AppearanceLayer.BODY].ItemID = BODY_ITEM; + m_wearables[(int)AppearanceLayer.SKIN].AssetID = SKIN_ASSET; + m_wearables[(int)AppearanceLayer.SKIN].ItemID = SKIN_ITEM; + m_wearables[(int)AppearanceLayer.HAIR].AssetID = HAIR_ASSET; + m_wearables[(int)AppearanceLayer.HAIR].ItemID = HAIR_ITEM; + m_wearables[(int)AppearanceLayer.SHIRT].AssetID = SHIRT_ASSET; + m_wearables[(int)AppearanceLayer.SHIRT].ItemID = SHIRT_ITEM; + m_wearables[(int)AppearanceLayer.PANTS].AssetID = PANTS_ASSET; + m_wearables[(int)AppearanceLayer.PANTS].ItemID = PANTS_ITEM; + m_wearables[(int)AppearanceLayer.ALPHA].AssetID = ALPHA_ASSET; + m_wearables[(int)AppearanceLayer.ALPHA].ItemID = ALPHA_ITEM; + m_wearables[(int)AppearanceLayer.TATTOO].AssetID = TATTOO_ASSET; + m_wearables[(int)AppearanceLayer.TATTOO].ItemID = TATTOO_ITEM; } public virtual void ClearWearables() { - for (int i = 0; i < 13; i++) + for (int i = 0; i < m_wearables.Length ; i++) { m_wearables[i].AssetID = UUID.Zero; m_wearables[i].ItemID = UUID.Zero; @@ -286,70 +394,12 @@ namespace OpenSim.Framework get { return m_hipOffset; } } - //Builds the VisualParam Enum using LIBOMV's Visual Param NameValues - /* - public void BuildVisualParamEnum() - { - Dictionary IndexedParams = new Dictionary(); - int vpIndex = 0; - IndexedParams = new Dictionary(); - - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - - sb.Append("public enum VPElement: int\n"); - sb.Append("{\n"); - foreach (KeyValuePair kvp in OpenMetaverse.VisualParams.Params) - { - VisualParam vp = kvp.Value; - - // Only Group-0 parameters are sent in AgentSetAppearance packets - if (kvp.Value.Group == 0) - { - - if (!IndexedParams.ContainsKey(vp.Name)) - { - - if (vp.Label.Length > 0 || vp.LabelMin.Length > 0 || vp.LabelMax.Length > 0) - { - - sb.Append("/// \n"); - if (vp.LabelMin.Length > 0 && vp.LabelMax.Length > 0) - sb.Append(string.Format("/// {0} - {1} 0--+255 {2}\n", vp.Label, vp.LabelMin, - vp.LabelMax)); - - else - sb.Append(string.Format("/// {0}\n", vp.Label)); - - sb.Append("/// \n"); - } - sb.Append(string.Format(" {0}_{1} = {2}", vp.Wearable.ToUpper(), vp.Name.ToUpper().Replace(" ", "_"),vpIndex)); - - IndexedParams.Add(vp.Name, vpIndex++); - } - else - { - sb.Append(string.Format(" {0}_{1}_{2} = {2}", vp.Wearable.ToUpper(), vp.Name.ToUpper().Replace(" ", "_"), vpIndex)); - vpIndex++; - //int i = 0; - } - } - if (vpIndex < 217) - sb.Append(",\n"); - else - sb.Append("\n"); - - } - sb.Append("}\n"); - - } - */ - public AvatarAppearance() : this(UUID.Zero) {} public AvatarAppearance(UUID owner) { - m_wearables = new AvatarWearable[MAX_WEARABLES]; - for (int i = 0; i < MAX_WEARABLES; i++) + m_wearables = new AvatarWearable[(int)AppearanceLayer.MAX_WEARABLES]; + for (int i = 0; i < (int)AppearanceLayer.MAX_WEARABLES; i++) { // this makes them all null m_wearables[i] = new AvatarWearable(); @@ -442,121 +492,6 @@ namespace OpenSim.Framework return visualParams; } - public override String ToString() - { - String s = "[Wearables] =>"; - s += " Body Item: " + BodyItem.ToString() + ";"; - s += " Skin Item: " + SkinItem.ToString() + ";"; - s += " Shirt Item: " + ShirtItem.ToString() + ";"; - s += " Pants Item: " + PantsItem.ToString() + ";"; - return s; - } - - // this is used for OGS1 - public virtual Hashtable ToHashTable() - { - Hashtable h = new Hashtable(); - h["owner"] = Owner.ToString(); - h["serial"] = Serial.ToString(); - h["visual_params"] = VisualParams; - h["texture"] = Texture.GetBytes(); - h["avatar_height"] = AvatarHeight.ToString(); - h["body_item"] = BodyItem.ToString(); - h["body_asset"] = BodyAsset.ToString(); - h["skin_item"] = SkinItem.ToString(); - h["skin_asset"] = SkinAsset.ToString(); - h["hair_item"] = HairItem.ToString(); - h["hair_asset"] = HairAsset.ToString(); - h["eyes_item"] = EyesItem.ToString(); - h["eyes_asset"] = EyesAsset.ToString(); - h["shirt_item"] = ShirtItem.ToString(); - h["shirt_asset"] = ShirtAsset.ToString(); - h["pants_item"] = PantsItem.ToString(); - h["pants_asset"] = PantsAsset.ToString(); - h["shoes_item"] = ShoesItem.ToString(); - h["shoes_asset"] = ShoesAsset.ToString(); - h["socks_item"] = SocksItem.ToString(); - h["socks_asset"] = SocksAsset.ToString(); - h["jacket_item"] = JacketItem.ToString(); - h["jacket_asset"] = JacketAsset.ToString(); - h["gloves_item"] = GlovesItem.ToString(); - h["gloves_asset"] = GlovesAsset.ToString(); - h["undershirt_item"] = UnderShirtItem.ToString(); - h["undershirt_asset"] = UnderShirtAsset.ToString(); - h["underpants_item"] = UnderPantsItem.ToString(); - h["underpants_asset"] = UnderPantsAsset.ToString(); - h["skirt_item"] = SkirtItem.ToString(); - h["skirt_asset"] = SkirtAsset.ToString(); - - string attachments = GetAttachmentsString(); - if (attachments != String.Empty) - h["attachments"] = attachments; - - return h; - } - - public AvatarAppearance(Hashtable h) - { - Owner = new UUID((string)h["owner"]); - Serial = Convert.ToInt32((string)h["serial"]); - VisualParams = (byte[])h["visual_params"]; - - if (h.Contains("texture")) - { - byte[] te = h["texture"] as byte[]; - if (te != null && te.Length > 0) - Texture = new Primitive.TextureEntry(te, 0, te.Length); - } - else - { - // We shouldn't be receiving appearance hashtables without a TextureEntry, - // but in case we do this will prevent a failure when saving to the database - Texture = GetDefaultTexture(); - } - - - AvatarHeight = (float)Convert.ToDouble((string)h["avatar_height"]); - - m_wearables = new AvatarWearable[MAX_WEARABLES]; - for (int i = 0; i < MAX_WEARABLES; i++) - { - // this makes them all null - m_wearables[i] = new AvatarWearable(); - } - - BodyItem = new UUID((string)h["body_item"]); - BodyAsset = new UUID((string)h["body_asset"]); - SkinItem = new UUID((string)h["skin_item"]); - SkinAsset = new UUID((string)h["skin_asset"]); - HairItem = new UUID((string)h["hair_item"]); - HairAsset = new UUID((string)h["hair_asset"]); - EyesItem = new UUID((string)h["eyes_item"]); - EyesAsset = new UUID((string)h["eyes_asset"]); - ShirtItem = new UUID((string)h["shirt_item"]); - ShirtAsset = new UUID((string)h["shirt_asset"]); - PantsItem = new UUID((string)h["pants_item"]); - PantsAsset = new UUID((string)h["pants_asset"]); - ShoesItem = new UUID((string)h["shoes_item"]); - ShoesAsset = new UUID((string)h["shoes_asset"]); - SocksItem = new UUID((string)h["socks_item"]); - SocksAsset = new UUID((string)h["socks_asset"]); - JacketItem = new UUID((string)h["jacket_item"]); - JacketAsset = new UUID((string)h["jacket_asset"]); - GlovesItem = new UUID((string)h["gloves_item"]); - GlovesAsset = new UUID((string)h["gloves_asset"]); - UnderShirtItem = new UUID((string)h["undershirt_item"]); - UnderShirtAsset = new UUID((string)h["undershirt_asset"]); - UnderPantsItem = new UUID((string)h["underpants_item"]); - UnderPantsAsset = new UUID((string)h["underpants_asset"]); - SkirtItem = new UUID((string)h["skirt_item"]); - SkirtAsset = new UUID((string)h["skirt_asset"]); - - if (h.ContainsKey("attachments")) - { - SetAttachmentsString(h["attachments"].ToString()); - } - } - private Dictionary m_attachments = new Dictionary(); public void SetAttachments(AttachmentData[] data) @@ -1489,4 +1424,4 @@ namespace OpenSim.Framework SKIRT_SKIRT_BLUE = 217 } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 1a13dea..efd7e22 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2003,9 +2003,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); // try to let this work as in SL... - if (m_host.ParentID == 0) - { - // special case: If we are root, rotate complete SOG to new rotation + if (m_host.LinkNum < 2) + { + // Special case: If we are root, rotate complete SOG to new + // rotation. + // We are root if the link number is 0 (single prim) or 1 + // (root prim). ParentID may be nonzero in attachments and + // using it would cause attachments and HUDs to rotate + // to the wrong positions. SetRot(m_host, Rot2Quaternion(rot)); } else -- cgit v1.1 From e6fe83cd93691f5ecfbc00e4e140ffe98aa3ee1d Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 29 Oct 2010 20:17:59 +0100 Subject: Revert "Preliminary work on appearance layers. No user functionality yet." This work conflicts with cmickeyb's more extensive, related work This reverts commit 9c829c0410da89fdbb873f706d7ba63cf26b088f. --- OpenSim/Framework/AvatarAppearance.cs | 451 ++++++++++++--------- .../Shared/Api/Implementation/LSL_Api.cs | 11 +- 2 files changed, 261 insertions(+), 201 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 829ad79..5da8ba1 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -32,125 +32,6 @@ using OpenMetaverse; namespace OpenSim.Framework { - // A special dictionary for avatar appearance - public struct LayerItem - { - public UUID ItemID; - public UUID AssetID; - - public LayerItem(UUID itemID, UUID assetID) - { - ItemID = itemID; - AssetID = assetID; - } - } - - public class Layer - { - protected int m_layerType; - protected Dictionary m_items = new Dictionary(); - protected List m_ids = new List(); - - public Layer(int type) - { - m_layerType = type; - } - - public int LayerType - { - get { return m_layerType; } - } - - public int Count - { - get { return m_ids.Count; } - } - - public void Add(UUID itemID, UUID assetID) - { - if (m_items.ContainsKey(itemID)) - return; - if (m_ids.Count >= 5) - return; - - m_ids.Add(itemID); - m_items[itemID] = assetID; - } - - public void Wear(UUID itemID, UUID assetID) - { - Clear(); - Add(itemID, assetID); - } - - public void Clear() - { - m_ids.Clear(); - m_items.Clear(); - } - - public void RemoveItem(UUID itemID) - { - if (m_items.ContainsKey(itemID)) - { - m_ids.Remove(itemID); - m_items.Remove(itemID); - } - } - - public void RemoveAsset(UUID assetID) - { - UUID itemID = UUID.Zero; - - foreach (KeyValuePair kvp in m_items) - { - if (kvp.Value == assetID) - { - itemID = kvp.Key; - break; - } - } - - if (itemID != UUID.Zero) - { - m_ids.Remove(itemID); - m_items.Remove(itemID); - } - } - - public LayerItem this [int idx] - { - get - { - if (idx >= m_ids.Count || idx < 0) - return new LayerItem(UUID.Zero, UUID.Zero); - - return new LayerItem(m_ids[idx], m_items[m_ids[idx]]); - } - } - } - - public enum AppearanceLayer - { - BODY = 0, - SKIN = 1, - HAIR = 2, - EYES = 3, - SHIRT = 4, - PANTS = 5, - SHOES = 6, - SOCKS = 7, - JACKET = 8, - GLOVES = 9, - UNDERSHIRT = 10, - UNDERPANTS = 11, - SKIRT = 12, - ALPHA = 13, - TATTOO = 14, - - MAX_WEARABLES = 15 - } - /// /// Contains the Avatar's Appearance and methods to manipulate the appearance. /// @@ -158,6 +39,25 @@ namespace OpenSim.Framework { //private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + // these are guessed at by the list here - + // http://wiki.secondlife.com/wiki/Avatar_Appearance. We'll + // correct them over time for when were are wrong. + public readonly static int BODY = 0; + public readonly static int SKIN = 1; + public readonly static int HAIR = 2; + public readonly static int EYES = 3; + public readonly static int SHIRT = 4; + public readonly static int PANTS = 5; + public readonly static int SHOES = 6; + public readonly static int SOCKS = 7; + public readonly static int JACKET = 8; + public readonly static int GLOVES = 9; + public readonly static int UNDERSHIRT = 10; + public readonly static int UNDERPANTS = 11; + public readonly static int SKIRT = 12; + + private readonly static int MAX_WEARABLES = 13; + private static UUID BODY_ASSET = new UUID("66c41e39-38f9-f75a-024e-585989bfab73"); private static UUID BODY_ITEM = new UUID("66c41e39-38f9-f75a-024e-585989bfaba9"); private static UUID SKIN_ASSET = new UUID("77c41e39-38f9-f75a-024e-585989bbabbb"); @@ -168,10 +68,6 @@ namespace OpenSim.Framework private static UUID PANTS_ITEM = new UUID("77c41e39-38f9-f75a-0000-5859892f1111"); private static UUID HAIR_ASSET = new UUID("d342e6c0-b9d2-11dc-95ff-0800200c9a66"); private static UUID HAIR_ITEM = new UUID("d342e6c1-b9d2-11dc-95ff-0800200c9a66"); - private static UUID ALPHA_ASSET = new UUID("1578a2b1-5179-4b53-b618-fe00ca5a5594"); - private static UUID TATTOO_ASSET = new UUID("00000000-0000-2222-3333-100000001007"); - private static UUID ALPHA_ITEM = new UUID("bfb9923c-4838-4d2d-bf07-608c5b1165c8"); - private static UUID TATTOO_ITEM = new UUID("c47e22bd-3021-4ba4-82aa-2b5cb34d35e1"); public readonly static int VISUALPARAM_COUNT = 218; @@ -207,156 +103,152 @@ namespace OpenSim.Framework } public virtual UUID BodyItem { - get { return m_wearables[(int)AppearanceLayer.BODY].ItemID; } - set { m_wearables[(int)AppearanceLayer.BODY].ItemID = value; } + get { return m_wearables[BODY].ItemID; } + set { m_wearables[BODY].ItemID = value; } } public virtual UUID BodyAsset { - get { return m_wearables[(int)AppearanceLayer.BODY].AssetID; } - set { m_wearables[(int)AppearanceLayer.BODY].AssetID = value; } + get { return m_wearables[BODY].AssetID; } + set { m_wearables[BODY].AssetID = value; } } public virtual UUID SkinItem { - get { return m_wearables[(int)AppearanceLayer.SKIN].ItemID; } - set { m_wearables[(int)AppearanceLayer.SKIN].ItemID = value; } + get { return m_wearables[SKIN].ItemID; } + set { m_wearables[SKIN].ItemID = value; } } public virtual UUID SkinAsset { - get { return m_wearables[(int)AppearanceLayer.SKIN].AssetID; } - set { m_wearables[(int)AppearanceLayer.SKIN].AssetID = value; } + get { return m_wearables[SKIN].AssetID; } + set { m_wearables[SKIN].AssetID = value; } } public virtual UUID HairItem { - get { return m_wearables[(int)AppearanceLayer.HAIR].ItemID; } - set { m_wearables[(int)AppearanceLayer.HAIR].ItemID = value; } + get { return m_wearables[HAIR].ItemID; } + set { m_wearables[HAIR].ItemID = value; } } public virtual UUID HairAsset { - get { return m_wearables[(int)AppearanceLayer.HAIR].AssetID; } - set { m_wearables[(int)AppearanceLayer.HAIR].AssetID = value; } + get { return m_wearables[HAIR].AssetID; } + set { m_wearables[HAIR].AssetID = value; } } public virtual UUID EyesItem { - get { return m_wearables[(int)AppearanceLayer.EYES].ItemID; } - set { m_wearables[(int)AppearanceLayer.EYES].ItemID = value; } + get { return m_wearables[EYES].ItemID; } + set { m_wearables[EYES].ItemID = value; } } public virtual UUID EyesAsset { - get { return m_wearables[(int)AppearanceLayer.EYES].AssetID; } - set { m_wearables[(int)AppearanceLayer.EYES].AssetID = value; } + get { return m_wearables[EYES].AssetID; } + set { m_wearables[EYES].AssetID = value; } } public virtual UUID ShirtItem { - get { return m_wearables[(int)AppearanceLayer.SHIRT].ItemID; } - set { m_wearables[(int)AppearanceLayer.SHIRT].ItemID = value; } + get { return m_wearables[SHIRT].ItemID; } + set { m_wearables[SHIRT].ItemID = value; } } public virtual UUID ShirtAsset { - get { return m_wearables[(int)AppearanceLayer.SHIRT].AssetID; } - set { m_wearables[(int)AppearanceLayer.SHIRT].AssetID = value; } + get { return m_wearables[SHIRT].AssetID; } + set { m_wearables[SHIRT].AssetID = value; } } public virtual UUID PantsItem { - get { return m_wearables[(int)AppearanceLayer.PANTS].ItemID; } - set { m_wearables[(int)AppearanceLayer.PANTS].ItemID = value; } + get { return m_wearables[PANTS].ItemID; } + set { m_wearables[PANTS].ItemID = value; } } public virtual UUID PantsAsset { - get { return m_wearables[(int)AppearanceLayer.PANTS].AssetID; } - set { m_wearables[(int)AppearanceLayer.PANTS].AssetID = value; } + get { return m_wearables[PANTS].AssetID; } + set { m_wearables[PANTS].AssetID = value; } } public virtual UUID ShoesItem { - get { return m_wearables[(int)AppearanceLayer.SHOES].ItemID; } - set { m_wearables[(int)AppearanceLayer.SHOES].ItemID = value; } + get { return m_wearables[SHOES].ItemID; } + set { m_wearables[SHOES].ItemID = value; } } public virtual UUID ShoesAsset { - get { return m_wearables[(int)AppearanceLayer.SHOES].AssetID; } - set { m_wearables[(int)AppearanceLayer.SHOES].AssetID = value; } + get { return m_wearables[SHOES].AssetID; } + set { m_wearables[SHOES].AssetID = value; } } public virtual UUID SocksItem { - get { return m_wearables[(int)AppearanceLayer.SOCKS].ItemID; } - set { m_wearables[(int)AppearanceLayer.SOCKS].ItemID = value; } + get { return m_wearables[SOCKS].ItemID; } + set { m_wearables[SOCKS].ItemID = value; } } public virtual UUID SocksAsset { - get { return m_wearables[(int)AppearanceLayer.SOCKS].AssetID; } - set { m_wearables[(int)AppearanceLayer.SOCKS].AssetID = value; } + get { return m_wearables[SOCKS].AssetID; } + set { m_wearables[SOCKS].AssetID = value; } } public virtual UUID JacketItem { - get { return m_wearables[(int)AppearanceLayer.JACKET].ItemID; } - set { m_wearables[(int)AppearanceLayer.JACKET].ItemID = value; } + get { return m_wearables[JACKET].ItemID; } + set { m_wearables[JACKET].ItemID = value; } } public virtual UUID JacketAsset { - get { return m_wearables[(int)AppearanceLayer.JACKET].AssetID; } - set { m_wearables[(int)AppearanceLayer.JACKET].AssetID = value; } + get { return m_wearables[JACKET].AssetID; } + set { m_wearables[JACKET].AssetID = value; } } public virtual UUID GlovesItem { - get { return m_wearables[(int)AppearanceLayer.GLOVES].ItemID; } - set { m_wearables[(int)AppearanceLayer.GLOVES].ItemID = value; } + get { return m_wearables[GLOVES].ItemID; } + set { m_wearables[GLOVES].ItemID = value; } } public virtual UUID GlovesAsset { - get { return m_wearables[(int)AppearanceLayer.GLOVES].AssetID; } - set { m_wearables[(int)AppearanceLayer.GLOVES].AssetID = value; } + get { return m_wearables[GLOVES].AssetID; } + set { m_wearables[GLOVES].AssetID = value; } } public virtual UUID UnderShirtItem { - get { return m_wearables[(int)AppearanceLayer.UNDERSHIRT].ItemID; } - set { m_wearables[(int)AppearanceLayer.UNDERSHIRT].ItemID = value; } + get { return m_wearables[UNDERSHIRT].ItemID; } + set { m_wearables[UNDERSHIRT].ItemID = value; } } public virtual UUID UnderShirtAsset { - get { return m_wearables[(int)AppearanceLayer.UNDERSHIRT].AssetID; } - set { m_wearables[(int)AppearanceLayer.UNDERSHIRT].AssetID = value; } + get { return m_wearables[UNDERSHIRT].AssetID; } + set { m_wearables[UNDERSHIRT].AssetID = value; } } public virtual UUID UnderPantsItem { - get { return m_wearables[(int)AppearanceLayer.UNDERPANTS].ItemID; } - set { m_wearables[(int)AppearanceLayer.UNDERPANTS].ItemID = value; } + get { return m_wearables[UNDERPANTS].ItemID; } + set { m_wearables[UNDERPANTS].ItemID = value; } } public virtual UUID UnderPantsAsset { - get { return m_wearables[(int)AppearanceLayer.UNDERPANTS].AssetID; } - set { m_wearables[(int)AppearanceLayer.UNDERPANTS].AssetID = value; } + get { return m_wearables[UNDERPANTS].AssetID; } + set { m_wearables[UNDERPANTS].AssetID = value; } } public virtual UUID SkirtItem { - get { return m_wearables[(int)AppearanceLayer.SKIRT].ItemID; } - set { m_wearables[(int)AppearanceLayer.SKIRT].ItemID = value; } + get { return m_wearables[SKIRT].ItemID; } + set { m_wearables[SKIRT].ItemID = value; } } public virtual UUID SkirtAsset { - get { return m_wearables[(int)AppearanceLayer.SKIRT].AssetID; } - set { m_wearables[(int)AppearanceLayer.SKIRT].AssetID = value; } + get { return m_wearables[SKIRT].AssetID; } + set { m_wearables[SKIRT].AssetID = value; } } public virtual void SetDefaultWearables() { - m_wearables[(int)AppearanceLayer.BODY].AssetID = BODY_ASSET; - m_wearables[(int)AppearanceLayer.BODY].ItemID = BODY_ITEM; - m_wearables[(int)AppearanceLayer.SKIN].AssetID = SKIN_ASSET; - m_wearables[(int)AppearanceLayer.SKIN].ItemID = SKIN_ITEM; - m_wearables[(int)AppearanceLayer.HAIR].AssetID = HAIR_ASSET; - m_wearables[(int)AppearanceLayer.HAIR].ItemID = HAIR_ITEM; - m_wearables[(int)AppearanceLayer.SHIRT].AssetID = SHIRT_ASSET; - m_wearables[(int)AppearanceLayer.SHIRT].ItemID = SHIRT_ITEM; - m_wearables[(int)AppearanceLayer.PANTS].AssetID = PANTS_ASSET; - m_wearables[(int)AppearanceLayer.PANTS].ItemID = PANTS_ITEM; - m_wearables[(int)AppearanceLayer.ALPHA].AssetID = ALPHA_ASSET; - m_wearables[(int)AppearanceLayer.ALPHA].ItemID = ALPHA_ITEM; - m_wearables[(int)AppearanceLayer.TATTOO].AssetID = TATTOO_ASSET; - m_wearables[(int)AppearanceLayer.TATTOO].ItemID = TATTOO_ITEM; + m_wearables[BODY].AssetID = BODY_ASSET; + m_wearables[BODY].ItemID = BODY_ITEM; + m_wearables[SKIN].AssetID = SKIN_ASSET; + m_wearables[SKIN].ItemID = SKIN_ITEM; + m_wearables[HAIR].AssetID = HAIR_ASSET; + m_wearables[HAIR].ItemID = HAIR_ITEM; + m_wearables[SHIRT].AssetID = SHIRT_ASSET; + m_wearables[SHIRT].ItemID = SHIRT_ITEM; + m_wearables[PANTS].AssetID = PANTS_ASSET; + m_wearables[PANTS].ItemID = PANTS_ITEM; } public virtual void ClearWearables() { - for (int i = 0; i < m_wearables.Length ; i++) + for (int i = 0; i < 13; i++) { m_wearables[i].AssetID = UUID.Zero; m_wearables[i].ItemID = UUID.Zero; @@ -394,12 +286,70 @@ namespace OpenSim.Framework get { return m_hipOffset; } } + //Builds the VisualParam Enum using LIBOMV's Visual Param NameValues + /* + public void BuildVisualParamEnum() + { + Dictionary IndexedParams = new Dictionary(); + int vpIndex = 0; + IndexedParams = new Dictionary(); + + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + + sb.Append("public enum VPElement: int\n"); + sb.Append("{\n"); + foreach (KeyValuePair kvp in OpenMetaverse.VisualParams.Params) + { + VisualParam vp = kvp.Value; + + // Only Group-0 parameters are sent in AgentSetAppearance packets + if (kvp.Value.Group == 0) + { + + if (!IndexedParams.ContainsKey(vp.Name)) + { + + if (vp.Label.Length > 0 || vp.LabelMin.Length > 0 || vp.LabelMax.Length > 0) + { + + sb.Append("/// \n"); + if (vp.LabelMin.Length > 0 && vp.LabelMax.Length > 0) + sb.Append(string.Format("/// {0} - {1} 0--+255 {2}\n", vp.Label, vp.LabelMin, + vp.LabelMax)); + + else + sb.Append(string.Format("/// {0}\n", vp.Label)); + + sb.Append("/// \n"); + } + sb.Append(string.Format(" {0}_{1} = {2}", vp.Wearable.ToUpper(), vp.Name.ToUpper().Replace(" ", "_"),vpIndex)); + + IndexedParams.Add(vp.Name, vpIndex++); + } + else + { + sb.Append(string.Format(" {0}_{1}_{2} = {2}", vp.Wearable.ToUpper(), vp.Name.ToUpper().Replace(" ", "_"), vpIndex)); + vpIndex++; + //int i = 0; + } + } + if (vpIndex < 217) + sb.Append(",\n"); + else + sb.Append("\n"); + + } + sb.Append("}\n"); + + } + */ + public AvatarAppearance() : this(UUID.Zero) {} public AvatarAppearance(UUID owner) { - m_wearables = new AvatarWearable[(int)AppearanceLayer.MAX_WEARABLES]; - for (int i = 0; i < (int)AppearanceLayer.MAX_WEARABLES; i++) + m_wearables = new AvatarWearable[MAX_WEARABLES]; + for (int i = 0; i < MAX_WEARABLES; i++) { // this makes them all null m_wearables[i] = new AvatarWearable(); @@ -492,6 +442,121 @@ namespace OpenSim.Framework return visualParams; } + public override String ToString() + { + String s = "[Wearables] =>"; + s += " Body Item: " + BodyItem.ToString() + ";"; + s += " Skin Item: " + SkinItem.ToString() + ";"; + s += " Shirt Item: " + ShirtItem.ToString() + ";"; + s += " Pants Item: " + PantsItem.ToString() + ";"; + return s; + } + + // this is used for OGS1 + public virtual Hashtable ToHashTable() + { + Hashtable h = new Hashtable(); + h["owner"] = Owner.ToString(); + h["serial"] = Serial.ToString(); + h["visual_params"] = VisualParams; + h["texture"] = Texture.GetBytes(); + h["avatar_height"] = AvatarHeight.ToString(); + h["body_item"] = BodyItem.ToString(); + h["body_asset"] = BodyAsset.ToString(); + h["skin_item"] = SkinItem.ToString(); + h["skin_asset"] = SkinAsset.ToString(); + h["hair_item"] = HairItem.ToString(); + h["hair_asset"] = HairAsset.ToString(); + h["eyes_item"] = EyesItem.ToString(); + h["eyes_asset"] = EyesAsset.ToString(); + h["shirt_item"] = ShirtItem.ToString(); + h["shirt_asset"] = ShirtAsset.ToString(); + h["pants_item"] = PantsItem.ToString(); + h["pants_asset"] = PantsAsset.ToString(); + h["shoes_item"] = ShoesItem.ToString(); + h["shoes_asset"] = ShoesAsset.ToString(); + h["socks_item"] = SocksItem.ToString(); + h["socks_asset"] = SocksAsset.ToString(); + h["jacket_item"] = JacketItem.ToString(); + h["jacket_asset"] = JacketAsset.ToString(); + h["gloves_item"] = GlovesItem.ToString(); + h["gloves_asset"] = GlovesAsset.ToString(); + h["undershirt_item"] = UnderShirtItem.ToString(); + h["undershirt_asset"] = UnderShirtAsset.ToString(); + h["underpants_item"] = UnderPantsItem.ToString(); + h["underpants_asset"] = UnderPantsAsset.ToString(); + h["skirt_item"] = SkirtItem.ToString(); + h["skirt_asset"] = SkirtAsset.ToString(); + + string attachments = GetAttachmentsString(); + if (attachments != String.Empty) + h["attachments"] = attachments; + + return h; + } + + public AvatarAppearance(Hashtable h) + { + Owner = new UUID((string)h["owner"]); + Serial = Convert.ToInt32((string)h["serial"]); + VisualParams = (byte[])h["visual_params"]; + + if (h.Contains("texture")) + { + byte[] te = h["texture"] as byte[]; + if (te != null && te.Length > 0) + Texture = new Primitive.TextureEntry(te, 0, te.Length); + } + else + { + // We shouldn't be receiving appearance hashtables without a TextureEntry, + // but in case we do this will prevent a failure when saving to the database + Texture = GetDefaultTexture(); + } + + + AvatarHeight = (float)Convert.ToDouble((string)h["avatar_height"]); + + m_wearables = new AvatarWearable[MAX_WEARABLES]; + for (int i = 0; i < MAX_WEARABLES; i++) + { + // this makes them all null + m_wearables[i] = new AvatarWearable(); + } + + BodyItem = new UUID((string)h["body_item"]); + BodyAsset = new UUID((string)h["body_asset"]); + SkinItem = new UUID((string)h["skin_item"]); + SkinAsset = new UUID((string)h["skin_asset"]); + HairItem = new UUID((string)h["hair_item"]); + HairAsset = new UUID((string)h["hair_asset"]); + EyesItem = new UUID((string)h["eyes_item"]); + EyesAsset = new UUID((string)h["eyes_asset"]); + ShirtItem = new UUID((string)h["shirt_item"]); + ShirtAsset = new UUID((string)h["shirt_asset"]); + PantsItem = new UUID((string)h["pants_item"]); + PantsAsset = new UUID((string)h["pants_asset"]); + ShoesItem = new UUID((string)h["shoes_item"]); + ShoesAsset = new UUID((string)h["shoes_asset"]); + SocksItem = new UUID((string)h["socks_item"]); + SocksAsset = new UUID((string)h["socks_asset"]); + JacketItem = new UUID((string)h["jacket_item"]); + JacketAsset = new UUID((string)h["jacket_asset"]); + GlovesItem = new UUID((string)h["gloves_item"]); + GlovesAsset = new UUID((string)h["gloves_asset"]); + UnderShirtItem = new UUID((string)h["undershirt_item"]); + UnderShirtAsset = new UUID((string)h["undershirt_asset"]); + UnderPantsItem = new UUID((string)h["underpants_item"]); + UnderPantsAsset = new UUID((string)h["underpants_asset"]); + SkirtItem = new UUID((string)h["skirt_item"]); + SkirtAsset = new UUID((string)h["skirt_asset"]); + + if (h.ContainsKey("attachments")) + { + SetAttachmentsString(h["attachments"].ToString()); + } + } + private Dictionary m_attachments = new Dictionary(); public void SetAttachments(AttachmentData[] data) @@ -1424,4 +1489,4 @@ namespace OpenSim.Framework SKIRT_SKIRT_BLUE = 217 } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index efd7e22..1a13dea 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2003,14 +2003,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); // try to let this work as in SL... - if (m_host.LinkNum < 2) - { - // Special case: If we are root, rotate complete SOG to new - // rotation. - // We are root if the link number is 0 (single prim) or 1 - // (root prim). ParentID may be nonzero in attachments and - // using it would cause attachments and HUDs to rotate - // to the wrong positions. + if (m_host.ParentID == 0) + { + // special case: If we are root, rotate complete SOG to new rotation SetRot(m_host, Rot2Quaternion(rot)); } else -- cgit v1.1 From 5f4badf9e2cd96f4a4a48b0019bd5f39298213ab Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 29 Oct 2010 20:48:37 +0200 Subject: Add my work on top of cmickeyb's --- OpenSim/Framework/AvatarAppearance.cs | 100 +++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 55646dd..4738d88 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -35,6 +35,104 @@ using log4net; namespace OpenSim.Framework { + // A special dictionary for avatar appearance + public struct LayerItem + { + public UUID ItemID; + public UUID AssetID; + + public LayerItem(UUID itemID, UUID assetID) + { + ItemID = itemID; + AssetID = assetID; + } + } + + public class Layer + { + protected int m_layerType; + protected Dictionary m_items = new Dictionary(); + protected List m_ids = new List(); + + public Layer(int type) + { + m_layerType = type; + } + + public int LayerType + { + get { return m_layerType; } + } + + public int Count + { + get { return m_ids.Count; } + } + + public void Add(UUID itemID, UUID assetID) + { + if (m_items.ContainsKey(itemID)) + return; + if (m_ids.Count >= 5) + return; + + m_ids.Add(itemID); + m_items[itemID] = assetID; + } + + public void Wear(UUID itemID, UUID assetID) + { + Clear(); + Add(itemID, assetID); + } + + public void Clear() + { + m_ids.Clear(); + m_items.Clear(); + } + + public void RemoveItem(UUID itemID) + { + if (m_items.ContainsKey(itemID)) + { + m_ids.Remove(itemID); + m_items.Remove(itemID); + } + } + + public void RemoveAsset(UUID assetID) + { + UUID itemID = UUID.Zero; + + foreach (KeyValuePair kvp in m_items) + { + if (kvp.Value == assetID) + { + itemID = kvp.Key; + break; + } + } + + if (itemID != UUID.Zero) + { + m_ids.Remove(itemID); + m_items.Remove(itemID); + } + } + + public LayerItem this [int idx] + { + get + { + if (idx >= m_ids.Count || idx < 0) + return new LayerItem(UUID.Zero, UUID.Zero); + + return new LayerItem(m_ids[idx], m_items[m_ids[idx]]); + } + } + } + /// /// Contains the Avatar's Appearance and methods to manipulate the appearance. /// @@ -1456,4 +1554,4 @@ namespace OpenSim.Framework SKIRT_SKIRT_BLUE = 217 } } -} \ No newline at end of file +} -- cgit v1.1 From f5c9a56c8b73ef93db712fefe9f0366c4983e04f Mon Sep 17 00:00:00 2001 From: Master ScienceSim Date: Fri, 29 Oct 2010 13:37:13 -0700 Subject: Bunch of fixes that reduce the number of times appearance and avatar data are sent. And the number of times they are stored. --- OpenSim/Framework/AvatarAppearance.cs | 35 +++++------ .../Avatar/Attachments/AttachmentsModule.cs | 32 ++++------ .../Avatar/AvatarFactory/AvatarFactoryModule.cs | 73 +++++++++++++++------- OpenSim/Region/Framework/Scenes/Scene.cs | 7 +++ OpenSim/Region/Framework/Scenes/ScenePresence.cs | 66 +++++++++++++------ 5 files changed, 132 insertions(+), 81 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index e66a1e7..17e4eb4 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -45,6 +45,7 @@ namespace OpenSim.Framework public readonly static int VISUALPARAM_COUNT = 218; public readonly static int TEXTURE_COUNT = 21; + public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; protected UUID m_owner; protected int m_serial = 1; @@ -347,14 +348,8 @@ namespace OpenSim.Framework protected virtual void SetDefaultTexture() { m_texture = new Primitive.TextureEntry(new UUID("C228D1CF-4B5D-4BA8-84F4-899A0796AA97")); - // The initialization of these seems to force a rebake regardless of whether it is needed - // m_textures.CreateFace(0).TextureID = new UUID("00000000-0000-1111-9999-000000000012"); - // m_textures.CreateFace(1).TextureID = Util.BLANK_TEXTURE_UUID; - // m_textures.CreateFace(2).TextureID = Util.BLANK_TEXTURE_UUID; - // m_textures.CreateFace(3).TextureID = new UUID("6522E74D-1660-4E7F-B601-6F48C1659A77"); - // m_textures.CreateFace(4).TextureID = new UUID("7CA39B4C-BD19-4699-AFF7-F93FD03D3E7B"); - // m_textures.CreateFace(5).TextureID = new UUID("00000000-0000-1111-9999-000000000010"); - // m_textures.CreateFace(6).TextureID = new UUID("00000000-0000-1111-9999-000000000011"); + for (uint i = 0; i < TEXTURE_COUNT; i++) + m_texture.CreateFace(i).TextureID = new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE); } /// @@ -371,7 +366,7 @@ namespace OpenSim.Framework // made. We determine if any of the textures actually // changed to know if the appearance should be saved later bool changed = false; - for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++) + for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++) { Primitive.TextureEntryFace newface = textureEntry.FaceTextures[i]; Primitive.TextureEntryFace oldface = m_texture.FaceTextures[i]; @@ -385,7 +380,6 @@ namespace OpenSim.Framework if (oldface != null && oldface.TextureID == newface.TextureID) continue; } - m_texture.FaceTextures[i] = (newface != null) ? new Primitive.TextureEntryFace(newface) : null; changed = true; // DEBUG ON if (newface != null) @@ -393,6 +387,7 @@ namespace OpenSim.Framework // DEBUG OFF } + m_texture = textureEntry; return changed; } @@ -415,8 +410,8 @@ namespace OpenSim.Framework if (visualParams[i] != m_visualparams[i]) { // DEBUG ON - m_log.WarnFormat("[AVATARAPPEARANCE] vparams changed [{0}] {1} ==> {2}", - i,m_visualparams[i],visualParams[i]); +// m_log.WarnFormat("[AVATARAPPEARANCE] vparams changed [{0}] {1} ==> {2}", +// i,m_visualparams[i],visualParams[i]); // DEBUG OFF m_visualparams[i] = visualParams[i]; changed = true; @@ -581,6 +576,8 @@ namespace OpenSim.Framework m_attachments.Clear(); } + #region Packing Functions + /// /// Create an OSDMap from the appearance data /// @@ -605,7 +602,7 @@ namespace OpenSim.Framework if (m_texture.FaceTextures[i] != null) textures.Add(OSD.FromUUID(m_texture.FaceTextures[i].TextureID)); else - textures.Add(OSD.FromUUID(UUID.Zero)); + textures.Add(OSD.FromUUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE)); } data["textures"] = textures; @@ -657,12 +654,10 @@ namespace OpenSim.Framework OSDArray textures = (OSDArray)(data["textures"]); for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++) { + UUID textureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE; if (textures[i] != null) - { - UUID textureID = textures[i].AsUUID(); - if (textureID != UUID.Zero) - m_texture.CreateFace((uint)i).TextureID = textureID; - } + textureID = textures[i].AsUUID(); + m_texture.CreateFace((uint)i).TextureID = new UUID(textureID); } } else @@ -697,6 +692,9 @@ namespace OpenSim.Framework } } + #endregion + + #region VPElement /// /// Viewer Params Array Element for AgentSetAppearance @@ -1460,5 +1458,6 @@ namespace OpenSim.Framework SKIRT_SKIRT_GREEN = 216, SKIRT_SKIRT_BLUE = 217 } + #endregion } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index ad6b1de..e89368a 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -123,15 +123,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); // Save avatar attachment information - ScenePresence presence; - if (m_scene.AvatarService != null && m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) - { - m_log.Info( - "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId - + ", AttachmentPoint: " + AttachmentPt); + m_log.Info( + "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + + ", AttachmentPoint: " + AttachmentPt); - m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance); - } + if (m_scene.AvatarFactory != null) + m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); } } catch (Exception e) @@ -382,8 +379,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments item = m_scene.InventoryService.GetItem(item); presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); - if (m_scene.AvatarService != null) - m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance); + if (m_scene.AvatarFactory != null) + m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); } } @@ -405,11 +402,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments presence.Appearance.DetachAttachment(itemID); // Save avatar attachment information - if (m_scene.AvatarService != null) - { - m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID); - m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance); - } + m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID); + if (m_scene.AvatarFactory != null) + m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); } DetachSingleAttachmentToInv(itemID, remoteClient); @@ -435,10 +430,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments presence.Appearance.DetachAttachment(itemID); - if (m_scene.AvatarService != null) - { - m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance); - } + if (m_scene.AvatarFactory != null) + m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); + part.ParentGroup.DetachToGround(); List uuids = new List(); diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 5f8b4f6..bfbbcf8 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -42,10 +42,9 @@ using OpenSim.Services.Interfaces; namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory { - public class AvatarFactoryModule : IRegionModule + public class AvatarFactoryModule : IAvatarFactory, IRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; private Scene m_scene = null; private int m_savetime = 5; // seconds to wait before saving changed appearance @@ -60,8 +59,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory public void Initialise(Scene scene, IConfigSource config) { + scene.RegisterModuleInterface(this); scene.EventManager.OnNewClient += NewClient; - + if (config != null) { IConfig sconfig = config.Configs["Startup"]; @@ -112,6 +112,34 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory #endregion + public bool ValidateBakedTextureCache(IClientAPI client) + { + ScenePresence sp = m_scene.GetScenePresence(client.AgentId); + if (sp == null) + { + m_log.WarnFormat("[AVFACTORY] SetAppearance unable to find presence for {0}",client.AgentId); + return false; + } + + bool cached = true; + + // Process the texture entry + for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) + { + int idx = AvatarAppearance.BAKE_INDICES[i]; + Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx]; + if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE) + if (! CheckBakedTextureAsset(client,face.TextureID,idx)) + { + sp.Appearance.Texture.FaceTextures[idx] = null; + cached = false; + } + } + + return cached; + } + + /// /// Set appearance data (textureentry and slider settings) received from the client /// @@ -137,12 +165,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory { changed = sp.Appearance.SetTextureEntries(textureEntry); - for (int i = 0; i < BAKE_INDICES.Length; i++) + for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) { - int idx = BAKE_INDICES[i]; + int idx = AvatarAppearance.BAKE_INDICES[i]; Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx]; if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE) - Util.FireAndForget(delegate(object o) { CheckBakedTextureAssets(client,face.TextureID,idx); }); + Util.FireAndForget(delegate(object o) { + if (! CheckBakedTextureAsset(client,face.TextureID,idx)) + client.SendRebakeAvatarTextures(face.TextureID); + }); } } @@ -165,9 +196,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory QueueAppearanceSend(client.AgentId); // Send the appearance back to the avatar - AvatarAppearance avp = sp.Appearance; - sp.ControllingClient.SendAvatarDataImmediate(sp); - sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes()); + // AvatarAppearance avp = sp.Appearance; + // sp.ControllingClient.SendAvatarDataImmediate(sp); + // sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes()); } /// @@ -177,14 +208,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory /// /// /// - private void CheckBakedTextureAssets(IClientAPI client, UUID textureID, int idx) + private bool CheckBakedTextureAsset(IClientAPI client, UUID textureID, int idx) { if (m_scene.AssetService.Get(textureID.ToString()) == null) { m_log.WarnFormat("[AVFACTORY]: Missing baked texture {0} ({1}) for avatar {2}", textureID,idx,client.Name); - client.SendRebakeAvatarTextures(textureID); + return false; } + return true; } #region UpdateAppearanceTimer @@ -229,16 +261,16 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory } // DEBUG ON - m_log.WarnFormat("[AVFACTORY] Handle appearance send for {0}\n{1}",agentid,sp.Appearance.ToString()); + m_log.WarnFormat("[AVFACTORY] Handle appearance send for {0}",agentid); // DEBUG OFF // Send the appearance to everyone in the scene sp.SendAppearanceToAllOtherAgents(); + sp.ControllingClient.SendAvatarDataImmediate(sp); // Send the appearance back to the avatar - AvatarAppearance avp = sp.Appearance; - sp.ControllingClient.SendAvatarDataImmediate(sp); - sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes()); + // AvatarAppearance avp = sp.Appearance; + // sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes()); /* // this needs to be fixed, the flag should be on scene presence not the region module @@ -337,14 +369,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance); - //if (!TryGetAvatarAppearance(client.AgentId, out avatAppearance)) - //{ - // m_log.Warn("[AVFACTORY]: We didn't seem to find the appearance, falling back to ScenePresence"); - // avatAppearance = sp.Appearance; - //} - - //m_log.DebugFormat("[AVFACTORY]: Received wearables for {0}", client.Name); - foreach (AvatarWearingArgs.Wearable wear in e.NowWearing) { if (wear.Type < AvatarWearable.MAX_WEARABLES) @@ -354,10 +378,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory } } + // This could take awhile since it needs to pull inventory SetAppearanceAssets(sp.UUID, ref avatAppearance); - m_scene.AvatarService.SetAppearance(client.AgentId, avatAppearance); sp.Appearance = avatAppearance; + m_scene.AvatarService.SetAppearance(client.AgentId, sp.Appearance); } private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6367fcf..3343d08 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -119,6 +119,7 @@ namespace OpenSim.Region.Framework.Scenes protected IXMLRPC m_xmlrpcModule; protected IWorldComm m_worldCommModule; + protected IAvatarFactory m_AvatarFactory; protected IConfigSource m_config; protected IRegionSerialiserModule m_serialiser; protected IDialogModule m_dialogModule; @@ -398,6 +399,11 @@ namespace OpenSim.Region.Framework.Scenes public IAttachmentsModule AttachmentsModule { get; set; } + public IAvatarFactory AvatarFactory + { + get { return m_AvatarFactory; } + } + public ICapabilitiesModule CapsModule { get { return m_capsModule; } @@ -1153,6 +1159,7 @@ namespace OpenSim.Region.Framework.Scenes m_xmlrpcModule = RequestModuleInterface(); m_worldCommModule = RequestModuleInterface(); XferManager = RequestModuleInterface(); + m_AvatarFactory = RequestModuleInterface(); AttachmentsModule = RequestModuleInterface(); m_serialiser = RequestModuleInterface(); m_dialogModule = RequestModuleInterface(); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f828a2d..7d9c8e5 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -704,20 +704,14 @@ namespace OpenSim.Region.Framework.Scenes // we created a new ScenePresence (a new child agent) in a fresh region. // Request info about all the (root) agents in this region // Note: This won't send data *to* other clients in that region (children don't send) - SendInitialFullUpdateToAllClients(); + +// MIC: This should be called by OnCompleteMovement +// SendInitialFullUpdateToAllClients(); RegisterToEvents(); SetDirectionVectors(); } -/* - public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams, - AvatarWearable[] wearables) - : this(client, world, reginfo) - { - m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams); - } -*/ public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance) : this(client, world, reginfo) { @@ -1081,7 +1075,9 @@ namespace OpenSim.Region.Framework.Scenes /// public void CompleteMovement(IClientAPI client) { - //m_log.Debug("[SCENE PRESENCE]: CompleteMovement"); +// DEBUG ON + m_log.WarnFormat("[SCENE PRESENCE]: CompleteMovement for {0}",UUID); +// DEBUG OFF Vector3 look = Velocity; if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) @@ -2381,12 +2377,20 @@ namespace OpenSim.Region.Framework.Scenes // 2 stage check is needed. if (remoteAvatar == null) return; + IClientAPI cl=remoteAvatar.ControllingClient; if (cl == null) return; + if (m_appearance.Texture == null) return; + if (LocalId == remoteAvatar.LocalId) + { + m_log.WarnFormat("[SP] An agent is attempting to send data to itself; {0}",UUID); + return; + } + if (IsChildAgent) { m_log.WarnFormat("[SCENEPRESENCE] A child agent is attempting to send out avatar data"); @@ -2407,20 +2411,23 @@ namespace OpenSim.Region.Framework.Scenes m_scene.ForEachScenePresence(delegate(ScenePresence avatar) { ++avUpdates; - // only send if this is the root (children are only "listening posts" in a foreign region) + + // Don't update ourselves + if (avatar.LocalId == LocalId) + return; + + // If this is a root agent, then get info about the avatar if (!IsChildAgent) { SendFullUpdateToOtherClient(avatar); } - if (avatar.LocalId != LocalId) + // If the other avatar is a root + if (!avatar.IsChildAgent) { - if (!avatar.IsChildAgent) - { - avatar.SendFullUpdateToOtherClient(this); - avatar.SendAppearanceToOtherAgent(this); - avatar.Animator.SendAnimPackToClient(ControllingClient); - } + avatar.SendFullUpdateToOtherClient(this); + avatar.SendAppearanceToOtherAgent(this); + avatar.Animator.SendAnimPackToClient(ControllingClient); } }); @@ -2465,7 +2472,19 @@ namespace OpenSim.Region.Framework.Scenes // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); m_controllingClient.SendAvatarDataImmediate(this); - m_controllingClient.SendAppearance(m_appearance.Owner,m_appearance.VisualParams,m_appearance.Texture.GetBytes()); + if (m_scene.AvatarFactory != null) + { + if (m_scene.AvatarFactory.ValidateBakedTextureCache(m_controllingClient)) + { + m_log.WarnFormat("[SP] baked textures are in the ache for {0}",Name); + m_controllingClient.SendAppearance( + m_appearance.Owner,m_appearance.VisualParams,m_appearance.Texture.GetBytes()); + } + } + else + { + m_log.WarnFormat("[SP] AvatarFactory not set"); + } SendInitialFullUpdateToAllClients(); } @@ -2497,9 +2516,16 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendAppearanceToOtherAgent(ScenePresence avatar) { + if (LocalId == avatar.LocalId) + { + m_log.WarnFormat("[SP] An agent is attempting to send data to itself; {0}",UUID); + return; + } + // DEBUG ON - m_log.WarnFormat("[SP] Send appearance from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId); +// m_log.WarnFormat("[SP] Send appearance from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId); // DEBUG OFF + avatar.ControllingClient.SendAppearance( m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes()); } -- cgit v1.1 From 49fa7e91b93221f4bd33e6f009185bc0e043a880 Mon Sep 17 00:00:00 2001 From: Master ScienceSim Date: Fri, 29 Oct 2010 13:45:59 -0700 Subject: Clean up some cruft from the last commit. Re-add the initial update send in the scene presence constructor... need to figure this out later. --- .../Region/Framework/Interfaces/IAvatarFactory.cs | 39 ++++++++++++++++++++++ OpenSim/Region/Framework/Scenes/ScenePresence.cs | 4 +-- 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 OpenSim/Region/Framework/Interfaces/IAvatarFactory.cs (limited to 'OpenSim') diff --git a/OpenSim/Region/Framework/Interfaces/IAvatarFactory.cs b/OpenSim/Region/Framework/Interfaces/IAvatarFactory.cs new file mode 100644 index 0000000..22795fc --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IAvatarFactory.cs @@ -0,0 +1,39 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using OpenMetaverse; +using OpenSim.Framework; + +namespace OpenSim.Region.Framework.Interfaces +{ + public interface IAvatarFactory + { + bool ValidateBakedTextureCache(IClientAPI client); + void QueueAppearanceSend(UUID agentid); + void QueueAppearanceSave(UUID agentid); + } +} diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 7d9c8e5..d4d6979 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -705,8 +705,8 @@ namespace OpenSim.Region.Framework.Scenes // Request info about all the (root) agents in this region // Note: This won't send data *to* other clients in that region (children don't send) -// MIC: This should be called by OnCompleteMovement -// SendInitialFullUpdateToAllClients(); +// MIC: This gets called again in CompleteMovement + SendInitialFullUpdateToAllClients(); RegisterToEvents(); SetDirectionVectors(); -- cgit v1.1