From 17cc238b443adbdddf45db4a1a023d0b564ac860 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 6 Aug 2016 02:05:23 +0100 Subject: [PATCH] ubOde a few changes to collisions reporting --- .../PhysicsModules/ubOde/ODECharacter.cs | 13 +++--- .../Region/PhysicsModules/ubOde/ODEPrim.cs | 38 ++++++++++++----- .../Region/PhysicsModules/ubOde/ODEScene.cs | 42 +++++++++++++------ 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs index 49020e92e4..cef7063a2d 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 ebaa875536..9f62644f67 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); } - public void SendCollisions() + internal void SleeperAddCollisionEvents() { + if (CollisionEventsThisFrame == null) + return; + if(CollisionEventsThisFrame.m_objCollisionList.Count == 0) + return; + foreach(KeyValuePair 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(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 8d87c30299..6c5b405d06 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 _prims = new Dictionary(); private HashSet _characters = new HashSet(); - private HashSet _prims = new HashSet(); private HashSet _activeprims = new HashSet(); private HashSet _activegroups = new HashSet(); @@ -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 sleepers = new List(); 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) {