aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs56
1 files changed, 50 insertions, 6 deletions
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
index 42e22ff..95a9741 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs
@@ -732,13 +732,13 @@ namespace OpenSim.Region.Physics.OdePlugin
732 732
733 public override void CrossingFailure() 733 public override void CrossingFailure()
734 { 734 {
735 m_crossingfailures++; 735 int tmp = Interlocked.Increment(ref m_crossingfailures);
736 if (m_crossingfailures > _parent_scene.geomCrossingFailuresBeforeOutofbounds) 736 if (tmp > _parent_scene.geomCrossingFailuresBeforeOutofbounds)
737 { 737 {
738 base.RaiseOutOfBounds(_position); 738 base.RaiseOutOfBounds(_position);
739 return; 739 return;
740 } 740 }
741 else if (m_crossingfailures == _parent_scene.geomCrossingFailuresBeforeOutofbounds) 741 else if (tmp == _parent_scene.geomCrossingFailuresBeforeOutofbounds)
742 { 742 {
743 m_log.Warn("[PHYSICS]: Too many crossing failures for: " + m_primName); 743 m_log.Warn("[PHYSICS]: Too many crossing failures for: " + m_primName);
744 } 744 }
@@ -3042,10 +3042,9 @@ Console.WriteLine("ODEPrim JointCreateFixed !!!");
3042 d.Vector3 torque = d.BodyGetTorque(Body); 3042 d.Vector3 torque = d.BodyGetTorque(Body);
3043 _torque = new Vector3(torque.X, torque.Y, torque.Z); 3043 _torque = new Vector3(torque.X, torque.Y, torque.Z);
3044 3044
3045 base.RequestPhysicsterseUpdate();
3046 3045
3047//Console.WriteLine("Move {0} at {1}", m_primName, l_position); 3046//Console.WriteLine("Move {0} at {1}", m_primName, l_position);
3048 3047 /*
3049 // Check if outside region 3048 // Check if outside region
3050 // In Scene.cs/CrossPrimGroupIntoNewRegion the object is checked for 0.1M from border! 3049 // In Scene.cs/CrossPrimGroupIntoNewRegion the object is checked for 0.1M from border!
3051 if (l_position.X > ((float)_parent_scene.WorldExtents.X - fence)) 3050 if (l_position.X > ((float)_parent_scene.WorldExtents.X - fence))
@@ -3112,7 +3111,52 @@ Console.WriteLine("ODEPrim JointCreateFixed !!!");
3112 return; // Dont process any other motion? 3111 return; // Dont process any other motion?
3113 } // end various methods 3112 } // end various methods
3114 } // end outside region horizontally 3113 } // end outside region horizontally
3115 3114 */
3115 if (_position.X < 0f || _position.X > _parent_scene.WorldExtents.X
3116 || _position.Y < 0f || _position.Y > _parent_scene.WorldExtents.Y
3117 )
3118 {
3119 // we are outside current region
3120 // clip position to a stop just outside region and stop it only internally
3121 // do it only once using m_crossingfailures as control
3122 _position.X = Util.Clip(l_position.X, -0.2f, _parent_scene.WorldExtents.X + .2f);
3123 _position.Y = Util.Clip(l_position.Y, -0.2f, _parent_scene.WorldExtents.Y + .2f);
3124 _position.Z = Util.Clip(l_position.Z, -100f, 50000f);
3125 d.BodySetPosition(Body, _position.X, _position.Y, _position.Z);
3126 d.BodySetLinearVel(Body, 0, 0, 0);
3127
3128 if (Interlocked.Exchange(ref m_crossingfailures, 0) == 0)
3129 { // tell base code only once
3130 Interlocked.Increment(ref m_crossingfailures);
3131 base.RequestPhysicsterseUpdate();
3132 }
3133 return;
3134 }
3135
3136 if (Interlocked.Exchange(ref m_crossingfailures, 0) > 1)
3137 {
3138 // main simulator had a crossing failure
3139 // park it inside region
3140 _position.X = Util.Clip(l_position.X, 0.5f, _parent_scene.WorldExtents.X - 0.5f);
3141 _position.Y = Util.Clip(l_position.Y, 0.5f, _parent_scene.WorldExtents.Y - 0.5f);
3142 _position.Z = Util.Clip(l_position.Z, -100f, 50000f);
3143 d.BodySetPosition(Body, _position.X, _position.Y, _position.Z);
3144
3145 m_lastposition = _position;
3146
3147 _velocity = Vector3.Zero;
3148 m_lastVelocity = _velocity;
3149
3150
3151 if (m_type != Vehicle.TYPE_NONE)
3152 Halt();
3153
3154 d.BodySetLinearVel(Body, 0, 0, 0);
3155 base.RequestPhysicsterseUpdate();
3156 return;
3157 }
3158
3159 base.RequestPhysicsterseUpdate();
3116 3160
3117 if (l_position.Z < 0) 3161 if (l_position.Z < 0)
3118 { 3162 {