aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Framework/AvatarAppearance.cs53
-rw-r--r--OpenSim/Framework/LocklessQueue.cs8
-rw-r--r--OpenSim/Framework/ThrottleOutPacketType.cs2
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs8
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs54
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs10
-rw-r--r--OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs73
7 files changed, 186 insertions, 22 deletions
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs
index ffc3527..041fb94 100644
--- a/OpenSim/Framework/AvatarAppearance.cs
+++ b/OpenSim/Framework/AvatarAppearance.cs
@@ -1558,7 +1558,58 @@ namespace OpenSim.Framework
1558 SHAPE_EYELID_INNER_CORNER_UP = 214, 1558 SHAPE_EYELID_INNER_CORNER_UP = 214,
1559 SKIRT_SKIRT_RED = 215, 1559 SKIRT_SKIRT_RED = 215,
1560 SKIRT_SKIRT_GREEN = 216, 1560 SKIRT_SKIRT_GREEN = 216,
1561 SKIRT_SKIRT_BLUE = 217 1561 SKIRT_SKIRT_BLUE = 217,
1562
1563 /// <summary>
1564 /// Avatar Physics section. These are 0 type visual params which get transmitted.
1565 /// </summary>
1566
1567 /// <summary>
1568 /// Breast Part 1
1569 /// </summary>
1570 BREAST_PHYSICS_MASS = 218,
1571 BREAST_PHYSICS_GRAVITY = 219,
1572 BREAST_PHYSICS_DRAG = 220,
1573 BREAST_PHYSICS_UPDOWN_MAX_EFFECT = 221,
1574 BREAST_PHYSICS_UPDOWN_SPRING = 222,
1575 BREAST_PHYSICS_UPDOWN_GAIN = 223,
1576 BREAST_PHYSICS_UPDOWN_DAMPING = 224,
1577 BREAST_PHYSICS_INOUT_MAX_EFFECT = 225,
1578 BREAST_PHYSICS_INOUT_SPRING = 226,
1579 BREAST_PHYSICS_INOUT_GAIN = 227,
1580 BREAST_PHYSICS_INOUT_DAMPING = 228,
1581 /// <summary>
1582 /// Belly
1583 /// </summary>
1584 BELLY_PHYISCS_MASS = 229,
1585 BELLY_PHYSICS_GRAVITY = 230,
1586 BELLY_PHYSICS_DRAG = 231,
1587 BELLY_PHYISCS_UPDOWN_MAX_EFFECT = 232,
1588 BELLY_PHYSICS_UPDOWN_SPRING = 233,
1589 BELLY_PHYSICS_UPDOWN_GAIN = 234,
1590 BELLY_PHYSICS_UPDOWN_DAMPING = 235,
1591
1592 /// <summary>
1593 /// Butt
1594 /// </summary>
1595 BUTT_PHYSICS_MASS = 236,
1596 BUTT_PHYSICS_GRAVITY = 237,
1597 BUTT_PHYSICS_DRAG = 238,
1598 BUTT_PHYSICS_UPDOWN_MAX_EFFECT = 239,
1599 BUTT_PHYSICS_UPDOWN_SPRING = 240,
1600 BUTT_PHYSICS_UPDOWN_GAIN = 241,
1601 BUTT_PHYSICS_UPDOWN_DAMPING = 242,
1602 BUTT_PHYSICS_LEFTRIGHT_MAX_EFFECT = 243,
1603 BUTT_PHYSICS_LEFTRIGHT_SPRING = 244,
1604 BUTT_PHYSICS_LEFTRIGHT_GAIN = 245,
1605 BUTT_PHYSICS_LEFTRIGHT_DAMPING = 246,
1606 /// <summary>
1607 /// Breast Part 2
1608 /// </summary>
1609 BREAST_PHYSICS_LEFTRIGHT_MAX_EFFECT = 247,
1610 BREAST_PHYSICS_LEFTRIGHT_SPRING= 248,
1611 BREAST_PHYSICS_LEFTRIGHT_GAIN = 249,
1612 BREAST_PHYSICS_LEFTRIGHT_DAMPING = 250
1562 } 1613 }
1563 #endregion 1614 #endregion
1564 } 1615 }
diff --git a/OpenSim/Framework/LocklessQueue.cs b/OpenSim/Framework/LocklessQueue.cs
index 84f887c..9bd9baf 100644
--- a/OpenSim/Framework/LocklessQueue.cs
+++ b/OpenSim/Framework/LocklessQueue.cs
@@ -29,7 +29,7 @@ using System.Threading;
29 29
30namespace OpenSim.Framework 30namespace OpenSim.Framework
31{ 31{
32 public sealed class LocklessQueue<T> 32 public class LocklessQueue<T>
33 { 33 {
34 private sealed class SingleLinkNode 34 private sealed class SingleLinkNode
35 { 35 {
@@ -41,7 +41,7 @@ namespace OpenSim.Framework
41 SingleLinkNode tail; 41 SingleLinkNode tail;
42 int count; 42 int count;
43 43
44 public int Count { get { return count; } } 44 public virtual int Count { get { return count; } }
45 45
46 public LocklessQueue() 46 public LocklessQueue()
47 { 47 {
@@ -76,7 +76,7 @@ namespace OpenSim.Framework
76 Interlocked.Increment(ref count); 76 Interlocked.Increment(ref count);
77 } 77 }
78 78
79 public bool Dequeue(out T item) 79 public virtual bool Dequeue(out T item)
80 { 80 {
81 item = default(T); 81 item = default(T);
82 SingleLinkNode oldHead = null; 82 SingleLinkNode oldHead = null;
@@ -136,4 +136,4 @@ namespace OpenSim.Framework
136 (object)Interlocked.CompareExchange<SingleLinkNode>(ref location, newValue, comparand); 136 (object)Interlocked.CompareExchange<SingleLinkNode>(ref location, newValue, comparand);
137 } 137 }
138 } 138 }
139} \ No newline at end of file 139}
diff --git a/OpenSim/Framework/ThrottleOutPacketType.cs b/OpenSim/Framework/ThrottleOutPacketType.cs
index ca4b126..87899f0 100644
--- a/OpenSim/Framework/ThrottleOutPacketType.cs
+++ b/OpenSim/Framework/ThrottleOutPacketType.cs
@@ -47,6 +47,8 @@ namespace OpenSim.Framework
47 Texture = 5, 47 Texture = 5,
48 /// <summary>Non-texture assets</summary> 48 /// <summary>Non-texture assets</summary>
49 Asset = 6, 49 Asset = 6,
50
51 HighPriority = 128,
50 } 52 }
51 53
52 [Flags] 54 [Flags]
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 956c2c9..9550b5a 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -2788,7 +2788,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2788 Transfer.TransferInfo.Size = req.AssetInf.Data.Length; 2788 Transfer.TransferInfo.Size = req.AssetInf.Data.Length;
2789 Transfer.TransferInfo.TransferID = req.TransferRequestID; 2789 Transfer.TransferInfo.TransferID = req.TransferRequestID;
2790 Transfer.Header.Zerocoded = true; 2790 Transfer.Header.Zerocoded = true;
2791 OutPacket(Transfer, isWearable ? ThrottleOutPacketType.Task : ThrottleOutPacketType.Asset); 2791 OutPacket(Transfer, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset);
2792 2792
2793 if (req.NumPackets == 1) 2793 if (req.NumPackets == 1)
2794 { 2794 {
@@ -2799,7 +2799,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2799 TransferPacket.TransferData.Data = req.AssetInf.Data; 2799 TransferPacket.TransferData.Data = req.AssetInf.Data;
2800 TransferPacket.TransferData.Status = 1; 2800 TransferPacket.TransferData.Status = 1;
2801 TransferPacket.Header.Zerocoded = true; 2801 TransferPacket.Header.Zerocoded = true;
2802 OutPacket(TransferPacket, isWearable ? ThrottleOutPacketType.Task : ThrottleOutPacketType.Asset); 2802 OutPacket(TransferPacket, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset);
2803 } 2803 }
2804 else 2804 else
2805 { 2805 {
@@ -2832,7 +2832,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2832 TransferPacket.TransferData.Status = 1; 2832 TransferPacket.TransferData.Status = 1;
2833 } 2833 }
2834 TransferPacket.Header.Zerocoded = true; 2834 TransferPacket.Header.Zerocoded = true;
2835 OutPacket(TransferPacket, isWearable ? ThrottleOutPacketType.Task : ThrottleOutPacketType.Asset); 2835 OutPacket(TransferPacket, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset);
2836 2836
2837 processedLength += chunkSize; 2837 processedLength += chunkSize;
2838 packetNumber++; 2838 packetNumber++;
@@ -3605,7 +3605,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3605 } 3605 }
3606 } 3606 }
3607 3607
3608 OutPacket(aw, ThrottleOutPacketType.Task); 3608 OutPacket(aw, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority);
3609 } 3609 }
3610 3610
3611 public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry) 3611 public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry)
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
index f1a1812..e52ac37 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs
@@ -92,7 +92,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
92 /// <summary>Packets we have sent that need to be ACKed by the client</summary> 92 /// <summary>Packets we have sent that need to be ACKed by the client</summary>
93 public readonly UnackedPacketCollection NeedAcks = new UnackedPacketCollection(); 93 public readonly UnackedPacketCollection NeedAcks = new UnackedPacketCollection();
94 /// <summary>ACKs that are queued up, waiting to be sent to the client</summary> 94 /// <summary>ACKs that are queued up, waiting to be sent to the client</summary>
95 public readonly OpenSim.Framework.LocklessQueue<uint> PendingAcks = new OpenSim.Framework.LocklessQueue<uint>(); 95 public readonly DoubleLocklessQueue<uint> PendingAcks = new DoubleLocklessQueue<uint>();
96 96
97 /// <summary>Current packet sequence number</summary> 97 /// <summary>Current packet sequence number</summary>
98 public int CurrentSequence; 98 public int CurrentSequence;
@@ -146,7 +146,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
146 /// <summary>Throttle buckets for each packet category</summary> 146 /// <summary>Throttle buckets for each packet category</summary>
147 private readonly TokenBucket[] m_throttleCategories; 147 private readonly TokenBucket[] m_throttleCategories;
148 /// <summary>Outgoing queues for throttled packets</summary> 148 /// <summary>Outgoing queues for throttled packets</summary>
149 private readonly OpenSim.Framework.LocklessQueue<OutgoingPacket>[] m_packetOutboxes = new OpenSim.Framework.LocklessQueue<OutgoingPacket>[THROTTLE_CATEGORY_COUNT]; 149 private readonly DoubleLocklessQueue<OutgoingPacket>[] m_packetOutboxes = new DoubleLocklessQueue<OutgoingPacket>[THROTTLE_CATEGORY_COUNT];
150 /// <summary>A container that can hold one packet for each outbox, used to store 150 /// <summary>A container that can hold one packet for each outbox, used to store
151 /// dequeued packets that are being held for throttling</summary> 151 /// dequeued packets that are being held for throttling</summary>
152 private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; 152 private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT];
@@ -202,7 +202,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
202 ThrottleOutPacketType type = (ThrottleOutPacketType)i; 202 ThrottleOutPacketType type = (ThrottleOutPacketType)i;
203 203
204 // Initialize the packet outboxes, where packets sit while they are waiting for tokens 204 // Initialize the packet outboxes, where packets sit while they are waiting for tokens
205 m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>(); 205 m_packetOutboxes[i] = new DoubleLocklessQueue<OutgoingPacket>();
206 // Initialize the token buckets that control the throttling for each category 206 // Initialize the token buckets that control the throttling for each category
207 m_throttleCategories[i] = new TokenBucket(m_throttleCategory, rates.GetRate(type)); 207 m_throttleCategories[i] = new TokenBucket(m_throttleCategory, rates.GetRate(type));
208 } 208 }
@@ -430,15 +430,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP
430 /// </returns> 430 /// </returns>
431 public bool EnqueueOutgoing(OutgoingPacket packet, bool forceQueue) 431 public bool EnqueueOutgoing(OutgoingPacket packet, bool forceQueue)
432 { 432 {
433 return EnqueueOutgoing(packet, forceQueue, false);
434 }
435
436 public bool EnqueueOutgoing(OutgoingPacket packet, bool forceQueue, bool highPriority)
437 {
433 int category = (int)packet.Category; 438 int category = (int)packet.Category;
434 439
435 if (category >= 0 && category < m_packetOutboxes.Length) 440 if (category >= 0 && category < m_packetOutboxes.Length)
436 { 441 {
437 OpenSim.Framework.LocklessQueue<OutgoingPacket> queue = m_packetOutboxes[category]; 442 DoubleLocklessQueue<OutgoingPacket> queue = m_packetOutboxes[category];
438 443
439 if (m_deliverPackets == false) 444 if (m_deliverPackets == false)
440 { 445 {
441 queue.Enqueue(packet); 446 queue.Enqueue(packet, highPriority);
442 return true; 447 return true;
443 } 448 }
444 449
@@ -449,7 +454,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
449 // queued packets 454 // queued packets
450 if (queue.Count > 0) 455 if (queue.Count > 0)
451 { 456 {
452 queue.Enqueue(packet); 457 queue.Enqueue(packet, highPriority);
453 return true; 458 return true;
454 } 459 }
455 460
@@ -462,7 +467,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
462 else 467 else
463 { 468 {
464 // Force queue specified or not enough tokens in the bucket, queue this packet 469 // Force queue specified or not enough tokens in the bucket, queue this packet
465 queue.Enqueue(packet); 470 queue.Enqueue(packet, highPriority);
466 return true; 471 return true;
467 } 472 }
468 } 473 }
@@ -494,7 +499,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
494 if (m_deliverPackets == false) return false; 499 if (m_deliverPackets == false) return false;
495 500
496 OutgoingPacket packet = null; 501 OutgoingPacket packet = null;
497 OpenSim.Framework.LocklessQueue<OutgoingPacket> queue; 502 DoubleLocklessQueue<OutgoingPacket> queue;
498 TokenBucket bucket; 503 TokenBucket bucket;
499 bool packetSent = false; 504 bool packetSent = false;
500 ThrottleOutPacketTypeFlags emptyCategories = 0; 505 ThrottleOutPacketTypeFlags emptyCategories = 0;
@@ -534,7 +539,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
534 } 539 }
535 catch 540 catch
536 { 541 {
537 m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>(); 542 m_packetOutboxes[i] = new DoubleLocklessQueue<OutgoingPacket>();
538 } 543 }
539 if (success) 544 if (success)
540 { 545 {
@@ -567,7 +572,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
567 } 572 }
568 else 573 else
569 { 574 {
570 m_packetOutboxes[i] = new OpenSim.Framework.LocklessQueue<OutgoingPacket>(); 575 m_packetOutboxes[i] = new DoubleLocklessQueue<OutgoingPacket>();
571 emptyCategories |= CategoryToFlag(i); 576 emptyCategories |= CategoryToFlag(i);
572 } 577 }
573 } 578 }
@@ -724,4 +729,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP
724 } 729 }
725 } 730 }
726 } 731 }
732
733 public class DoubleLocklessQueue<T> : OpenSim.Framework.LocklessQueue<T>
734 {
735 OpenSim.Framework.LocklessQueue<T> highQueue = new OpenSim.Framework.LocklessQueue<T>();
736
737 public override int Count
738 {
739 get
740 {
741 return base.Count + highQueue.Count;
742 }
743 }
744
745 public override bool Dequeue(out T item)
746 {
747 if (highQueue.Dequeue(out item))
748 return true;
749
750 return base.Dequeue(out item);
751 }
752
753 public void Enqueue(T item, bool highPriority)
754 {
755 if (highPriority)
756 highQueue.Enqueue(item);
757 else
758 Enqueue(item);
759 }
760 }
727} 761}
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 9a4abd4..6c72edc 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -803,6 +803,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
803 803
804 #region Queue or Send 804 #region Queue or Send
805 805
806 bool highPriority = false;
807
808 if (category != ThrottleOutPacketType.Unknown && (category & ThrottleOutPacketType.HighPriority) != 0)
809 {
810 category = (ThrottleOutPacketType)((int)category & 127);
811 highPriority = true;
812 }
813
806 OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category, null); 814 OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category, null);
807 // If we were not provided a method for handling unacked, use the UDPServer default method 815 // If we were not provided a method for handling unacked, use the UDPServer default method
808 outgoingPacket.UnackedMethod = ((method == null) ? delegate(OutgoingPacket oPacket) { ResendUnacked(oPacket); } : method); 816 outgoingPacket.UnackedMethod = ((method == null) ? delegate(OutgoingPacket oPacket) { ResendUnacked(oPacket); } : method);
@@ -811,7 +819,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
811 // continue to display the deleted object until relog. Therefore, we need to always queue a kill object 819 // continue to display the deleted object until relog. Therefore, we need to always queue a kill object
812 // packet so that it isn't sent before a queued update packet. 820 // packet so that it isn't sent before a queued update packet.
813 bool requestQueue = type == PacketType.KillObject; 821 bool requestQueue = type == PacketType.KillObject;
814 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket, requestQueue)) 822 if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket, requestQueue, highPriority))
815 SendPacketFinal(outgoingPacket); 823 SendPacketFinal(outgoingPacket);
816 824
817 #endregion Queue or Send 825 #endregion Queue or Send
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index 27cf204..7ec2860 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -373,6 +373,52 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
373 { 373 {
374 bool defonly = true; // are we only using default textures 374 bool defonly = true; // are we only using default textures
375 IImprovedAssetCache cache = m_scene.RequestModuleInterface<IImprovedAssetCache>(); 375 IImprovedAssetCache cache = m_scene.RequestModuleInterface<IImprovedAssetCache>();
376 IBakedTextureModule bakedModule = m_scene.RequestModuleInterface<IBakedTextureModule>();
377 WearableCacheItem[] wearableCache = null;
378
379 // Cache wearable data for teleport.
380 // Only makes sense if there's a bake module and a cache module
381 if (bakedModule != null && cache != null)
382 {
383 try
384 {
385 wearableCache = bakedModule.Get(sp.UUID);
386 }
387 catch (Exception)
388 {
389
390 }
391 if (wearableCache != null)
392 {
393 for (int i = 0; i < wearableCache.Length; i++)
394 {
395 cache.Cache(wearableCache[i].TextureAsset);
396 }
397 }
398 }
399 /*
400 IBakedTextureModule bakedModule = m_scene.RequestModuleInterface<IBakedTextureModule>();
401 if (invService.GetRootFolder(userID) != null)
402 {
403 WearableCacheItem[] wearableCache = null;
404 if (bakedModule != null)
405 {
406 try
407 {
408 wearableCache = bakedModule.Get(userID);
409 appearance.WearableCacheItems = wearableCache;
410 appearance.WearableCacheItemsDirty = false;
411 foreach (WearableCacheItem item in wearableCache)
412 {
413 appearance.Texture.FaceTextures[item.TextureIndex].TextureID = item.TextureID;
414 }
415 }
416 catch (Exception)
417 {
418
419 }
420 }
421 */
376 422
377 // Process the texture entry 423 // Process the texture entry
378 for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) 424 for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++)
@@ -380,9 +426,32 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
380 int idx = AvatarAppearance.BAKE_INDICES[i]; 426 int idx = AvatarAppearance.BAKE_INDICES[i];
381 Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx]; 427 Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx];
382 428
383 // if there is no texture entry, skip it 429 // No face, so lets check our baked service cache, teleport or login.
384 if (face == null) 430 if (face == null)
385 continue; 431 {
432 if (wearableCache != null)
433 {
434 // If we find the an appearance item, set it as the textureentry and the face
435 WearableCacheItem searchitem = WearableCacheItem.SearchTextureIndex((uint) idx, wearableCache);
436 if (searchitem != null)
437 {
438 sp.Appearance.Texture.FaceTextures[idx] = sp.Appearance.Texture.CreateFace((uint) idx);
439 sp.Appearance.Texture.FaceTextures[idx].TextureID = searchitem.TextureID;
440 face = sp.Appearance.Texture.FaceTextures[idx];
441 }
442 else
443 {
444 // if there is no texture entry and no baked cache, skip it
445 continue;
446 }
447 }
448 else
449 {
450 //No texture entry face and no cache. Skip this face.
451 continue;
452 }
453 }
454
386 455
387// m_log.DebugFormat( 456// m_log.DebugFormat(
388// "[AVFACTORY]: Looking for texture {0}, id {1} for {2} {3}", 457// "[AVFACTORY]: Looking for texture {0}, id {1} for {2} {3}",