diff options
author | Dr Scofield | 2009-06-25 07:39:48 +0000 |
---|---|---|
committer | Dr Scofield | 2009-06-25 07:39:48 +0000 |
commit | 652bcf91d50898181638a2668c9e2dcacfa33005 (patch) | |
tree | c1bdb97e6ef633d9b7605acbaa7eab6afd404f48 /OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |
parent | Allow "Take Copy" with copy only permissions if you own the object. Trans (diff) | |
download | opensim-SC-652bcf91d50898181638a2668c9e2dcacfa33005.zip opensim-SC-652bcf91d50898181638a2668c9e2dcacfa33005.tar.gz opensim-SC-652bcf91d50898181638a2668c9e2dcacfa33005.tar.bz2 opensim-SC-652bcf91d50898181638a2668c9e2dcacfa33005.tar.xz |
- fixes a "collection out of sync" exception in the ODE physics
engine, caused by an "avatar infinite position" occurring under
heavy load.
- fixes "value too small" exception in ChatModule
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/ODECharacter.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 3f0d6c1..e5e7d07 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | ||
29 | using System.Reflection; | 30 | using System.Reflection; |
30 | using OpenMetaverse; | 31 | using OpenMetaverse; |
31 | using Ode.NET; | 32 | using Ode.NET; |
@@ -785,7 +786,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
785 | /// This is the avatar's movement control + PID Controller | 786 | /// This is the avatar's movement control + PID Controller |
786 | /// </summary> | 787 | /// </summary> |
787 | /// <param name="timeStep"></param> | 788 | /// <param name="timeStep"></param> |
788 | public void Move(float timeStep) | 789 | public void Move(float timeStep, List<OdeCharacter> defects) |
789 | { | 790 | { |
790 | // no lock; for now it's only called from within Simulate() | 791 | // no lock; for now it's only called from within Simulate() |
791 | 792 | ||
@@ -803,11 +804,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
803 | 804 | ||
804 | d.Vector3 localpos = d.BodyGetPosition(Body); | 805 | d.Vector3 localpos = d.BodyGetPosition(Body); |
805 | PhysicsVector localPos = new PhysicsVector(localpos.X, localpos.Y, localpos.Z); | 806 | PhysicsVector localPos = new PhysicsVector(localpos.X, localpos.Y, localpos.Z); |
807 | |||
806 | if (!PhysicsVector.isFinite(localPos)) | 808 | if (!PhysicsVector.isFinite(localPos)) |
807 | { | 809 | { |
808 | 810 | ||
809 | m_log.Warn("[PHYSICS]: Avatar Position is non-finite!"); | 811 | m_log.Warn("[PHYSICS]: Avatar Position is non-finite!"); |
810 | _parent_scene.RemoveCharacter(this); | 812 | defects.Add(this); |
813 | // _parent_scene.RemoveCharacter(this); | ||
814 | |||
811 | // destroy avatar capsule and related ODE data | 815 | // destroy avatar capsule and related ODE data |
812 | if (Amotor != IntPtr.Zero) | 816 | if (Amotor != IntPtr.Zero) |
813 | { | 817 | { |
@@ -815,6 +819,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
815 | d.JointDestroy(Amotor); | 819 | d.JointDestroy(Amotor); |
816 | Amotor = IntPtr.Zero; | 820 | Amotor = IntPtr.Zero; |
817 | } | 821 | } |
822 | |||
818 | //kill the Geometry | 823 | //kill the Geometry |
819 | _parent_scene.waitForSpaceUnlock(_parent_scene.space); | 824 | _parent_scene.waitForSpaceUnlock(_parent_scene.space); |
820 | 825 | ||
@@ -958,7 +963,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
958 | { | 963 | { |
959 | m_log.Warn("[PHYSICS]: Got a NaN force vector in Move()"); | 964 | m_log.Warn("[PHYSICS]: Got a NaN force vector in Move()"); |
960 | m_log.Warn("[PHYSICS]: Avatar Position is non-finite!"); | 965 | m_log.Warn("[PHYSICS]: Avatar Position is non-finite!"); |
961 | _parent_scene.RemoveCharacter(this); | 966 | defects.Add(this); |
967 | // _parent_scene.RemoveCharacter(this); | ||
962 | // destroy avatar capsule and related ODE data | 968 | // destroy avatar capsule and related ODE data |
963 | if (Amotor != IntPtr.Zero) | 969 | if (Amotor != IntPtr.Zero) |
964 | { | 970 | { |