From a1cc218f10be109e6cca19f8e39d877243974984 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 14 Aug 2014 01:53:51 +0100 Subject: *DANGER* make baked textures cross and make use of it * UNTESTED * issue: alll this seems to be sent back to childs, need to stop that --- OpenSim/Framework/WearableCacheItem.cs | 60 +++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) (limited to 'OpenSim/Framework/WearableCacheItem.cs') diff --git a/OpenSim/Framework/WearableCacheItem.cs b/OpenSim/Framework/WearableCacheItem.cs index a890d3b..f49697d 100644 --- a/OpenSim/Framework/WearableCacheItem.cs +++ b/OpenSim/Framework/WearableCacheItem.cs @@ -49,7 +49,6 @@ namespace OpenSim.Framework retitems[i] = new WearableCacheItem() {CacheId = UUID.Zero, TextureID = UUID.Zero, TextureIndex = i}; return retitems; } - public static WearableCacheItem[] FromOSD(OSD pInput, IImprovedAssetCache dataCache) { @@ -100,6 +99,7 @@ namespace OpenSim.Framework return ret.ToArray(); } + public static OSD ToOSD(WearableCacheItem[] pcacheItems, IImprovedAssetCache dataCache) { OSDArray arr = new OSDArray(); @@ -126,6 +126,64 @@ namespace OpenSim.Framework } return arr; } + + public static OSDArray BakedToOSD(WearableCacheItem[] pcacheItems) + { + if (pcacheItems.Length < AvatarAppearance.BAKE_INDICES[AvatarAppearance.BAKE_INDICES.Length - 1]) + return null; + + OSDArray arr = new OSDArray(); + + for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) + { + int idx = AvatarAppearance.BAKE_INDICES[i]; + + WearableCacheItem item = pcacheItems[idx]; + + OSDMap itemmap = new OSDMap(); + itemmap.Add("textureindex", OSD.FromUInteger(item.TextureIndex)); + itemmap.Add("cacheid", OSD.FromUUID(item.CacheId)); + itemmap.Add("textureid", OSD.FromUUID(item.TextureID)); + if (item.TextureAsset != null) + { + itemmap.Add("assetdata", OSD.FromBinary(item.TextureAsset.Data)); + itemmap.Add("assetcreator", OSD.FromString(item.TextureAsset.CreatorID)); + itemmap.Add("assetname", OSD.FromString(item.TextureAsset.Name)); + } + arr.Add(itemmap); + } + return arr; + } + + public static WearableCacheItem[] BakedFromOSD(OSD pInput) + { + WearableCacheItem[] pcache = WearableCacheItem.GetDefaultCacheItem(); + + if (pInput.Type == OSDType.Array) + { + OSDArray itemarray = (OSDArray)pInput; + foreach (OSDMap item in itemarray) + { + int idx = (int)item["textureindex"].AsUInteger(); + if (idx < 0 || idx > pcache.Length) + continue; + pcache[idx].CacheId = item["cacheid"].AsUUID(); + pcache[idx].TextureID = item["textureid"].AsUUID(); + if (item.ContainsKey("assetdata")) + { + AssetBase asset = new AssetBase(item["textureid"].AsUUID(), "BakedTexture", (sbyte)AssetType.Texture, UUID.Zero.ToString()); + asset.Temporary = true; + asset.Local = true; + asset.Data = item["assetdata"].AsBinary(); + pcache[idx].TextureAsset = asset; + } + else + pcache[idx].TextureAsset = null; + } + } + return pcache; + } + public static WearableCacheItem SearchTextureIndex(uint pTextureIndex,WearableCacheItem[] pcacheItems) { for (int i = 0; i < pcacheItems.Length; i++) -- cgit v1.1