ubOde a few changes to collisions reporting

UbitUmarov [2016-08-06 01:05:23]
 ubOde a few changes to collisions reporting
Filename
OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs
OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs
OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs
index 49020e9..cef7063 100644
--- a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs
+++ b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs
@@ -1578,6 +1578,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
                 }
             }
             m_eventsubscription = 0;
+            _parent_scene.RemoveCollisionEventReporting(this);
         }

         public override void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
@@ -1591,8 +1592,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde
             }
         }

-        public void SendCollisions()
+        public void SendCollisions(int timestep)
         {
+            if (m_cureventsubscription < 50000)
+                m_cureventsubscription += timestep;
+
             if (CollisionEventsThisFrame == null)
                 return;

@@ -1623,13 +1627,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
             }
         }

-        internal void AddCollisionFrameTime(int t)
-        {
-            // protect it from overflow crashing
-            if (m_cureventsubscription < 50000)
-                m_cureventsubscription += t;
-        }
-
         public override bool SubscribedEvents()
         {
             if (m_eventsubscription > 0)
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs
index ebaa875..9f62644 100644
--- a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs
+++ b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs
@@ -65,7 +65,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
         internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively
         private bool m_fakeisVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively

-        protected bool m_building;
+        internal bool m_building;
         protected bool m_forcePosOrRotation;
         private bool m_iscolliding;

@@ -1000,14 +1000,36 @@ namespace OpenSim.Region.PhysicsModule.ubOde

         public override void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
         {
+
             if (CollisionEventsThisFrame == null)
                 CollisionEventsThisFrame = new CollisionEventUpdate();
-//            if(CollisionEventsThisFrame.Count < 32)
-                CollisionEventsThisFrame.AddCollider(CollidedWith, contact);
+            CollisionEventsThisFrame.AddCollider(CollidedWith, contact);
+            _parent_scene.AddCollisionEventReporting(this);
+        }
+
+        internal void SleeperAddCollisionEvents()
+        {
+            if (CollisionEventsThisFrame == null)
+                return;
+            if(CollisionEventsThisFrame.m_objCollisionList.Count == 0)
+                return;
+            foreach(KeyValuePair<uint,ContactPoint> kvp in CollisionEventsThisFrame.m_objCollisionList)
+            {
+                OdePrim other = _parent_scene.getPrim(kvp.Key);
+                if(other == null)
+                    continue;
+                ContactPoint cp = kvp.Value;
+                cp.SurfaceNormal = - cp.SurfaceNormal;
+                cp.RelativeSpeed = -cp.RelativeSpeed;
+                other.AddCollisionEvent(ParentActor.LocalID,cp);
+            }
         }

-        public void SendCollisions()
+        public void SendCollisions(int timestep)
         {
+            if (m_cureventsubscription < 50000)
+                m_cureventsubscription += timestep;
+
             if (CollisionEventsThisFrame == null)
                 return;

@@ -1027,7 +1049,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
                     SentEmptyCollisionsEvent = true;
                     _parent_scene.RemoveCollisionEventReporting(this);
                 }
-                else
+                else if(Body == IntPtr.Zero || d.BodyIsEnabled(Body))
                 {
                     SentEmptyCollisionsEvent = false;
                     CollisionEventsThisFrame.Clear();
@@ -1035,12 +1057,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde
             }
         }

-        internal void AddCollisionFrameTime(int t)
-        {
-            if (m_cureventsubscription < 50000)
-                m_cureventsubscription += t;
-        }
-
         public override bool SubscribedEvents()
         {
             if (m_eventsubscription > 0)
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
index 8d87c30..6c5b405 100644
--- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
+++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs
@@ -228,8 +228,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde

         private d.NearCallback nearCallback;

+        private Dictionary<uint,OdePrim> _prims = new Dictionary<uint,OdePrim>();
         private HashSet<OdeCharacter> _characters = new HashSet<OdeCharacter>();
-        private HashSet<OdePrim> _prims = new HashSet<OdePrim>();
         private HashSet<OdePrim> _activeprims = new HashSet<OdePrim>();
         private HashSet<OdePrim> _activegroups = new HashSet<OdePrim>();

@@ -1329,7 +1329,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde

                 newPrim = new OdePrim(name, this, position, size, rotation, pbs, isphysical, isPhantom, shapeType, localID);
                 lock (_prims)
-                    _prims.Add(newPrim);
+                    _prims[newPrim.LocalID] = newPrim;
             }
             return newPrim;
         }
@@ -1391,15 +1391,26 @@ namespace OpenSim.Region.PhysicsModule.ubOde
             {
 //                RemoveCollisionEventReporting(prim);
                 lock (_prims)
-                    _prims.Remove(prim);
+                    _prims.Remove(prim.LocalID);
             }

         }

+        public OdePrim getPrim(uint id)
+        {
+            lock (_prims)
+            {
+                if(_prims.ContainsKey(id))
+                    return _prims[id];
+                else
+                    return null;
+            }
+        }
+
         public bool havePrim(OdePrim prm)
         {
             lock (_prims)
-                return _prims.Contains(prm);
+                return _prims.ContainsKey(prm.LocalID);
         }

         public bool haveActor(PhysicsActor actor)
@@ -1407,7 +1418,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
             if (actor is OdePrim)
             {
                 lock (_prims)
-                    return _prims.Contains((OdePrim)actor);
+                    return _prims.ContainsKey(((OdePrim)actor).LocalID);
             }
             else if (actor is OdeCharacter)
             {
@@ -1708,6 +1719,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
                         m_rayCastManager.ProcessQueuedRequests();

                         collision_optimized();
+                        List<OdePrim> sleepers = new List<OdePrim>();

                         foreach (PhysicsActor obj in _collisionEventPrim)
                         {
@@ -1718,21 +1730,27 @@ namespace OpenSim.Region.PhysicsModule.ubOde
                             {
                                 case ActorTypes.Agent:
                                     OdeCharacter cobj = (OdeCharacter)obj;
-                                    cobj.AddCollisionFrameTime((int)(odetimestepMS));
-                                    cobj.SendCollisions();
+                                    cobj.SendCollisions((int)(odetimestepMS));
                                     break;

                                 case ActorTypes.Prim:
                                     OdePrim pobj = (OdePrim)obj;
-                                    if (!pobj.m_outbounds && (pobj.Body == IntPtr.Zero || d.BodyIsEnabled(pobj.Body)))
+                                    if (!pobj.m_outbounds)
                                     {
-                                        pobj.AddCollisionFrameTime((int)(odetimestepMS));
-                                        pobj.SendCollisions();
+                                        pobj.SendCollisions((int)(odetimestepMS));
+                                        if(pobj.Body != IntPtr.Zero && !pobj.m_isSelected &&
+                                            !pobj.m_disabled && !pobj.m_building &&
+                                            !d.BodyIsEnabled(pobj.Body))
+                                        sleepers.Add(pobj);
                                     }
                                     break;
                             }
                         }

+                        foreach(OdePrim prm in sleepers)
+                            prm.SleeperAddCollisionEvents();
+                        sleepers.Clear();
+
                         foreach (PhysicsActor obj in _collisionEventPrimRemove)
                             _collisionEventPrim.Remove(obj);

@@ -2481,7 +2499,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
                 lock (_prims)
                 {
                     ChangesQueue.Clear();
-                    foreach (OdePrim prm in _prims)
+                    foreach (OdePrim prm in _prims.Values)
                     {
                         prm.DoAChange(changes.Remove, null);
                         _collisionEventPrim.Remove(prm);
@@ -2544,7 +2562,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde
             int cnt = 0;
             lock (_prims)
             {
-                foreach (OdePrim prm in _prims)
+                foreach (OdePrim prm in _prims.Values)
                 {
                     if (prm.CollisionScore > 0)
                     {
ViewGit