From 33aaa40bee37ca4d8a3afa10fbbea7c1be3a1d58 Mon Sep 17 00:00:00 2001
From: Mic Bowman
Date: Wed, 8 May 2013 13:13:51 -0700
Subject: Adds an event and a method so that handling of the CachedTexture
packet can be pulled out of LLClientView and moved to AvatarFactory. The
first pass at reusing textures (turned off by default) is included. When
reusing textures, if the baked textures from a previous login are still in
the asset service (which generally means that they are in the simulator's
cache) then the avatar will not need to rebake. This is both a performance
improvement (specifically that an avatars baked textures do not need to be
sent to other users who have the old textures cached) and a resource
improvement (don't have to deal with duplicate bakes in the asset service
cache).
---
.../Avatar/AvatarFactory/AvatarFactoryModule.cs | 59 ++++++++++++++++++++++
1 file changed, 59 insertions(+)
(limited to 'OpenSim/Region/CoreModules/Avatar/AvatarFactory')
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index c7ac7c4..b640b48 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -55,6 +55,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
private int m_savetime = 5; // seconds to wait before saving changed appearance
private int m_sendtime = 2; // seconds to wait before sending changed appearance
+ private bool m_reusetextures = false;
private int m_checkTime = 500; // milliseconds to wait between checks for appearance updates
private System.Timers.Timer m_updateTimer = new System.Timers.Timer();
@@ -73,6 +74,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
{
m_savetime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime)));
m_sendtime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime)));
+ m_reusetextures = appearanceConfig.GetBoolean("ReuseTextures",m_reusetextures);
+
// m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime);
}
@@ -131,6 +134,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
client.OnRequestWearables += Client_OnRequestWearables;
client.OnSetAppearance += Client_OnSetAppearance;
client.OnAvatarNowWearing += Client_OnAvatarNowWearing;
+ client.OnCachedTextureRequest += Client_OnCachedTextureRequest;
}
#endregion
@@ -671,6 +675,61 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
QueueAppearanceSave(client.AgentId);
}
}
+
+ ///
+ /// Respond to the cached textures request from the client
+ ///
+ ///
+ ///
+ ///
+ private void Client_OnCachedTextureRequest(IClientAPI client, int serial, List cachedTextureRequest)
+ {
+ // m_log.WarnFormat("[AVFACTORY]: Client_OnCachedTextureRequest called for {0} ({1})", client.Name, client.AgentId);
+ ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
+
+ List cachedTextureResponse = new List();
+ foreach (CachedTextureRequestArg request in cachedTextureRequest)
+ {
+ UUID texture = UUID.Zero;
+ int index = request.BakedTextureIndex;
+
+ if (m_reusetextures)
+ {
+ // this is the most insanely dumb way to do this... however it seems to
+ // actually work. if the appearance has been reset because wearables have
+ // changed then the texture entries are zero'd out until the bakes are
+ // uploaded. on login, if the textures exist in the cache (eg if you logged
+ // into the simulator recently, then the appearance will pull those and send
+ // them back in the packet and you won't have to rebake. if the textures aren't
+ // in the cache then the intial makeroot() call in scenepresence will zero
+ // them out.
+ //
+ // a better solution (though how much better is an open question) is to
+ // store the hashes in the appearance and compare them. Thats's coming.
+
+ Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[index];
+ if (face != null)
+ texture = face.TextureID;
+
+ // m_log.WarnFormat("[AVFACTORY]: reuse texture {0} for index {1}",texture,index);
+ }
+
+ CachedTextureResponseArg response = new CachedTextureResponseArg();
+ response.BakedTextureIndex = index;
+ response.BakedTextureID = texture;
+ response.HostName = null;
+
+ cachedTextureResponse.Add(response);
+ }
+
+ // m_log.WarnFormat("[AVFACTORY]: serial is {0}",serial);
+ // The serial number appears to be used to match requests and responses
+ // in the texture transaction. We just send back the serial number
+ // that was provided in the request. The viewer bumps this for us.
+ client.SendCachedTextureResponse(sp, serial, cachedTextureResponse);
+ }
+
+
#endregion
public void WriteBakedTexturesReport(IScenePresence sp, ReportOutputAction outputAction)
--
cgit v1.1