diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 8b6810251c..c8ecc9bf90 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2082,6 +2082,8 @@ namespace OpenSim.Region.Framework.Scenes public void PhysicsCollision(EventArgs e) { +// m_log.DebugFormat("Invoking PhysicsCollision on {0} {1} {2}", Name, LocalId, UUID); + // single threaded here CollisionEventUpdate a = (CollisionEventUpdate)e; diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index 362f997e18..49f60f8d5e 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs @@ -76,6 +76,8 @@ namespace OpenSim.Region.Physics.Manager /// public int Count { get { return m_objCollisionList.Count; } } + public bool CollisionsOnPreviousFrame { get; private set; } + public Dictionary m_objCollisionList; public CollisionEventUpdate(Dictionary objCollisionList) diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 036388538c..ea6af3a1be 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -193,6 +193,15 @@ namespace OpenSim.Region.Physics.OdePlugin private int m_eventsubscription; private CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate(); + /// + /// Signal whether there were collisions on the previous frame, so we know if we need to send the + /// empty CollisionEventsThisFrame to the prim so that it can detect the end of a collision. + /// + /// + /// This is probably a temporary measure, pending storing this information consistently in CollisionEventUpdate itself. + /// + private bool m_collisionsOnPreviousFrame; + private IntPtr m_linkJoint = IntPtr.Zero; internal volatile bool childPrim; @@ -3025,8 +3034,20 @@ Console.WriteLine(" JointCreateFixed"); public void SendCollisions() { - if (CollisionEventsThisFrame.Count > 0) + if (m_collisionsOnPreviousFrame || CollisionEventsThisFrame.Count > 0) + { base.SendCollisionUpdate(CollisionEventsThisFrame); + + if (CollisionEventsThisFrame.Count > 0) + { + m_collisionsOnPreviousFrame = true; + CollisionEventsThisFrame.Clear(); + } + else + { + m_collisionsOnPreviousFrame = false; + } + } } public override bool SubscribedEvents()