diff options
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | 72 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs | 22 |
2 files changed, 63 insertions, 31 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index e8aee3e..d64a0c1 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -156,7 +156,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
156 | changed = sp.Appearance.SetTextureEntries(textureEntry) || changed; | 156 | changed = sp.Appearance.SetTextureEntries(textureEntry) || changed; |
157 | 157 | ||
158 | // WriteBakedTexturesReport(sp, m_log.DebugFormat); | 158 | // WriteBakedTexturesReport(sp, m_log.DebugFormat); |
159 | ValidateBakedTextureCache(sp, false); | 159 | if (!ValidateBakedTextureCache(sp)) |
160 | RequestRebake(sp, true); | ||
160 | 161 | ||
161 | // This appears to be set only in the final stage of the appearance | 162 | // This appears to be set only in the final stage of the appearance |
162 | // update transaction. In theory, we should be able to do an immediate | 163 | // update transaction. In theory, we should be able to do an immediate |
@@ -251,15 +252,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
251 | } | 252 | } |
252 | 253 | ||
253 | /// <summary> | 254 | /// <summary> |
254 | /// Check for the existence of the baked texture assets. | ||
255 | /// </summary> | ||
256 | /// <param name="sp"></param> | ||
257 | public bool ValidateBakedTextureCache(IScenePresence sp) | ||
258 | { | ||
259 | return ValidateBakedTextureCache(sp, true); | ||
260 | } | ||
261 | |||
262 | /// <summary> | ||
263 | /// Queue up a request to send appearance. | 255 | /// Queue up a request to send appearance. |
264 | /// </summary> | 256 | /// </summary> |
265 | /// <remarks> | 257 | /// <remarks> |
@@ -292,17 +284,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
292 | } | 284 | } |
293 | } | 285 | } |
294 | 286 | ||
295 | #endregion | 287 | public bool ValidateBakedTextureCache(IScenePresence sp) |
296 | |||
297 | #region AvatarFactoryModule private methods | ||
298 | |||
299 | /// <summary> | ||
300 | /// Check for the existence of the baked texture assets. Request a rebake | ||
301 | /// unless checkonly is true. | ||
302 | /// </summary> | ||
303 | /// <param name="client"></param> | ||
304 | /// <param name="checkonly"></param> | ||
305 | private bool ValidateBakedTextureCache(IScenePresence sp, bool checkonly) | ||
306 | { | 288 | { |
307 | bool defonly = true; // are we only using default textures | 289 | bool defonly = true; // are we only using default textures |
308 | 290 | ||
@@ -330,16 +312,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
330 | defonly = false; // found a non-default texture reference | 312 | defonly = false; // found a non-default texture reference |
331 | 313 | ||
332 | if (m_scene.AssetService.Get(face.TextureID.ToString()) == null) | 314 | if (m_scene.AssetService.Get(face.TextureID.ToString()) == null) |
333 | { | 315 | return false; |
334 | if (checkonly) | ||
335 | return false; | ||
336 | |||
337 | m_log.DebugFormat( | ||
338 | "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", | ||
339 | face.TextureID, idx, sp.Name); | ||
340 | |||
341 | sp.ControllingClient.SendRebakeAvatarTextures(face.TextureID); | ||
342 | } | ||
343 | } | 316 | } |
344 | 317 | ||
345 | m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0}", sp.UUID); | 318 | m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0}", sp.UUID); |
@@ -348,6 +321,43 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
348 | return (defonly ? false : true); | 321 | return (defonly ? false : true); |
349 | } | 322 | } |
350 | 323 | ||
324 | public void RequestRebake(IScenePresence sp, bool missingTexturesOnly) | ||
325 | { | ||
326 | for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) | ||
327 | { | ||
328 | int idx = AvatarAppearance.BAKE_INDICES[i]; | ||
329 | Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx]; | ||
330 | |||
331 | // if there is no texture entry, skip it | ||
332 | if (face == null) | ||
333 | continue; | ||
334 | |||
335 | // m_log.DebugFormat( | ||
336 | // "[AVFACTORY]: Looking for texture {0}, id {1} for {2} {3}", | ||
337 | // face.TextureID, idx, client.Name, client.AgentId); | ||
338 | |||
339 | // if the texture is one of the "defaults" then skip it | ||
340 | // this should probably be more intelligent (skirt texture doesnt matter | ||
341 | // if the avatar isnt wearing a skirt) but if any of the main baked | ||
342 | // textures is default then the rest should be as well | ||
343 | if (face.TextureID == UUID.Zero || face.TextureID == AppearanceManager.DEFAULT_AVATAR_TEXTURE) | ||
344 | continue; | ||
345 | |||
346 | if (missingTexturesOnly && m_scene.AssetService.Get(face.TextureID.ToString()) != null) | ||
347 | continue; | ||
348 | else | ||
349 | m_log.DebugFormat( | ||
350 | "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", | ||
351 | face.TextureID, idx, sp.Name); | ||
352 | |||
353 | sp.ControllingClient.SendRebakeAvatarTextures(face.TextureID); | ||
354 | } | ||
355 | } | ||
356 | |||
357 | #endregion | ||
358 | |||
359 | #region AvatarFactoryModule private methods | ||
360 | |||
351 | private Dictionary<BakeType, Primitive.TextureEntryFace> GetBakedTextureFaces(ScenePresence sp) | 361 | private Dictionary<BakeType, Primitive.TextureEntryFace> GetBakedTextureFaces(ScenePresence sp) |
352 | { | 362 | { |
353 | if (sp.IsChildAgent) | 363 | if (sp.IsChildAgent) |
diff --git a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs index 8670229..04df9c3 100644 --- a/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs | |||
@@ -61,7 +61,29 @@ namespace OpenSim.Region.Framework.Interfaces | |||
61 | /// <returns>true if a valid agent was found, false otherwise</returns> | 61 | /// <returns>true if a valid agent was found, false otherwise</returns> |
62 | bool SaveBakedTextures(UUID agentId); | 62 | bool SaveBakedTextures(UUID agentId); |
63 | 63 | ||
64 | /// <summary> | ||
65 | /// Validate that OpenSim can find the baked textures need to display a given avatar | ||
66 | /// </summary> | ||
67 | /// <param name="client"></param> | ||
68 | /// <param name="checkonly"></param> | ||
69 | /// <returns> | ||
70 | /// true if all the baked textures referenced by the texture IDs exist or the appearance is only using default textures. false otherwise. | ||
71 | /// </returns> | ||
64 | bool ValidateBakedTextureCache(IScenePresence sp); | 72 | bool ValidateBakedTextureCache(IScenePresence sp); |
73 | |||
74 | /// <summary> | ||
75 | /// Request a rebake of textures for an avatar. | ||
76 | /// </summary> | ||
77 | /// <remarks> | ||
78 | /// This will send the request to the viewer, since it's there that the rebake is done. | ||
79 | /// </remarks> | ||
80 | /// <param name="sp">Avatar to rebake.</param> | ||
81 | /// <param name="missingTexturesOnly"> | ||
82 | /// If true, only request a rebake for the textures that are missing. | ||
83 | /// If false then we request a rebake of all textures for which we already have references. | ||
84 | /// </param> | ||
85 | void RequestRebake(IScenePresence sp, bool missingTexturesOnly); | ||
86 | |||
65 | void QueueAppearanceSend(UUID agentid); | 87 | void QueueAppearanceSend(UUID agentid); |
66 | void QueueAppearanceSave(UUID agentid); | 88 | void QueueAppearanceSave(UUID agentid); |
67 | 89 | ||