Dropping the rest of Avination's modified appearance code for core.
Module to follow.0.8.0.3
							parent
							
								
									8eec717f5f
								
							
						
					
					
						commit
						49c2213a01
					
				|  | @ -27,6 +27,7 @@ | |||
| 
 | ||||
| using System; | ||||
| using System.Collections; | ||||
| using System.Collections.Generic; | ||||
| using System.Collections.Specialized; | ||||
| using System.Drawing; | ||||
| using System.Drawing.Imaging; | ||||
|  | @ -53,8 +54,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
|     [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UploadBakedTextureModule")] | ||||
|     public class UploadBakedTextureModule : INonSharedRegionModule | ||||
|     { | ||||
| //        private static readonly ILog m_log = | ||||
| //            LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
|        private static readonly ILog m_log = | ||||
|             LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// For historical reasons this is fixed, but there | ||||
|  | @ -63,39 +64,211 @@ namespace OpenSim.Region.ClientStack.Linden | |||
| 
 | ||||
|         private Scene m_scene; | ||||
|         private bool m_persistBakedTextures; | ||||
|         private string m_URL; | ||||
| 
 | ||||
|         private IBakedTextureModule m_BakedTextureModule; | ||||
| 
 | ||||
|         public void Initialise(IConfigSource source) | ||||
|         { | ||||
|             IConfig config = source.Configs["ClientStack.LindenCaps"]; | ||||
|             if (config == null) | ||||
|                 return; | ||||
| 
 | ||||
|             m_URL = config.GetString("Cap_UploadBakedTexture", string.Empty); | ||||
| 
 | ||||
|             IConfig appearanceConfig = source.Configs["Appearance"]; | ||||
|             if (appearanceConfig != null) | ||||
|                 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); | ||||
| 
 | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public void AddRegion(Scene s) | ||||
|         { | ||||
|             m_scene = s; | ||||
|             | ||||
|         } | ||||
| 
 | ||||
|         public void RemoveRegion(Scene s) | ||||
|         { | ||||
|             s.EventManager.OnRegisterCaps -= RegisterCaps; | ||||
|             s.EventManager.OnNewPresence -= RegisterNewPresence; | ||||
|             s.EventManager.OnRemovePresence -= DeRegisterPresence; | ||||
|             m_BakedTextureModule = null; | ||||
|             m_scene = null; | ||||
|         } | ||||
| 
 | ||||
|         | ||||
| 
 | ||||
|         public void RegionLoaded(Scene s) | ||||
|         { | ||||
|             m_scene.EventManager.OnRegisterCaps += RegisterCaps; | ||||
|             m_scene.EventManager.OnNewPresence += RegisterNewPresence; | ||||
|             m_scene.EventManager.OnRemovePresence += DeRegisterPresence; | ||||
|              | ||||
|         } | ||||
| 
 | ||||
|         private void DeRegisterPresence(UUID agentId) | ||||
|         { | ||||
|             ScenePresence presence = null; | ||||
|             if (m_scene.TryGetScenePresence(agentId, out presence)) | ||||
|             { | ||||
|                 presence.ControllingClient.OnSetAppearance -= CaptureAppearanceSettings; | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         private void RegisterNewPresence(ScenePresence presence) | ||||
|         { | ||||
|            presence.ControllingClient.OnSetAppearance += CaptureAppearanceSettings; | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         private void CaptureAppearanceSettings(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 avSize, WearableCacheItem[] cacheItems) | ||||
|         { | ||||
|             int maxCacheitemsLoop = cacheItems.Length; | ||||
|             if (maxCacheitemsLoop > AvatarWearable.MAX_WEARABLES) | ||||
|             { | ||||
|                 maxCacheitemsLoop = AvatarWearable.MAX_WEARABLES; | ||||
|                 m_log.WarnFormat("[CACHEDBAKES]: Too Many Cache items Provided {0}, the max is {1}.  Truncating!", cacheItems.Length, AvatarWearable.MAX_WEARABLES); | ||||
|             } | ||||
| 
 | ||||
|             m_BakedTextureModule = m_scene.RequestModuleInterface<IBakedTextureModule>(); | ||||
|             if (cacheItems.Length > 0) | ||||
|             { | ||||
|                 m_log.Debug("[Cacheitems]: " + cacheItems.Length); | ||||
|                 for (int iter = 0; iter < maxCacheitemsLoop; iter++) | ||||
|                 { | ||||
|                     m_log.Debug("[Cacheitems] {" + iter + "/" + cacheItems[iter].TextureIndex + "}: c-" + cacheItems[iter].CacheId + ", t-" + | ||||
|                                       cacheItems[iter].TextureID); | ||||
|                 } | ||||
|                 | ||||
|                 ScenePresence p = null; | ||||
|                 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out p)) | ||||
|                 { | ||||
| 
 | ||||
|                     WearableCacheItem[] existingitems = p.Appearance.WearableCacheItems; | ||||
|                     if (existingitems == null) | ||||
|                     { | ||||
|                         if (m_BakedTextureModule != null) | ||||
|                         { | ||||
|                             WearableCacheItem[] savedcache = null; | ||||
|                             try | ||||
|                             { | ||||
|                                 if (p.Appearance.WearableCacheItemsDirty) | ||||
|                                 { | ||||
|                                     savedcache = m_BakedTextureModule.Get(p.UUID); | ||||
|                                     p.Appearance.WearableCacheItems = savedcache; | ||||
|                                     p.Appearance.WearableCacheItemsDirty = false; | ||||
|                                 } | ||||
| 
 | ||||
|                             } | ||||
|                             /* | ||||
|                              * The following Catch types DO NOT WORK with m_BakedTextureModule.Get | ||||
|                              * it jumps to the General Packet Exception Handler if you don't catch Exception! | ||||
|                              *  | ||||
|                             catch (System.Net.Sockets.SocketException) | ||||
|                             { | ||||
|                                 cacheItems = null; | ||||
|                             } | ||||
|                             catch (WebException) | ||||
|                             { | ||||
|                                 cacheItems = null; | ||||
|                             } | ||||
|                             catch (InvalidOperationException) | ||||
|                             { | ||||
|                                 cacheItems = null; | ||||
|                             } */ | ||||
|                             catch (Exception) | ||||
|                             { | ||||
|                                // The service logs a sufficient error message. | ||||
|                             } | ||||
|                              | ||||
| 
 | ||||
|                             if (savedcache != null) | ||||
|                                 existingitems = savedcache; | ||||
|                         } | ||||
|                     } | ||||
|                     // Existing items null means it's a fully new appearance | ||||
|                     if (existingitems == null) | ||||
|                     { | ||||
| 
 | ||||
|                         for (int i = 0; i < maxCacheitemsLoop; i++) | ||||
|                         { | ||||
|                             if (textureEntry.FaceTextures.Length > cacheItems[i].TextureIndex) | ||||
|                             { | ||||
|                                 Primitive.TextureEntryFace face = textureEntry.FaceTextures[cacheItems[i].TextureIndex]; | ||||
|                                 if (face == null) | ||||
|                                 { | ||||
|                                     textureEntry.CreateFace(cacheItems[i].TextureIndex); | ||||
|                                     textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID = | ||||
|                                         AppearanceManager.DEFAULT_AVATAR_TEXTURE; | ||||
|                                     continue; | ||||
|                                 } | ||||
|                                 cacheItems[i].TextureID =face.TextureID; | ||||
|                                 if (m_scene.AssetService != null) | ||||
|                                     cacheItems[i].TextureAsset = | ||||
|                                         m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString()); | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                                 m_log.WarnFormat("[CACHEDBAKES]: Invalid Texture Index Provided, Texture doesn't exist or hasn't been uploaded yet {0}, the max is {1}.  Skipping!", cacheItems[i].TextureIndex, textureEntry.FaceTextures.Length); | ||||
|                             } | ||||
| 
 | ||||
| 
 | ||||
|                         } | ||||
|                     } | ||||
|                     else | ||||
| 
 | ||||
| 
 | ||||
|                     { | ||||
|                         // for each uploaded baked texture | ||||
|                         for (int i = 0; i < maxCacheitemsLoop; i++) | ||||
|                         { | ||||
|                             if (textureEntry.FaceTextures.Length > cacheItems[i].TextureIndex) | ||||
|                             { | ||||
|                                 Primitive.TextureEntryFace face = textureEntry.FaceTextures[cacheItems[i].TextureIndex]; | ||||
|                                 if (face == null) | ||||
|                                 { | ||||
|                                     textureEntry.CreateFace(cacheItems[i].TextureIndex); | ||||
|                                     textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID = | ||||
|                                         AppearanceManager.DEFAULT_AVATAR_TEXTURE; | ||||
|                                     continue; | ||||
|                                 } | ||||
|                                 cacheItems[i].TextureID = | ||||
|                                     face.TextureID; | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                                 m_log.WarnFormat("[CACHEDBAKES]: Invalid Texture Index Provided, Texture doesn't exist or hasn't been uploaded yet {0}, the max is {1}.  Skipping!", cacheItems[i].TextureIndex, textureEntry.FaceTextures.Length); | ||||
|                             } | ||||
|                         } | ||||
| 
 | ||||
|                         for (int i = 0; i < maxCacheitemsLoop; i++) | ||||
|                         { | ||||
|                             if (cacheItems[i].TextureAsset == null) | ||||
|                             { | ||||
|                                 cacheItems[i].TextureAsset = | ||||
|                                     m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString()); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|                     p.Appearance.WearableCacheItems = cacheItems; | ||||
|                      | ||||
|                     | ||||
| 
 | ||||
|                     if (m_BakedTextureModule != null) | ||||
|                     { | ||||
|                         m_BakedTextureModule.Store(remoteClient.AgentId, cacheItems); | ||||
|                         p.Appearance.WearableCacheItemsDirty = true; | ||||
|                          | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void PostInitialise() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         public void Close() { } | ||||
| 
 | ||||
|         public string Name { get { return "UploadBakedTextureModule"; } } | ||||
|  | @ -107,26 +280,23 @@ namespace OpenSim.Region.ClientStack.Linden | |||
| 
 | ||||
|         public void RegisterCaps(UUID agentID, Caps caps) | ||||
|         { | ||||
| //            UUID capID = UUID.Random(); | ||||
|             UploadBakedTextureHandler avatarhandler = new UploadBakedTextureHandler( | ||||
|                 caps, m_scene.AssetService, m_persistBakedTextures); | ||||
| 
 | ||||
|             | ||||
|              | ||||
|             //caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture)); | ||||
|             if (m_URL == "localhost") | ||||
|             { | ||||
|             caps.RegisterHandler( | ||||
|                 "UploadBakedTexture", | ||||
|                 new RestStreamHandler( | ||||
|                     "POST", | ||||
|                     "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath, | ||||
|                         new UploadBakedTextureHandler( | ||||
|                             caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture, | ||||
|                     avatarhandler.UploadBakedTexture, | ||||
|                     "UploadBakedTexture", | ||||
|                     agentID.ToString())); | ||||
| 
 | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 caps.RegisterHandler("UploadBakedTexture", m_URL); | ||||
|             } | ||||
|             | ||||
|              | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -325,6 +325,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|         private readonly byte[] m_channelVersion = Utils.EmptyBytes; | ||||
|         private readonly IGroupsModule m_GroupsModule; | ||||
| 
 | ||||
|         private int m_cachedTextureSerial; | ||||
|         private PriorityQueue m_entityUpdates; | ||||
|         private PriorityQueue m_entityProps; | ||||
|         private Prioritizer m_prioritizer; | ||||
|  | @ -11742,35 +11743,157 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
|         /// <returns></returns> | ||||
|         protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet) | ||||
|         { | ||||
|             //m_log.Debug("texture cached: " + packet.ToString()); | ||||
|             AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet; | ||||
|             AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse); | ||||
| 
 | ||||
|             if (cachedtex.AgentData.SessionID != SessionId) | ||||
|                 return false; | ||||
| 
 | ||||
|             List<CachedTextureRequestArg> requestArgs = new List<CachedTextureRequestArg>(); | ||||
| 
 | ||||
|             for (int i = 0; i < cachedtex.WearableData.Length; i++) | ||||
|             // TODO: don't create new blocks if recycling an old packet | ||||
|             cachedresp.AgentData.AgentID = AgentId; | ||||
|             cachedresp.AgentData.SessionID = m_sessionId; | ||||
|             cachedresp.AgentData.SerialNum = m_cachedTextureSerial; | ||||
|             m_cachedTextureSerial++; | ||||
|             cachedresp.WearableData = | ||||
|                 new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length]; | ||||
| 
 | ||||
|             //IAvatarFactoryModule fac = m_scene.RequestModuleInterface<IAvatarFactoryModule>(); | ||||
|            // var item = fac.GetBakedTextureFaces(AgentId); | ||||
|             //WearableCacheItem[] items = fac.GetCachedItems(AgentId); | ||||
| 
 | ||||
|             IAssetService cache = m_scene.AssetService; | ||||
|             IBakedTextureModule bakedTextureModule = m_scene.RequestModuleInterface<IBakedTextureModule>(); | ||||
|             //bakedTextureModule = null; | ||||
|             int maxWearablesLoop = cachedtex.WearableData.Length; | ||||
|             if (maxWearablesLoop > AvatarWearable.MAX_WEARABLES) | ||||
|                 maxWearablesLoop = AvatarWearable.MAX_WEARABLES; | ||||
| 
 | ||||
|             if (bakedTextureModule != null && cache != null) | ||||
|             { | ||||
|                 CachedTextureRequestArg arg = new CachedTextureRequestArg(); | ||||
|                 arg.BakedTextureIndex = cachedtex.WearableData[i].TextureIndex; | ||||
|                 arg.WearableHashID = cachedtex.WearableData[i].ID; | ||||
|                  | ||||
|                 requestArgs.Add(arg); | ||||
|             } | ||||
|                 // We need to make sure the asset stored in the bake is available on this server also by it's assetid before we map it to a Cacheid | ||||
| 
 | ||||
|                 WearableCacheItem[] cacheItems = null; | ||||
|                 ScenePresence p = m_scene.GetScenePresence(AgentId); | ||||
|                 if (p.Appearance != null) | ||||
|                     if (p.Appearance.WearableCacheItems == null || p.Appearance.WearableCacheItemsDirty) | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                 CachedTextureRequest handlerCachedTextureRequest = OnCachedTextureRequest; | ||||
|                 if (handlerCachedTextureRequest != null) | ||||
|                             cacheItems = bakedTextureModule.Get(AgentId); | ||||
|                             p.Appearance.WearableCacheItems = cacheItems; | ||||
|                             p.Appearance.WearableCacheItemsDirty = false; | ||||
|                         } | ||||
| 
 | ||||
|                         /* | ||||
|                          * The following Catch types DO NOT WORK, it jumps to the General Packet Exception Handler if you don't catch Exception! | ||||
|                          *  | ||||
|                         catch (System.Net.Sockets.SocketException) | ||||
|                         { | ||||
|                     handlerCachedTextureRequest(simclient,cachedtex.AgentData.SerialNum,requestArgs); | ||||
|                             cacheItems = null; | ||||
|                         } | ||||
|             } | ||||
|             catch (Exception e) | ||||
|                         catch (WebException) | ||||
|                         { | ||||
|                 m_log.ErrorFormat("[CLIENT VIEW]: AgentTextureCached packet handler threw an exception, {0}", e); | ||||
|                 return false; | ||||
|                             cacheItems = null; | ||||
|                         } | ||||
|                         catch (InvalidOperationException) | ||||
|                         { | ||||
|                             cacheItems = null; | ||||
|                         } */ | ||||
|                         catch (Exception) | ||||
|                         { | ||||
|                             cacheItems = null; | ||||
|                         } | ||||
| 
 | ||||
|                     } | ||||
|                     else if (p.Appearance.WearableCacheItems != null) | ||||
|                     { | ||||
|                         cacheItems = p.Appearance.WearableCacheItems; | ||||
|                     } | ||||
| 
 | ||||
|                 if (cache != null && cacheItems != null) | ||||
|                 { | ||||
|                     foreach (WearableCacheItem item in cacheItems) | ||||
|                     { | ||||
| 
 | ||||
|                         if (cache.GetCached(item.TextureID.ToString()) == null) | ||||
|                         { | ||||
|                             item.TextureAsset.Temporary = true; | ||||
|                             cache.Store(item.TextureAsset); | ||||
|                         } | ||||
| 
 | ||||
| 
 | ||||
|                     } | ||||
|                 } | ||||
|                 if (cacheItems != null) | ||||
|                 { | ||||
| 
 | ||||
|                     for (int i = 0; i < maxWearablesLoop; i++) | ||||
|                     { | ||||
|                         WearableCacheItem item = | ||||
|                             WearableCacheItem.SearchTextureIndex(cachedtex.WearableData[i].TextureIndex,cacheItems); | ||||
| 
 | ||||
|                         cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||||
|                         cachedresp.WearableData[i].TextureIndex= cachedtex.WearableData[i].TextureIndex; | ||||
|                         cachedresp.WearableData[i].HostName = new byte[0]; | ||||
|                         if (item != null && cachedtex.WearableData[i].ID == item.CacheId) | ||||
|                         { | ||||
| 
 | ||||
|                             cachedresp.WearableData[i].TextureID = item.TextureID; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             cachedresp.WearableData[i].TextureID = UUID.Zero; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     for (int i = 0; i < maxWearablesLoop; i++) | ||||
|                     { | ||||
|                         cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||||
|                         cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | ||||
|                         cachedresp.WearableData[i].TextureID = UUID.Zero; | ||||
|                         //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46"); | ||||
|                         cachedresp.WearableData[i].HostName = new byte[0]; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (cache == null) | ||||
|                 { | ||||
|                     for (int i = 0; i < maxWearablesLoop; i++) | ||||
|                     { | ||||
|                         cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||||
|                         cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | ||||
|                         cachedresp.WearableData[i].TextureID = UUID.Zero; | ||||
|                             //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46"); | ||||
|                         cachedresp.WearableData[i].HostName = new byte[0]; | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     for (int i = 0; i < maxWearablesLoop; i++) | ||||
|                     { | ||||
|                         cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||||
|                         cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|                         if (cache.GetCached(cachedresp.WearableData[i].TextureID.ToString()) == null) | ||||
|                             cachedresp.WearableData[i].TextureID = UUID.Zero; | ||||
|                             //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46"); | ||||
|                         else | ||||
|                             cachedresp.WearableData[i].TextureID = UUID.Zero; | ||||
|                                 // UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46"); | ||||
|                         cachedresp.WearableData[i].HostName = new byte[0]; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             cachedresp.Header.Zerocoded = true; | ||||
|             OutPacket(cachedresp, ThrottleOutPacketType.Task); | ||||
| 
 | ||||
|             return true; | ||||
|         } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Melanie
						Melanie