From 3c9d57c11b5173a7a86ec9ed290603a142b60407 Mon Sep 17 00:00:00 2001 From: MW Date: Mon, 12 Jan 2009 15:37:30 +0000 Subject: Added WearableItem class to the framework. This class can be used to: load from disk, create from code, or modify a existing Wearable item. Its not currently used by anything in trunk but is a handy utility class. I'll be writing some instructions on its use as part of a more general article on various methods of creating better initial avatars for new users. Which will include some code samples, but as each grid has its own requirements, there will be no out of the box solution included. --- OpenSim/Framework/WearableItem.cs | 328 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 OpenSim/Framework/WearableItem.cs diff --git a/OpenSim/Framework/WearableItem.cs b/OpenSim/Framework/WearableItem.cs new file mode 100644 index 0000000..c4aa9bd --- /dev/null +++ b/OpenSim/Framework/WearableItem.cs @@ -0,0 +1,328 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text.RegularExpressions; +using OpenMetaverse; + +namespace OpenSim.Framework +{ + public class WearableItem + { + public string WearableName = ""; + public WearableType WearType = WearableType.Invalid; + + public string ItemInfo = "Created Wearable"; + + public SortedList VisualSettings = new SortedList(); + // public LLObject.TextureEntry TextureEntry = null; + //public byte[] TextureEntry = null; + + public List TextureStrings = new List(); + + //permissions + public uint BaseMask = 0; + public uint OwnerMask = 0; + public uint GroupMask = 0; + public uint EveryoneMask = 0; + public uint NextOwnerMask = 0; + + public UUID CreatorID = UUID.Zero; + public UUID OwnerID = UUID.Zero; + public UUID LastOwnerID = UUID.Zero; + public UUID GroupID = UUID.Zero; + + //sale + public string SaleType = "not"; + public int SalePrice = 10; + + private string BuildString = ""; + + + public WearableItem(string wearableName, WearableType type) + { + WearableName = wearableName; + WearType = type; + } + + public WearableItem(string wearableName) + { + WearableName = wearableName; + WearType = ConvertNameToType(WearableName); + } + + public WearableItem(WearableType type) + { + WearType = type; + WearableName = Enum.GetName(typeof(WearableType), type).ToLower(); + } + + public WearableItem() + { + } + + public void AddVisualSetting(VisualSetting setting) + { + if (!VisualSettings.ContainsKey(setting.VisualParam.ParamID)) + { + VisualSettings.Add(setting.VisualParam.ParamID, setting); + } + } + + public bool TryGetSetting(string paramName, out VisualSetting paramSetting) + { + foreach (VisualSetting setting in VisualSettings.Values) + { + if (setting.VisualParam.Name == paramName) + { + paramSetting = setting; + return true; + } + } + + paramSetting = null; + return false; + } + + public bool SetParamValue(string paramName, float value) + { + VisualSetting paramSetting; + if (TryGetSetting(paramName, out paramSetting)) + { + if ((value >= paramSetting.VisualParam.MinValue) && (value <= paramSetting.VisualParam.MaxValue)) + { + paramSetting.Value = value; + return true; + } + } + return false; + } + + public void RandomiseValues() + { + foreach (VisualSetting setting in VisualSettings.Values) + { + //int randNum = Util.RandomClass.Next(0, 1000); + float range = setting.VisualParam.MaxValue - setting.VisualParam.MinValue; + // float val =((float) randNum )/ ((float)(1000.0f / range)); + float val = (float)OpenSim.Framework.Util.RandomClass.NextDouble() * range * 0.2f; + setting.Value = setting.VisualParam.MinValue + (range / 2) + val; + } + } + + public WearableType ConvertNameToType(string name) + { + return (WearableType)Enum.Parse(typeof(WearableType), name, true); + } + + public string ToAssetFormat() + { + BuildString = "LLWearable version 22\n"; + BuildString += "New Item \n"; + BuildString += ItemInfo + "\n"; + + + AddSectionStart("permissions"); + AddTabbedNameValueLine("base_mask", BaseMask.ToString("00000000")); + AddTabbedNameValueLine("owner_mask", OwnerMask.ToString("00000000")); + AddTabbedNameValueLine("group_mask", GroupMask.ToString("00000000")); + AddTabbedNameValueLine("everyone_mask", EveryoneMask.ToString("00000000")); + AddTabbedNameValueLine("next_owner_mask", NextOwnerMask.ToString("00000000")); + AddTabbedNameValueLine("creator_id", CreatorID.ToString()); + AddTabbedNameValueLine("owner_id", OwnerID.ToString()); + AddTabbedNameValueLine("last_owner_id", LastOwnerID.ToString()); + AddTabbedNameValueLine("group_id", GroupID.ToString()); + AddSectionEnd(); + + AddSectionStart("sale_info"); + AddTabbedNameValueLine("sale_type", SaleType.ToString()); + AddTabbedNameValueLine("sale_price", SalePrice.ToString()); + AddSectionEnd(); + + AddNameValueLine("type", ((byte)WearType).ToString()); + AddNameValueLine("parameters", VisualSettings.Count.ToString()); + + foreach (KeyValuePair kp in VisualSettings) + { + AddNameValueLine(kp.Key.ToString(), kp.Value.Value.ToString(CultureInfo.InvariantCulture)); + } + if (TextureStrings.Count == 0) + { + AddNameValueLine("textures", "0"); //todo output texture entry + } + else + { + AddNameValueLine("textures", TextureStrings.Count.ToString()); + for (int i = 0; i < TextureStrings.Count; i++) + { + BuildString += TextureStrings[i] + "\n"; + } + BuildString += "\n"; + + } + + return BuildString; + } + + public void SaveToFile(string fileName) + { + File.WriteAllText(fileName, this.ToAssetFormat()); + } + + public void AddSectionStart(string sectionName) + { + BuildString += "\t" + sectionName + " 0\n"; + BuildString += "\t{\n"; + } + + public void AddSectionEnd() + { + BuildString += "\t}\n"; + } + + private void AddTabbedNameValueLine(string name, string value) + { + BuildString += "\t\t"; + BuildString += name + "\t"; + BuildString += value + "\n"; + } + + private void AddNameValueLine(string name, string value) + { + // BuildString += "\t\t"; + BuildString += name + " "; + BuildString += value + "\n"; + } + + #region Static Methods + public static List FindParamsForWearable(string wearableName) + { + List wearableParams = new List(); + foreach (VisualParam param in VisualParams.Params.Values) + { + if (param.Wearable == wearableName) + { + wearableParams.Add(param); + } + } + + return wearableParams; + } + + public static WearableItem Create(string wearableTypeName) + { + WearableItem wearableItem = new WearableItem(wearableTypeName); + List typeParams = FindParamsForWearable(wearableTypeName); + foreach (VisualParam param in typeParams) + { + wearableItem.AddVisualSetting(new VisualSetting(param)); + } + return wearableItem; + } + + public static WearableItem CreateFromAsset(string assetData) + { + UUID creatorID = UUID.Zero; + UUID ownerID = UUID.Zero; + UUID lastOwnerID = UUID.Zero; + UUID groupID = UUID.Zero; + + char[] newlineDelimiter = { '\n' }; + string[] lines = assetData.Split(newlineDelimiter); + + WearableItem wearableObject = null; + Regex r = new Regex("[\t ]+"); + bool reachedParams = false; + bool reachedTextures = false; + foreach (string line in lines) + { + string trimLine = line.Trim(); + // Console.WriteLine("line : " + trimLine); + + string[] splitLine = r.Split(trimLine); + if (splitLine.Length > 1) + { + switch (splitLine[0]) + { + case "textures": + reachedParams = false; + reachedTextures = true; + break; + + case "type": + string wearableTypeName = Enum.GetName(typeof(WearableType), (WearableType)Convert.ToInt32(splitLine[1])); + wearableObject = Create(wearableTypeName.ToLower()); + break; + + case "parameters": + reachedParams = true; + break; + + case "creator_id": + creatorID = new UUID(splitLine[1]); + break; + + case "owner_id": + ownerID = new UUID(splitLine[1]); + break; + + case "last_owner_id": + lastOwnerID = new UUID(splitLine[1]); + break; + + case "group_id": + groupID = new UUID(splitLine[1]); + break; + + default: + if ((wearableObject != null) && (reachedParams)) + { + int id = Convert.ToInt32(splitLine[0]); + if (wearableObject.VisualSettings.ContainsKey(id)) + { + + wearableObject.VisualSettings[id].Value = Convert.ToSingle(splitLine[1], CultureInfo.InvariantCulture); + } + } + else if ((wearableObject != null) && (reachedTextures)) + { + wearableObject.TextureStrings.Add(line); + } + break; + } + } + } + + if (wearableObject != null) + { + wearableObject.CreatorID = creatorID; + wearableObject.OwnerID = ownerID; + wearableObject.LastOwnerID = lastOwnerID; + wearableObject.GroupID = groupID; + } + + return wearableObject; + } + #endregion + + #region Nested Class + public class VisualSetting + { + public VisualParam VisualParam; + public float Value = 0; + + public VisualSetting(VisualParam param, float value) + { + VisualParam = param; + Value = value; + } + + public VisualSetting(VisualParam param) + { + VisualParam = param; + Value = param.DefaultValue; + } + } + #endregion + } +} -- cgit v1.1