aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs140
1 files changed, 136 insertions, 4 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
index 3b0ccd7..6778ba5 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic;
30using System.Collections.Specialized; 31using System.Collections.Specialized;
31using System.Drawing; 32using System.Drawing;
32using System.Drawing.Imaging; 33using System.Drawing.Imaging;
@@ -53,8 +54,8 @@ namespace OpenSim.Region.ClientStack.Linden
53 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UploadBakedTextureModule")] 54 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UploadBakedTextureModule")]
54 public class UploadBakedTextureModule : INonSharedRegionModule 55 public class UploadBakedTextureModule : INonSharedRegionModule
55 { 56 {
56// private static readonly ILog m_log = 57 private static readonly ILog m_log =
57// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 58 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
58 59
59 /// <summary> 60 /// <summary>
60 /// For historical reasons this is fixed, but there 61 /// For historical reasons this is fixed, but there
@@ -64,31 +65,154 @@ namespace OpenSim.Region.ClientStack.Linden
64 private Scene m_scene; 65 private Scene m_scene;
65 private bool m_persistBakedTextures; 66 private bool m_persistBakedTextures;
66 67
68 private IBakedTextureModule m_BakedTextureModule;
69
67 public void Initialise(IConfigSource source) 70 public void Initialise(IConfigSource source)
68 { 71 {
69 IConfig appearanceConfig = source.Configs["Appearance"]; 72 IConfig appearanceConfig = source.Configs["Appearance"];
70 if (appearanceConfig != null) 73 if (appearanceConfig != null)
71 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures); 74 m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures);
75
76
72 } 77 }
73 78
74 public void AddRegion(Scene s) 79 public void AddRegion(Scene s)
75 { 80 {
76 m_scene = s; 81 m_scene = s;
82
77 } 83 }
78 84
79 public void RemoveRegion(Scene s) 85 public void RemoveRegion(Scene s)
80 { 86 {
87 s.EventManager.OnRegisterCaps -= RegisterCaps;
88 s.EventManager.OnNewPresence -= RegisterNewPresence;
89 s.EventManager.OnRemovePresence -= DeRegisterPresence;
90 m_BakedTextureModule = null;
91 m_scene = null;
81 } 92 }
82 93
94
95
83 public void RegionLoaded(Scene s) 96 public void RegionLoaded(Scene s)
84 { 97 {
85 m_scene.EventManager.OnRegisterCaps += RegisterCaps; 98 m_scene.EventManager.OnRegisterCaps += RegisterCaps;
99 m_scene.EventManager.OnNewPresence += RegisterNewPresence;
100 m_scene.EventManager.OnRemovePresence += DeRegisterPresence;
101
102 }
103
104 private void DeRegisterPresence(UUID agentId)
105 {
106 ScenePresence presence = null;
107 if (m_scene.TryGetScenePresence(agentId, out presence))
108 {
109 presence.ControllingClient.OnSetAppearance -= CaptureAppearanceSettings;
110 }
111
112 }
113
114 private void RegisterNewPresence(ScenePresence presence)
115 {
116 presence.ControllingClient.OnSetAppearance += CaptureAppearanceSettings;
117
118 }
119
120 private void CaptureAppearanceSettings(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 avSize, WearableCacheItem[] cacheItems)
121 {
122 m_BakedTextureModule = m_scene.RequestModuleInterface<IBakedTextureModule>();
123 if (cacheItems.Length > 0)
124 {
125 m_log.Info("[Cacheitems]: " + cacheItems.Length);
126 for (int iter = 0; iter < cacheItems.Length; iter++)
127 {
128 m_log.Info("[Cacheitems] {" + iter + "/" + cacheItems[iter].TextureIndex + "}: c-" + cacheItems[iter].CacheId + ", t-" +
129 cacheItems[iter].TextureID);
130 }
131
132 ScenePresence p = null;
133 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out p))
134 {
135
136 WearableCacheItem[] existingitems = p.Appearance.WearableCacheItems;
137 if (existingitems == null)
138 {
139 if (m_BakedTextureModule != null)
140 {
141 WearableCacheItem[] savedcache = null;
142 try
143 {
144 if (p.Appearance.WearableCacheItemsDirty)
145 {
146 savedcache = m_BakedTextureModule.Get(p.UUID);
147 p.Appearance.WearableCacheItems = savedcache;
148 p.Appearance.WearableCacheItemsDirty = false;
149 }
150
151 }
152 catch (InvalidOperationException)
153 {
154 }
155
156 if (savedcache != null)
157 existingitems = savedcache;
158 }
159 }
160 // Existing items null means it's a fully new appearance
161 if (existingitems == null)
162 {
163
164 for (int iter = 0; iter < cacheItems.Length; iter++)
165 {
166
167 cacheItems[iter].TextureID = textureEntry.FaceTextures[cacheItems[iter].TextureIndex].TextureID;
168 if (m_scene.AssetService != null)
169 cacheItems[iter].TextureAsset = m_scene.AssetService.GetCached(cacheItems[iter].TextureID.ToString());
170
171
172 }
173 }
174 else
175
176
177 {
178 // for each uploaded baked texture
179 for (int i = 0; i < cacheItems.Length; i++)
180 {
181 cacheItems[i].TextureID =
182 textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID;
183 }
184
185 for (int i = 0; i < cacheItems.Length; i++)
186 {
187 if (cacheItems[i].TextureAsset == null)
188 {
189 cacheItems[i].TextureAsset = m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString());
190 }
191 }
192 }
193
194
195
196 p.Appearance.WearableCacheItems = cacheItems;
197
198
199
200 if (m_BakedTextureModule != null)
201 {
202 m_BakedTextureModule.Store(remoteClient.AgentId, cacheItems);
203 p.Appearance.WearableCacheItemsDirty = true;
204
205 }
206 }
207 }
86 } 208 }
87 209
88 public void PostInitialise() 210 public void PostInitialise()
89 { 211 {
90 } 212 }
91 213
214
215
92 public void Close() { } 216 public void Close() { }
93 217
94 public string Name { get { return "UploadBakedTextureModule"; } } 218 public string Name { get { return "UploadBakedTextureModule"; } }
@@ -100,15 +224,23 @@ namespace OpenSim.Region.ClientStack.Linden
100 224
101 public void RegisterCaps(UUID agentID, Caps caps) 225 public void RegisterCaps(UUID agentID, Caps caps)
102 { 226 {
227 UploadBakedTextureHandler avatarhandler = new UploadBakedTextureHandler(
228 caps, m_scene.AssetService, m_persistBakedTextures);
229
230
231
103 caps.RegisterHandler( 232 caps.RegisterHandler(
104 "UploadBakedTexture", 233 "UploadBakedTexture",
105 new RestStreamHandler( 234 new RestStreamHandler(
106 "POST", 235 "POST",
107 "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath, 236 "/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath,
108 new UploadBakedTextureHandler( 237 avatarhandler.UploadBakedTexture,
109 caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture,
110 "UploadBakedTexture", 238 "UploadBakedTexture",
111 agentID.ToString())); 239 agentID.ToString()));
240
241
242
243
112 } 244 }
113 } 245 }
114} \ No newline at end of file 246} \ No newline at end of file