diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Framework/AvatarAppearance.cs | 53 | ||||
-rw-r--r-- | OpenSim/Framework/LocklessQueue.cs | 8 | ||||
-rw-r--r-- | OpenSim/Framework/ThrottleOutPacketType.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs | 54 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 10 | ||||
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | 73 |
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 | ||
30 | namespace OpenSim.Framework | 30 | namespace 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}", |