aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/PhysicsModules/ubOde
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs48
1 files changed, 21 insertions, 27 deletions
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
index 623e6be..fc08819 100644
--- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
+++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
@@ -30,6 +30,7 @@
30 30
31using System; 31using System;
32using System.Collections.Generic; 32using System.Collections.Generic;
33using System.Linq;
33using System.Reflection; 34using System.Reflection;
34using System.Runtime.InteropServices; 35using System.Runtime.InteropServices;
35using System.Threading; 36using System.Threading;
@@ -803,14 +804,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
803 return; 804 return;
804 } 805 }
805 806
806 // update actors collision score
807 if (p1.CollisionScore >= float.MaxValue - count)
808 p1.CollisionScore = 0;
809 p1.CollisionScore += count;
810
811 if (p2.CollisionScore >= float.MaxValue - count)
812 p2.CollisionScore = 0;
813 p2.CollisionScore += count;
814 807
815 // get first contact 808 // get first contact
816 d.ContactGeom curContact = new d.ContactGeom(); 809 d.ContactGeom curContact = new d.ContactGeom();
@@ -1056,6 +1049,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde
1056 { 1049 {
1057 uint obj2LocalID = 0; 1050 uint obj2LocalID = 0;
1058 1051
1052 // update actors collision score
1053 if (p1.CollisionScore < float.MaxValue)
1054 p1.CollisionScore += 1.0f;
1055 if (p2.CollisionScore < float.MaxValue)
1056 p2.CollisionScore += 1.0f;
1057
1059 bool p1events = p1.SubscribedEvents(); 1058 bool p1events = p1.SubscribedEvents();
1060 bool p2events = p2.SubscribedEvents(); 1059 bool p2events = p2.SubscribedEvents();
1061 1060
@@ -2569,27 +2568,22 @@ namespace OpenSim.Region.PhysicsModule.ubOde
2569 } 2568 }
2570 } 2569 }
2571 2570
2571 private int compareByCollisionsDesc(OdePrim A, OdePrim B)
2572 {
2573 return -A.CollisionScore.CompareTo(B.CollisionScore);
2574 }
2575
2572 public override Dictionary<uint, float> GetTopColliders() 2576 public override Dictionary<uint, float> GetTopColliders()
2573 { 2577 {
2574 Dictionary<uint, float> returncolliders = new Dictionary<uint, float>(); 2578 Dictionary<uint, float> topColliders;
2575 int cnt = 0; 2579 List<OdePrim> orderedPrims;
2576 lock (_prims) 2580 lock (_activeprims)
2577 { 2581 orderedPrims = new List<OdePrim>(_activeprims);
2578 foreach (OdePrim prm in _prims.Values) 2582
2579 { 2583 orderedPrims.Sort(compareByCollisionsDesc);
2580 if (prm.CollisionScore > 0) 2584 topColliders = orderedPrims.Take(25).ToDictionary(p => p.LocalID, p => p.CollisionScore);
2581 { 2585
2582 returncolliders.Add(prm.LocalID, prm.CollisionScore); 2586 return topColliders;
2583 cnt++;
2584 prm.CollisionScore = 0f;
2585 if (cnt > 25)
2586 {
2587 break;
2588 }
2589 }
2590 }
2591 }
2592 return returncolliders;
2593 } 2587 }
2594 2588
2595 public override bool SupportsRayCast() 2589 public override bool SupportsRayCast()