aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs72
-rw-r--r--OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs22
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