aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
diff options
context:
space:
mode:
authorTeravus Ovares2009-01-31 16:49:32 +0000
committerTeravus Ovares2009-01-31 16:49:32 +0000
commit85c0c0557e317b252bcbdf98439a9ec33db17d0c (patch)
tree25ac91fd11315e88b914c7f5a6fab5751a49075d /OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
parentOops. Forgot a try-catch on the last commit. (diff)
downloadopensim-SC-85c0c0557e317b252bcbdf98439a9ec33db17d0c.zip
opensim-SC-85c0c0557e317b252bcbdf98439a9ec33db17d0c.tar.gz
opensim-SC-85c0c0557e317b252bcbdf98439a9ec33db17d0c.tar.bz2
opensim-SC-85c0c0557e317b252bcbdf98439a9ec33db17d0c.tar.xz
* Tweaks some locks when modifying an ODECharacter. This actually allows a user to log-in while the physics scene and the scripts are starting up. This also seems to smooth out the jerks on teleport/connect/disconnect a little bit.
* If you log-in while the simulator is starting up, you won't be able to move and the sim stats will say 0 FPS, and 0 Physics Frames and you may see only terrain. Once the sim finishes starting up, it'll all resume as normal.
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs59
1 files changed, 42 insertions, 17 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index f2906cf..2cdc988 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -89,6 +89,7 @@ namespace OpenSim.Region.Physics.OdePlugin
89 private bool m_alwaysRun = false; 89 private bool m_alwaysRun = false;
90 private bool m_hackSentFall = false; 90 private bool m_hackSentFall = false;
91 private bool m_hackSentFly = false; 91 private bool m_hackSentFly = false;
92 private PhysicsVector m_taintPosition = new PhysicsVector(0, 0, 0);
92 public uint m_localID = 0; 93 public uint m_localID = 0;
93 public bool m_returnCollisions = false; 94 public bool m_returnCollisions = false;
94 // taints and their non-tainted counterparts 95 // taints and their non-tainted counterparts
@@ -130,6 +131,11 @@ namespace OpenSim.Region.Physics.OdePlugin
130 _velocity = new PhysicsVector(); 131 _velocity = new PhysicsVector();
131 _target_velocity = new PhysicsVector(); 132 _target_velocity = new PhysicsVector();
132 _position = pos; 133 _position = pos;
134
135 m_taintPosition.X = pos.X;
136 m_taintPosition.Y = pos.Y;
137 m_taintPosition.Z = pos.Z;
138
133 _acceleration = new PhysicsVector(); 139 _acceleration = new PhysicsVector();
134 _parent_scene = parent_scene; 140 _parent_scene = parent_scene;
135 141
@@ -158,10 +164,9 @@ namespace OpenSim.Region.Physics.OdePlugin
158 m_isPhysical = false; // current status: no ODE information exists 164 m_isPhysical = false; // current status: no ODE information exists
159 m_tainted_isPhysical = true; // new tainted status: need to create ODE information 165 m_tainted_isPhysical = true; // new tainted status: need to create ODE information
160 166
161 lock (_parent_scene.OdeLock) 167
162 { 168 _parent_scene.AddPhysicsActorTaint(this);
163 _parent_scene.AddPhysicsActorTaint(this); 169
164 }
165 m_name = avName; 170 m_name = avName;
166 } 171 }
167 172
@@ -371,11 +376,11 @@ namespace OpenSim.Region.Physics.OdePlugin
371 get { return _position; } 376 get { return _position; }
372 set 377 set
373 { 378 {
374 lock (_parent_scene.OdeLock) 379 if (Body == IntPtr.Zero || Shell == IntPtr.Zero)
375 { 380 _position.X = value.X; _position.Y = value.Y; _position.Z = value.Z;
376 d.BodySetPosition(Body, value.X, value.Y, value.Z); 381
377 _position = value; 382 m_taintPosition.X = value.X; m_taintPosition.Y = value.Y; m_taintPosition.Z = value.Z;
378 } 383 _parent_scene.AddPhysicsActorTaint(this);
379 } 384 }
380 } 385 }
381 386
@@ -395,14 +400,13 @@ namespace OpenSim.Region.Physics.OdePlugin
395 set 400 set
396 { 401 {
397 m_pidControllerActive = true; 402 m_pidControllerActive = true;
398 lock (_parent_scene.OdeLock) 403
399 {
400 PhysicsVector SetSize = value; 404 PhysicsVector SetSize = value;
401 m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; 405 m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f;
402 //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); 406 //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
403 407
404 Velocity = new PhysicsVector(0f, 0f, 0f); 408 Velocity = new PhysicsVector(0f, 0f, 0f);
405 } 409
406 _parent_scene.AddPhysicsActorTaint(this); 410 _parent_scene.AddPhysicsActorTaint(this);
407 } 411 }
408 } 412 }
@@ -444,6 +448,15 @@ namespace OpenSim.Region.Physics.OdePlugin
444 d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH); 448 d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH);
445 Body = d.BodyCreate(_parent_scene.world); 449 Body = d.BodyCreate(_parent_scene.world);
446 d.BodySetPosition(Body, npositionX, npositionY, npositionZ); 450 d.BodySetPosition(Body, npositionX, npositionY, npositionZ);
451
452 _position.X = npositionX;
453 _position.Y = npositionY;
454 _position.Z = npositionZ;
455
456
457 m_taintPosition.X = npositionX;
458 m_taintPosition.Y = npositionY;
459 m_taintPosition.Z = npositionZ;
447 460
448 d.BodySetMass(Body, ref ShellMass); 461 d.BodySetMass(Body, ref ShellMass);
449 d.Matrix3 m_caprot; 462 d.Matrix3 m_caprot;
@@ -708,6 +721,8 @@ namespace OpenSim.Region.Physics.OdePlugin
708 // If the PID Controller isn't active then we set our force 721 // If the PID Controller isn't active then we set our force
709 // calculating base velocity to the current position 722 // calculating base velocity to the current position
710 723
724 if (Body == IntPtr.Zero)
725 return;
711 726
712 if (m_pidControllerActive == false) 727 if (m_pidControllerActive == false)
713 { 728 {
@@ -890,11 +905,8 @@ namespace OpenSim.Region.Physics.OdePlugin
890 /// </summary> 905 /// </summary>
891 public void Destroy() 906 public void Destroy()
892 { 907 {
893 lock (_parent_scene.OdeLock) 908 m_tainted_isPhysical = false;
894 { 909 _parent_scene.AddPhysicsActorTaint(this);
895 m_tainted_isPhysical = false;
896 _parent_scene.AddPhysicsActorTaint(this);
897 }
898 } 910 }
899 911
900 public override void CrossingFailure() 912 public override void CrossingFailure()
@@ -1005,6 +1017,19 @@ namespace OpenSim.Region.Physics.OdePlugin
1005 + (Amotor==IntPtr.Zero ? "Amotor ":"") ); 1017 + (Amotor==IntPtr.Zero ? "Amotor ":"") );
1006 } 1018 }
1007 } 1019 }
1020
1021 if (!m_taintPosition.IsIdentical(_position, 0.05f))
1022 {
1023 if (Body != IntPtr.Zero)
1024 {
1025 d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z);
1026
1027 _position.X = m_taintPosition.X;
1028 _position.Y = m_taintPosition.Y;
1029 _position.Z = m_taintPosition.Z;
1030 }
1031 }
1032
1008 } 1033 }
1009 } 1034 }
1010} 1035}