aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs24
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs22
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs72
-rw-r--r--OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs81
-rw-r--r--OpenSim/Region/Framework/Interfaces/IAvatarFactoryModule.cs22
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs24
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs8
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs40
11 files changed, 225 insertions, 75 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
index cb9692a..185a909 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
@@ -102,7 +102,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
102 { 102 {
103 m_currentPacket = 2; 103 m_currentPacket = 2;
104 } 104 }
105 105
106 while (sendMore && packetsSent < packetsToSend && m_currentPacket <= m_stopPacket) 106 while (sendMore && packetsSent < packetsToSend && m_currentPacket <= m_stopPacket)
107 { 107 {
108 sendMore = SendPacket(client); 108 sendMore = SendPacket(client);
@@ -114,17 +114,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
114 return (m_currentPacket > m_stopPacket); 114 return (m_currentPacket > m_stopPacket);
115 } 115 }
116 116
117 /// <summary>
118 /// This is where we decide what we need to update
119 /// and assign the real discardLevel and packetNumber
120 /// assuming of course that the connected client might be bonkers
121 /// </summary>
117 public void RunUpdate() 122 public void RunUpdate()
118 { 123 {
119 //This is where we decide what we need to update
120 //and assign the real discardLevel and packetNumber
121 //assuming of course that the connected client might be bonkers
122
123 if (!HasAsset) 124 if (!HasAsset)
124 { 125 {
125 if (!m_assetRequested) 126 if (!m_assetRequested)
126 { 127 {
127 m_assetRequested = true; 128 m_assetRequested = true;
129// m_log.DebugFormat("[J2KIMAGE]: Requesting asset {0}", TextureID);
128 AssetService.Get(TextureID.ToString(), this, AssetReceived); 130 AssetService.Get(TextureID.ToString(), this, AssetReceived);
129 } 131 }
130 } 132 }
@@ -137,6 +139,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
137 { 139 {
138 //Request decode 140 //Request decode
139 m_decodeRequested = true; 141 m_decodeRequested = true;
142
143// m_log.DebugFormat("[J2KIMAGE]: Requesting decode of asset {0}", TextureID);
144
140 // Do we have a jpeg decoder? 145 // Do we have a jpeg decoder?
141 if (J2KDecoder != null) 146 if (J2KDecoder != null)
142 { 147 {
@@ -149,7 +154,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
149 // Send it off to the jpeg decoder 154 // Send it off to the jpeg decoder
150 J2KDecoder.BeginDecode(TextureID, m_asset, J2KDecodedCallback); 155 J2KDecoder.BeginDecode(TextureID, m_asset, J2KDecodedCallback);
151 } 156 }
152
153 } 157 }
154 else 158 else
155 { 159 {
@@ -328,14 +332,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
328 { 332 {
329 if (m_currentPacket == 0) 333 if (m_currentPacket == 0)
330 return 0; 334 return 0;
335
331 if (m_currentPacket == 1) 336 if (m_currentPacket == 1)
332 return FIRST_PACKET_SIZE; 337 return FIRST_PACKET_SIZE;
333 338
334 int result = FIRST_PACKET_SIZE + ((int)m_currentPacket - 2) * IMAGE_PACKET_SIZE; 339 int result = FIRST_PACKET_SIZE + ((int)m_currentPacket - 2) * IMAGE_PACKET_SIZE;
340
335 if (result < 0) 341 if (result < 0)
336 {
337 result = FIRST_PACKET_SIZE; 342 result = FIRST_PACKET_SIZE;
338 } 343
339 return result; 344 return result;
340 } 345 }
341 346
@@ -374,7 +379,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
374 { 379 {
375 UUID assetID = UUID.Zero; 380 UUID assetID = UUID.Zero;
376 if (asset != null) 381 if (asset != null)
382 {
377 assetID = asset.FullID; 383 assetID = asset.FullID;
384 }
378 else if ((InventoryAccessModule != null) && (sender != InventoryAccessModule)) 385 else if ((InventoryAccessModule != null) && (sender != InventoryAccessModule))
379 { 386 {
380 // Unfortunately we need this here, there's no other way. 387 // Unfortunately we need this here, there's no other way.
@@ -395,7 +402,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
395 } 402 }
396 403
397 AssetDataCallback(assetID, asset); 404 AssetDataCallback(assetID, asset);
398
399 } 405 }
400 } 406 }
401} 407}
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index b37fd54..eb1a50e 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -348,7 +348,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
348 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); 348 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>();
349 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers 349 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
350 protected Scene m_scene; 350 protected Scene m_scene;
351 protected LLImageManager m_imageManager; 351 private LLImageManager m_imageManager;
352 protected string m_firstName; 352 protected string m_firstName;
353 protected string m_lastName; 353 protected string m_lastName;
354 protected Thread m_clientThread; 354 protected Thread m_clientThread;
@@ -499,8 +499,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
499 IsActive = false; 499 IsActive = false;
500 500
501 // Shutdown the image manager 501 // Shutdown the image manager
502 if (m_imageManager != null) 502 m_imageManager.Close();
503 m_imageManager.Close();
504 503
505 // Fire the callback for this connection closing 504 // Fire the callback for this connection closing
506 if (OnConnectionClosed != null) 505 if (OnConnectionClosed != null)
@@ -578,7 +577,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
578 /// Add a handler for the given packet type. 577 /// Add a handler for the given packet type.
579 /// </summary> 578 /// </summary>
580 /// <remarks> 579 /// <remarks>
581 /// The packet is handled on its own thread. If packets must be handled in the order in which thye 580 /// The packet is handled on its own thread. If packets must be handled in the order in which they
582 /// are received then please use the synchronous version of this method. 581 /// are received then please use the synchronous version of this method.
583 /// </remarks> 582 /// </remarks>
584 /// <param name="packetType"></param> 583 /// <param name="packetType"></param>
@@ -3940,14 +3939,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3940 } 3939 }
3941 3940
3942 if ((categories & ThrottleOutPacketTypeFlags.Texture) != 0) 3941 if ((categories & ThrottleOutPacketTypeFlags.Texture) != 0)
3943 {
3944 ProcessTextureRequests();
3945 }
3946 }
3947
3948 void ProcessTextureRequests()
3949 {
3950 if (m_imageManager != null)
3951 m_imageManager.ProcessImageQueue(m_udpServer.TextureSendLimit); 3942 m_imageManager.ProcessImageQueue(m_udpServer.TextureSendLimit);
3952 } 3943 }
3953 3944
@@ -7479,12 +7470,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
7479 if ((ImageType)block.Type == ImageType.Baked) 7470 if ((ImageType)block.Type == ImageType.Baked)
7480 args.Priority *= 2.0f; 7471 args.Priority *= 2.0f;
7481 7472
7482 // in the end, we null this, so we have to check if it's null 7473 m_imageManager.EnqueueReq(args);
7483 if (m_imageManager != null)
7484 {
7485 m_imageManager.EnqueueReq(args);
7486 }
7487 } 7474 }
7475
7488 return true; 7476 return true;
7489 } 7477 }
7490 7478
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
index e3a881f..3e31b7d 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
@@ -84,7 +84,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
84 /// <param name="newRequest"></param> 84 /// <param name="newRequest"></param>
85 public void EnqueueReq(TextureRequestArgs newRequest) 85 public void EnqueueReq(TextureRequestArgs newRequest)
86 { 86 {
87 //Make sure we're not shutting down..
88 if (!m_shuttingdown) 87 if (!m_shuttingdown)
89 { 88 {
90 J2KImage imgrequest; 89 J2KImage imgrequest;
@@ -99,19 +98,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP
99 { 98 {
100 //m_log.Debug("[TEX]: (CAN) ID=" + newRequest.RequestedAssetID); 99 //m_log.Debug("[TEX]: (CAN) ID=" + newRequest.RequestedAssetID);
101 100
102 try 101 try
103 { 102 {
104 lock (m_syncRoot) 103 lock (m_syncRoot)
105 m_priorityQueue.Delete(imgrequest.PriorityQueueHandle); 104 m_priorityQueue.Delete(imgrequest.PriorityQueueHandle);
106 } 105 }
107 catch (Exception) { } 106 catch (Exception) { }
108 } 107 }
109 else 108 else
110 { 109 {
110// m_log.DebugFormat(
111// "[LL IMAGE MANAGER]: Received duplicate of existing request for {0}, start packet {1} from {2}",
112// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name);
113
111 //m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}", 114 //m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}",
112 // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); 115 // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority);
113 116
114 //Check the packet sequence to make sure this isn't older than 117 //Check the packet sequence to make sure this isn't older than
115 //one we've already received 118 //one we've already received
116 if (newRequest.requestSequence > imgrequest.LastSequence) 119 if (newRequest.requestSequence > imgrequest.LastSequence)
117 { 120 {
@@ -126,11 +129,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP
126 129
127 //Update the requested priority 130 //Update the requested priority
128 imgrequest.Priority = newRequest.Priority; 131 imgrequest.Priority = newRequest.Priority;
132
129 UpdateImageInQueue(imgrequest); 133 UpdateImageInQueue(imgrequest);
130 134
131 //Run an update
132 imgrequest.RunUpdate(); 135 imgrequest.RunUpdate();
136
137// J2KImage imgrequest2 = new J2KImage(this);
138// imgrequest2.J2KDecoder = m_j2kDecodeModule;
139// imgrequest2.AssetService = m_assetCache;
140// imgrequest2.AgentID = m_client.AgentId;
141// imgrequest2.InventoryAccessModule = m_client.Scene.RequestModuleInterface<IInventoryAccessModule>();
142// imgrequest2.DiscardLevel = newRequest.DiscardLevel;
143// imgrequest2.StartPacket = Math.Max(1, newRequest.PacketNumber);
144// imgrequest2.Priority = newRequest.Priority;
145// imgrequest2.TextureID = newRequest.RequestedAssetID;
146// imgrequest2.Priority = newRequest.Priority;
147//
148// //Add this download to the priority queue
149// AddImageToQueue(imgrequest2);
150//
151// imgrequest2.RunUpdate();
152
133 } 153 }
154// else
155// {
156// m_log.DebugFormat(
157// "[LL IMAGE MANAGER]: Ignoring duplicate of existing request for {0} (sequence {1}) from {2} as its request sequence {3} is not greater",
158// newRequest.RequestedAssetID, imgrequest.LastSequence, m_client.Name, newRequest.requestSequence);
159// }
134 } 160 }
135 } 161 }
136 else 162 else
@@ -142,6 +168,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
142 } 168 }
143 else 169 else
144 { 170 {
171// m_log.DebugFormat(
172// "[LL IMAGE MANAGER]: Received request for {0}, start packet {1} from {2}",
173// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name);
174
145 //m_log.DebugFormat("[TEX]: (NEW) ID={0}: D={1}, S={2}, P={3}", 175 //m_log.DebugFormat("[TEX]: (NEW) ID={0}: D={1}, S={2}, P={3}",
146 // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority); 176 // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority);
147 177
@@ -159,7 +189,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
159 //Add this download to the priority queue 189 //Add this download to the priority queue
160 AddImageToQueue(imgrequest); 190 AddImageToQueue(imgrequest);
161 191
162 //Run an update
163 imgrequest.RunUpdate(); 192 imgrequest.RunUpdate();
164 } 193 }
165 } 194 }
@@ -176,7 +205,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
176 205
177 // If null was returned, the texture priority queue is currently empty 206 // If null was returned, the texture priority queue is currently empty
178 if (image == null) 207 if (image == null)
179 return false; 208 break;
180 209
181 if (image.IsDecoded) 210 if (image.IsDecoded)
182 { 211 {
@@ -194,10 +223,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
194 // written. Undecoded textures should not be going into the priority 223 // written. Undecoded textures should not be going into the priority
195 // queue, because a high priority undecoded texture will clog up the 224 // queue, because a high priority undecoded texture will clog up the
196 // pipeline for a client 225 // pipeline for a client
197 return true; 226// m_log.DebugFormat(
227// "[LL IMAGE MANAGER]: Exiting image queue processing early on encountering undecoded image {0}",
228// image.TextureID);
229
230 break;
198 } 231 }
199 } 232 }
200 233
234// if (packetsSent != 0)
235// m_log.DebugFormat("[LL IMAGE MANAGER]: Processed {0} packets from image queue", packetsSent);
236
201 return m_priorityQueue.Count > 0; 237 return m_priorityQueue.Count > 0;
202 } 238 }
203 239
@@ -219,7 +255,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
219 { 255 {
220 if (m_priorityQueue.Count > 0) 256 if (m_priorityQueue.Count > 0)
221 { 257 {
222 try { image = m_priorityQueue.FindMax(); } 258 try
259 {
260 image = m_priorityQueue.FindMax();
261 }
223 catch (Exception) { } 262 catch (Exception) { }
224 } 263 }
225 } 264 }
@@ -232,7 +271,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
232 271
233 lock (m_syncRoot) 272 lock (m_syncRoot)
234 { 273 {
235 try { m_priorityQueue.Add(ref image.PriorityQueueHandle, image); } 274 try
275 {
276 m_priorityQueue.Add(ref image.PriorityQueueHandle, image);
277 }
236 catch (Exception) { } 278 catch (Exception) { }
237 } 279 }
238 } 280 }
@@ -241,7 +283,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
241 { 283 {
242 lock (m_syncRoot) 284 lock (m_syncRoot)
243 { 285 {
244 try { m_priorityQueue.Delete(image.PriorityQueueHandle); } 286 try
287 {
288 m_priorityQueue.Delete(image.PriorityQueueHandle);
289 }
245 catch (Exception) { } 290 catch (Exception) { }
246 } 291 }
247 } 292 }
@@ -250,7 +295,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
250 { 295 {
251 lock (m_syncRoot) 296 lock (m_syncRoot)
252 { 297 {
253 try { m_priorityQueue.Replace(image.PriorityQueueHandle, image); } 298 try
299 {
300 m_priorityQueue.Replace(image.PriorityQueueHandle, image);
301 }
254 catch (Exception) 302 catch (Exception)
255 { 303 {
256 image.PriorityQueueHandle = null; 304 image.PriorityQueueHandle = null;
diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
index 7dd9087..14dee84 100644
--- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
@@ -103,6 +103,10 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
103 // If it's cached, return the cached results 103 // If it's cached, return the cached results
104 if (m_decodedCache.TryGetValue(assetID, out result)) 104 if (m_decodedCache.TryGetValue(assetID, out result))
105 { 105 {
106// m_log.DebugFormat(
107// "[J2KDecoderModule]: Returning existing cached {0} layers j2k decode for {1}",
108// result.Length, assetID);
109
106 callback(assetID, result); 110 callback(assetID, result);
107 } 111 }
108 else 112 else
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index e8aee3e..9df0592 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,52 @@ 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)
347 {
348 if (m_scene.AssetService.Get(face.TextureID.ToString()) != null)
349 continue;
350 else
351 m_log.DebugFormat(
352 "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.",
353 face.TextureID, idx, sp.Name);
354 }
355 else
356 {
357 m_log.DebugFormat(
358 "[AVFACTORY]: Requesting rebake of {0} ({1}) for {2}.",
359 face.TextureID, idx, sp.Name);
360 }
361
362 sp.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
363 }
364 }
365
366 #endregion
367
368 #region AvatarFactoryModule private methods
369
351 private Dictionary<BakeType, Primitive.TextureEntryFace> GetBakedTextureFaces(ScenePresence sp) 370 private Dictionary<BakeType, Primitive.TextureEntryFace> GetBakedTextureFaces(ScenePresence sp)
352 { 371 {
353 if (sp.IsChildAgent) 372 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
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 4f71915..fd35c62 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -401,6 +401,9 @@ namespace OpenSim.Region.Framework.Scenes
401 public delegate void RegionUp(GridRegion region); 401 public delegate void RegionUp(GridRegion region);
402 public event RegionUp OnRegionUp; 402 public event RegionUp OnRegionUp;
403 403
404 public delegate void RegionStarted(Scene scene);
405 public event RegionStarted OnRegionStarted;
406
404 public delegate void LoginsEnabled(string regionName); 407 public delegate void LoginsEnabled(string regionName);
405 public event LoginsEnabled OnLoginsEnabled; 408 public event LoginsEnabled OnLoginsEnabled;
406 409
@@ -2243,6 +2246,27 @@ namespace OpenSim.Region.Framework.Scenes
2243 } 2246 }
2244 } 2247 }
2245 2248
2249 public void TriggerOnRegionStarted(Scene scene)
2250 {
2251 RegionStarted handler = OnRegionStarted;
2252
2253 if (handler != null)
2254 {
2255 foreach (RegionStarted d in handler.GetInvocationList())
2256 {
2257 try
2258 {
2259 d(scene);
2260 }
2261 catch (Exception e)
2262 {
2263 m_log.ErrorFormat("[EVENT MANAGER]: Delegate for RegionStarted failed - continuing {0} - {1}",
2264 e.Message, e.StackTrace);
2265 }
2266 }
2267 }
2268 }
2269
2246 public void TriggerLoginsEnabled (string regionName) 2270 public void TriggerLoginsEnabled (string regionName)
2247 { 2271 {
2248 LoginsEnabled handler = OnLoginsEnabled; 2272 LoginsEnabled handler = OnLoginsEnabled;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 0f84da9..027ec96 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1194,6 +1194,7 @@ namespace OpenSim.Region.Framework.Scenes
1194 1194
1195 try 1195 try
1196 { 1196 {
1197 m_eventManager.TriggerOnRegionStarted(this);
1197 while (!shuttingdown) 1198 while (!shuttingdown)
1198 Update(); 1199 Update();
1199 1200
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 3d1c1b5..42cd4be 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2844,7 +2844,7 @@ namespace OpenSim.Region.Framework.Scenes
2844 Velocity = Vector3.Zero; 2844 Velocity = Vector3.Zero;
2845 AbsolutePosition = pos; 2845 AbsolutePosition = pos;
2846 2846
2847 m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); 2847// m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition);
2848 2848
2849 AddToPhysicalScene(isFlying); 2849 AddToPhysicalScene(isFlying);
2850 } 2850 }
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index 60cc788..bca49f7 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -1263,7 +1263,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
1263 writer.WriteElementString(name, flagsStr.Replace(",", "")); 1263 writer.WriteElementString(name, flagsStr.Replace(",", ""));
1264 } 1264 }
1265 1265
1266 static void WriteTaskInventory(XmlTextWriter writer, TaskInventoryDictionary tinv, Dictionary<string, object> options, Scene scene) 1266 public static void WriteTaskInventory(XmlTextWriter writer, TaskInventoryDictionary tinv, Dictionary<string, object> options, Scene scene)
1267 { 1267 {
1268 if (tinv.Count > 0) // otherwise skip this 1268 if (tinv.Count > 0) // otherwise skip this
1269 { 1269 {
@@ -1317,7 +1317,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
1317 } 1317 }
1318 } 1318 }
1319 1319
1320 static void WriteShape(XmlTextWriter writer, PrimitiveBaseShape shp, Dictionary<string, object> options) 1320 public static void WriteShape(XmlTextWriter writer, PrimitiveBaseShape shp, Dictionary<string, object> options)
1321 { 1321 {
1322 if (shp != null) 1322 if (shp != null)
1323 { 1323 {
@@ -1492,7 +1492,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
1492 return obj; 1492 return obj;
1493 } 1493 }
1494 1494
1495 static TaskInventoryDictionary ReadTaskInventory(XmlTextReader reader, string name) 1495 public static TaskInventoryDictionary ReadTaskInventory(XmlTextReader reader, string name)
1496 { 1496 {
1497 TaskInventoryDictionary tinv = new TaskInventoryDictionary(); 1497 TaskInventoryDictionary tinv = new TaskInventoryDictionary();
1498 1498
@@ -1538,7 +1538,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
1538 /// <param name="name">The name of the xml element containing the shape</param> 1538 /// <param name="name">The name of the xml element containing the shape</param>
1539 /// <param name="errors">true if any errors were encountered during parsing, false otherwise</param> 1539 /// <param name="errors">true if any errors were encountered during parsing, false otherwise</param>
1540 /// <returns>The shape parsed</returns> 1540 /// <returns>The shape parsed</returns>
1541 static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out bool errors) 1541 public static PrimitiveBaseShape ReadShape(XmlTextReader reader, string name, out bool errors)
1542 { 1542 {
1543 errors = false; 1543 errors = false;
1544 1544
diff --git a/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs b/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs
index 1ce24f1..7e15718 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Appearance/AppearanceInfoModule.cs
@@ -114,6 +114,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance
114 "Send appearance data for each avatar in the simulator to other viewers.", 114 "Send appearance data for each avatar in the simulator to other viewers.",
115 "Optionally, you can specify that only a particular avatar's appearance data is sent.", 115 "Optionally, you can specify that only a particular avatar's appearance data is sent.",
116 HandleSendAppearanceCommand); 116 HandleSendAppearanceCommand);
117
118 scene.AddCommand(
119 this, "appearance rebake",
120 "appearance rebake <first-name> <last-name>",
121 "Send a request to the user's viewer for it to rebake and reupload its appearance textures.",
122 "This is currently done for all baked texture references previously received, whether the simulator can find the asset or not."
123 + "\nThis will only work for texture ids that the viewer has already uploaded."
124 + "\nIf the viewer has not yet sent the server any texture ids then nothing will happen"
125 + "\nsince requests can only be made for ids that the client has already sent us",
126 HandleRebakeAppearanceCommand);
117 } 127 }
118 128
119 private void HandleSendAppearanceCommand(string module, string[] cmd) 129 private void HandleSendAppearanceCommand(string module, string[] cmd)
@@ -210,6 +220,34 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance
210 } 220 }
211 } 221 }
212 } 222 }
213 } 223 }
224
225 private void HandleRebakeAppearanceCommand(string module, string[] cmd)
226 {
227 if (cmd.Length != 4)
228 {
229 MainConsole.Instance.OutputFormat("Usage: appearance rebake <first-name> <last-name>");
230 return;
231 }
232
233 string firstname = cmd[2];
234 string lastname = cmd[3];
235
236 lock (m_scenes)
237 {
238 foreach (Scene scene in m_scenes.Values)
239 {
240 ScenePresence sp = scene.GetScenePresence(firstname, lastname);
241 if (sp != null && !sp.IsChildAgent)
242 {
243 MainConsole.Instance.OutputFormat(
244 "Requesting rebake of uploaded textures for {0}",
245 sp.Name, scene.RegionInfo.RegionName);
246
247 scene.AvatarFactory.RequestRebake(sp, false);
248 }
249 }
250 }
251 }
214 } 252 }
215} \ No newline at end of file 253} \ No newline at end of file