aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs59
1 files changed, 59 insertions, 0 deletions
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
55 55
56 private int m_savetime = 5; // seconds to wait before saving changed appearance 56 private int m_savetime = 5; // seconds to wait before saving changed appearance
57 private int m_sendtime = 2; // seconds to wait before sending changed appearance 57 private int m_sendtime = 2; // seconds to wait before sending changed appearance
58 private bool m_reusetextures = false;
58 59
59 private int m_checkTime = 500; // milliseconds to wait between checks for appearance updates 60 private int m_checkTime = 500; // milliseconds to wait between checks for appearance updates
60 private System.Timers.Timer m_updateTimer = new System.Timers.Timer(); 61 private System.Timers.Timer m_updateTimer = new System.Timers.Timer();
@@ -73,6 +74,8 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
73 { 74 {
74 m_savetime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime))); 75 m_savetime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime)));
75 m_sendtime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime))); 76 m_sendtime = Convert.ToInt32(appearanceConfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime)));
77 m_reusetextures = appearanceConfig.GetBoolean("ReuseTextures",m_reusetextures);
78
76 // m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime); 79 // m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime);
77 } 80 }
78 81
@@ -131,6 +134,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
131 client.OnRequestWearables += Client_OnRequestWearables; 134 client.OnRequestWearables += Client_OnRequestWearables;
132 client.OnSetAppearance += Client_OnSetAppearance; 135 client.OnSetAppearance += Client_OnSetAppearance;
133 client.OnAvatarNowWearing += Client_OnAvatarNowWearing; 136 client.OnAvatarNowWearing += Client_OnAvatarNowWearing;
137 client.OnCachedTextureRequest += Client_OnCachedTextureRequest;
134 } 138 }
135 139
136 #endregion 140 #endregion
@@ -671,6 +675,61 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
671 QueueAppearanceSave(client.AgentId); 675 QueueAppearanceSave(client.AgentId);
672 } 676 }
673 } 677 }
678
679 /// <summary>
680 /// Respond to the cached textures request from the client
681 /// </summary>
682 /// <param name="client"></param>
683 /// <param name="serial"></param>
684 /// <param name="cachedTextureRequest"></param>
685 private void Client_OnCachedTextureRequest(IClientAPI client, int serial, List<CachedTextureRequestArg> cachedTextureRequest)
686 {
687 // m_log.WarnFormat("[AVFACTORY]: Client_OnCachedTextureRequest called for {0} ({1})", client.Name, client.AgentId);
688 ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
689
690 List<CachedTextureResponseArg> cachedTextureResponse = new List<CachedTextureResponseArg>();
691 foreach (CachedTextureRequestArg request in cachedTextureRequest)
692 {
693 UUID texture = UUID.Zero;
694 int index = request.BakedTextureIndex;
695
696 if (m_reusetextures)
697 {
698 // this is the most insanely dumb way to do this... however it seems to
699 // actually work. if the appearance has been reset because wearables have
700 // changed then the texture entries are zero'd out until the bakes are
701 // uploaded. on login, if the textures exist in the cache (eg if you logged
702 // into the simulator recently, then the appearance will pull those and send
703 // them back in the packet and you won't have to rebake. if the textures aren't
704 // in the cache then the intial makeroot() call in scenepresence will zero
705 // them out.
706 //
707 // a better solution (though how much better is an open question) is to
708 // store the hashes in the appearance and compare them. Thats's coming.
709
710 Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[index];
711 if (face != null)
712 texture = face.TextureID;
713
714 // m_log.WarnFormat("[AVFACTORY]: reuse texture {0} for index {1}",texture,index);
715 }
716
717 CachedTextureResponseArg response = new CachedTextureResponseArg();
718 response.BakedTextureIndex = index;
719 response.BakedTextureID = texture;
720 response.HostName = null;
721
722 cachedTextureResponse.Add(response);
723 }
724
725 // m_log.WarnFormat("[AVFACTORY]: serial is {0}",serial);
726 // The serial number appears to be used to match requests and responses
727 // in the texture transaction. We just send back the serial number
728 // that was provided in the request. The viewer bumps this for us.
729 client.SendCachedTextureResponse(sp, serial, cachedTextureResponse);
730 }
731
732
674 #endregion 733 #endregion
675 734
676 public void WriteBakedTexturesReport(IScenePresence sp, ReportOutputAction outputAction) 735 public void WriteBakedTexturesReport(IScenePresence sp, ReportOutputAction outputAction)