aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs')
-rw-r--r--OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs45
1 files changed, 37 insertions, 8 deletions
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
index 2945199..ec717d7 100644
--- a/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/ChOdePlugin/ODECharacter.cs
@@ -140,6 +140,10 @@ namespace OpenSim.Region.Physics.OdePlugin
140 public int m_eventsubscription = 0; 140 public int m_eventsubscription = 0;
141 private CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate(); 141 private CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate();
142 142
143 private Vector3 m_taintMomentum = Vector3.Zero;
144 private bool m_haveTaintMomentum = false;
145
146
143 // unique UUID of this character object 147 // unique UUID of this character object
144 public UUID m_uuid; 148 public UUID m_uuid;
145 public bool bad = false; 149 public bool bad = false;
@@ -800,8 +804,8 @@ namespace OpenSim.Region.Physics.OdePlugin
800 { 804 {
801 if (value.IsFinite()) 805 if (value.IsFinite())
802 { 806 {
803 m_pidControllerActive = true;
804 _target_velocity = value; 807 _target_velocity = value;
808 m_pidControllerActive = true;
805 } 809 }
806 else 810 else
807 { 811 {
@@ -911,6 +915,14 @@ namespace OpenSim.Region.Physics.OdePlugin
911 915
912 public override void SetMomentum(Vector3 momentum) 916 public override void SetMomentum(Vector3 momentum)
913 { 917 {
918 if (momentum.IsFinite())
919 {
920 m_taintMomentum = momentum;
921 m_haveTaintMomentum = true;
922 _parent_scene.AddPhysicsActorTaint(this);
923 }
924 else
925 m_log.Warn("[PHYSICS] !isFinite momentum");
914 } 926 }
915 927
916 928
@@ -1110,9 +1122,18 @@ namespace OpenSim.Region.Physics.OdePlugin
1110 } 1122 }
1111 // end add Kitto Flora 1123 // end add Kitto Flora
1112 } 1124 }
1125
1126 if (vel.X * vel.X + vel.Y * vel.Y + vel.Z * vel.Z > 2500.0f) // 50ms apply breaks
1127 {
1128 float breakfactor = 0.16f * m_mass; // will give aprox 60m/s terminal velocity at free fall
1129 vec.X -= breakfactor * vel.X;
1130 vec.Y -= breakfactor * vel.Y;
1131 vec.Z -= breakfactor * vel.Z;
1132 }
1133
1113 if (vec.IsFinite()) 1134 if (vec.IsFinite())
1114 { 1135 {
1115 if (!vec.ApproxEquals(Vector3.Zero, 0.02f)) // 0.01 allows 0.002 !! 1136 if (vec.LengthSquared() > 0.0004f) // 0.01 allows 0.002 !!
1116 { 1137 {
1117//Console.WriteLine("DF 2"); // ## 1138//Console.WriteLine("DF 2"); // ##
1118 1139
@@ -1327,7 +1348,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1327 { 1348 {
1328 lock (m_syncRoot) 1349 lock (m_syncRoot)
1329 { 1350 {
1330
1331 if (m_tainted_isPhysical != m_isPhysical) 1351 if (m_tainted_isPhysical != m_isPhysical)
1332 { 1352 {
1333 if (m_tainted_isPhysical) 1353 if (m_tainted_isPhysical)
@@ -1369,9 +1389,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1369 { 1389 {
1370 d.GeomDestroy(Shell); 1390 d.GeomDestroy(Shell);
1371 } 1391 }
1372 catch (System.AccessViolationException) 1392 catch (Exception e)
1373 { 1393 {
1374 m_log.Error("[PHYSICS]: PrimGeom dead"); 1394 m_log.ErrorFormat("[PHYSICS]: Failed to destroy character shell {0}",e.Message);
1375 } 1395 }
1376 // Remove any old entries 1396 // Remove any old entries
1377 //string tShell; 1397 //string tShell;
@@ -1418,12 +1438,21 @@ namespace OpenSim.Region.Physics.OdePlugin
1418 { 1438 {
1419 d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z); 1439 d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z);
1420 1440
1421 _position.X = m_taintPosition.X;
1422 _position.Y = m_taintPosition.Y;
1423 _position.Z = m_taintPosition.Z;
1424 } 1441 }
1442 _position.X = m_taintPosition.X;
1443 _position.Y = m_taintPosition.Y;
1444 _position.Z = m_taintPosition.Z;
1425 } 1445 }
1426 1446
1447 if (m_haveTaintMomentum)
1448 {
1449 m_haveTaintMomentum = false;
1450 _velocity = m_taintMomentum;
1451 _target_velocity = m_taintMomentum;
1452 m_pidControllerActive = true;
1453 if (Body != IntPtr.Zero)
1454 d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z);
1455 }
1427 } 1456 }
1428 } 1457 }
1429 1458