diff options
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 90 |
1 files changed, 39 insertions, 51 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index ca8fef9..09581c3 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -161,17 +161,19 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
161 | { | 161 | { |
162 | pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | 162 | pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5; |
163 | } | 163 | } |
164 | |||
164 | _position = pos; | 165 | _position = pos; |
165 | m_taintPosition.X = pos.X; | 166 | m_taintPosition = pos; |
166 | m_taintPosition.Y = pos.Y; | ||
167 | m_taintPosition.Z = pos.Z; | ||
168 | } | 167 | } |
169 | else | 168 | else |
170 | { | 169 | { |
171 | _position = new Vector3(((float)_parent_scene.WorldExtents.X * 0.5f), ((float)_parent_scene.WorldExtents.Y * 0.5f), parent_scene.GetTerrainHeightAtXY(128f, 128f) + 10f); | 170 | _position |
172 | m_taintPosition.X = _position.X; | 171 | = new Vector3( |
173 | m_taintPosition.Y = _position.Y; | 172 | (float)_parent_scene.WorldExtents.X * 0.5f, |
174 | m_taintPosition.Z = _position.Z; | 173 | (float)_parent_scene.WorldExtents.Y * 0.5f, |
174 | parent_scene.GetTerrainHeightAtXY(128f, 128f) + 10f); | ||
175 | m_taintPosition = _position; | ||
176 | |||
175 | m_log.Warn("[PHYSICS]: Got NaN Position on Character Create"); | 177 | m_log.Warn("[PHYSICS]: Got NaN Position on Character Create"); |
176 | } | 178 | } |
177 | 179 | ||
@@ -431,10 +433,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
431 | value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | 433 | value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5; |
432 | } | 434 | } |
433 | 435 | ||
434 | m_taintPosition.X = value.X; | 436 | m_taintPosition = value; |
435 | m_taintPosition.Y = value.Y; | ||
436 | m_taintPosition.Z = value.Z; | ||
437 | |||
438 | _parent_scene.AddPhysicsActorTaint(this); | 437 | _parent_scene.AddPhysicsActorTaint(this); |
439 | } | 438 | } |
440 | else | 439 | else |
@@ -582,15 +581,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
582 | d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH); | 581 | d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH); |
583 | Body = d.BodyCreate(_parent_scene.world); | 582 | Body = d.BodyCreate(_parent_scene.world); |
584 | d.BodySetPosition(Body, npositionX, npositionY, npositionZ); | 583 | d.BodySetPosition(Body, npositionX, npositionY, npositionZ); |
585 | 584 | ||
586 | _position.X = npositionX; | 585 | _position.X = npositionX; |
587 | _position.Y = npositionY; | 586 | _position.Y = npositionY; |
588 | _position.Z = npositionZ; | 587 | _position.Z = npositionZ; |
589 | 588 | ||
590 | 589 | m_taintPosition = _position; | |
591 | m_taintPosition.X = npositionX; | ||
592 | m_taintPosition.Y = npositionY; | ||
593 | m_taintPosition.Z = npositionZ; | ||
594 | 590 | ||
595 | d.BodySetMass(Body, ref ShellMass); | 591 | d.BodySetMass(Body, ref ShellMass); |
596 | d.Matrix3 m_caprot; | 592 | d.Matrix3 m_caprot; |
@@ -845,9 +841,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
845 | else | 841 | else |
846 | { | 842 | { |
847 | m_pidControllerActive = true; | 843 | m_pidControllerActive = true; |
848 | _target_velocity.X += force.X; | 844 | _target_velocity += force; |
849 | _target_velocity.Y += force.Y; | ||
850 | _target_velocity.Z += force.Z; | ||
851 | } | 845 | } |
852 | } | 846 | } |
853 | else | 847 | else |
@@ -868,8 +862,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
868 | public void doForce(Vector3 force) | 862 | public void doForce(Vector3 force) |
869 | { | 863 | { |
870 | d.BodyAddForce(Body, force.X, force.Y, force.Z); | 864 | d.BodyAddForce(Body, force.X, force.Y, force.Z); |
871 | //d.BodySetRotation(Body, ref m_StandUpRotation); | ||
872 | //standupStraight(); | ||
873 | } | 865 | } |
874 | 866 | ||
875 | public override void SetMomentum(Vector3 momentum) | 867 | public override void SetMomentum(Vector3 momentum) |
@@ -1059,69 +1051,66 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1059 | internal void UpdatePositionAndVelocity() | 1051 | internal void UpdatePositionAndVelocity() |
1060 | { | 1052 | { |
1061 | // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! | 1053 | // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! |
1062 | d.Vector3 vec; | 1054 | d.Vector3 newPos; |
1063 | try | 1055 | try |
1064 | { | 1056 | { |
1065 | vec = d.BodyGetPosition(Body); | 1057 | newPos = d.BodyGetPosition(Body); |
1066 | } | 1058 | } |
1067 | catch (NullReferenceException) | 1059 | catch (NullReferenceException) |
1068 | { | 1060 | { |
1069 | bad = true; | 1061 | bad = true; |
1070 | _parent_scene.BadCharacter(this); | 1062 | _parent_scene.BadCharacter(this); |
1071 | vec = new d.Vector3(_position.X, _position.Y, _position.Z); | 1063 | newPos = new d.Vector3(_position.X, _position.Y, _position.Z); |
1072 | base.RaiseOutOfBounds(_position); // Tells ScenePresence that there's a problem! | 1064 | base.RaiseOutOfBounds(_position); // Tells ScenePresence that there's a problem! |
1073 | m_log.WarnFormat("[ODEPLUGIN]: Avatar Null reference for Avatar {0}, physical actor {1}", m_name, m_uuid); | 1065 | m_log.WarnFormat("[ODEPLUGIN]: Avatar Null reference for Avatar {0}, physical actor {1}", m_name, m_uuid); |
1074 | } | 1066 | } |
1075 | 1067 | ||
1076 | // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) | 1068 | // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) |
1077 | if (vec.X < 0.0f) vec.X = 0.0f; | 1069 | if (newPos.X < 0.0f) newPos.X = 0.0f; |
1078 | if (vec.Y < 0.0f) vec.Y = 0.0f; | 1070 | if (newPos.Y < 0.0f) newPos.Y = 0.0f; |
1079 | if (vec.X > (int)_parent_scene.WorldExtents.X - 0.05f) vec.X = (int)_parent_scene.WorldExtents.X - 0.05f; | 1071 | if (newPos.X > (int)_parent_scene.WorldExtents.X - 0.05f) newPos.X = (int)_parent_scene.WorldExtents.X - 0.05f; |
1080 | if (vec.Y > (int)_parent_scene.WorldExtents.Y - 0.05f) vec.Y = (int)_parent_scene.WorldExtents.Y - 0.05f; | 1072 | if (newPos.Y > (int)_parent_scene.WorldExtents.Y - 0.05f) newPos.Y = (int)_parent_scene.WorldExtents.Y - 0.05f; |
1081 | 1073 | ||
1082 | _position.X = vec.X; | 1074 | _position.X = newPos.X; |
1083 | _position.Y = vec.Y; | 1075 | _position.Y = newPos.Y; |
1084 | _position.Z = vec.Z; | 1076 | _position.Z = newPos.Z; |
1085 | 1077 | ||
1086 | // I think we need to update the taintPosition too -- Diva 12/24/10 | 1078 | // I think we need to update the taintPosition too -- Diva 12/24/10 |
1087 | m_taintPosition.X = vec.X; | 1079 | m_taintPosition = _position; |
1088 | m_taintPosition.Y = vec.Y; | ||
1089 | m_taintPosition.Z = vec.Z; | ||
1090 | 1080 | ||
1091 | // Did we move last? = zeroflag | 1081 | // Did we move last? = zeroflag |
1092 | // This helps keep us from sliding all over | 1082 | // This helps keep us from sliding all over |
1093 | 1083 | ||
1094 | if (_zeroFlag) | 1084 | if (_zeroFlag) |
1095 | { | 1085 | { |
1096 | _velocity.X = 0.0f; | 1086 | _velocity = Vector3.Zero; |
1097 | _velocity.Y = 0.0f; | ||
1098 | _velocity.Z = 0.0f; | ||
1099 | 1087 | ||
1100 | // Did we send out the 'stopped' message? | 1088 | // Did we send out the 'stopped' message? |
1101 | if (!m_lastUpdateSent) | 1089 | if (!m_lastUpdateSent) |
1102 | { | 1090 | { |
1103 | m_lastUpdateSent = true; | 1091 | m_lastUpdateSent = true; |
1104 | //base.RequestPhysicsterseUpdate(); | 1092 | //base.RequestPhysicsterseUpdate(); |
1105 | |||
1106 | } | 1093 | } |
1107 | } | 1094 | } |
1108 | else | 1095 | else |
1109 | { | 1096 | { |
1110 | m_lastUpdateSent = false; | 1097 | m_lastUpdateSent = false; |
1098 | d.Vector3 newVelocity; | ||
1099 | |||
1111 | try | 1100 | try |
1112 | { | 1101 | { |
1113 | vec = d.BodyGetLinearVel(Body); | 1102 | newVelocity = d.BodyGetLinearVel(Body); |
1114 | } | 1103 | } |
1115 | catch (NullReferenceException) | 1104 | catch (NullReferenceException) |
1116 | { | 1105 | { |
1117 | vec.X = _velocity.X; | 1106 | newVelocity.X = _velocity.X; |
1118 | vec.Y = _velocity.Y; | 1107 | newVelocity.Y = _velocity.Y; |
1119 | vec.Z = _velocity.Z; | 1108 | newVelocity.Z = _velocity.Z; |
1120 | } | 1109 | } |
1121 | _velocity.X = (vec.X); | ||
1122 | _velocity.Y = (vec.Y); | ||
1123 | 1110 | ||
1124 | _velocity.Z = (vec.Z); | 1111 | _velocity.X = newVelocity.X; |
1112 | _velocity.Y = newVelocity.Y; | ||
1113 | _velocity.Z = newVelocity.Z; | ||
1125 | 1114 | ||
1126 | if (_velocity.Z < -6 && !m_hackSentFall) | 1115 | if (_velocity.Z < -6 && !m_hackSentFall) |
1127 | { | 1116 | { |
@@ -1255,10 +1244,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1255 | if (Body != IntPtr.Zero) | 1244 | if (Body != IntPtr.Zero) |
1256 | { | 1245 | { |
1257 | d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z); | 1246 | d.BodySetPosition(Body, m_taintPosition.X, m_taintPosition.Y, m_taintPosition.Z); |
1258 | 1247 | _position = m_taintPosition; | |
1259 | _position.X = m_taintPosition.X; | ||
1260 | _position.Y = m_taintPosition.Y; | ||
1261 | _position.Z = m_taintPosition.Z; | ||
1262 | } | 1248 | } |
1263 | } | 1249 | } |
1264 | 1250 | ||
@@ -1303,8 +1289,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1303 | //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); | 1289 | //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); |
1304 | d.BodyDestroy(Body); | 1290 | d.BodyDestroy(Body); |
1305 | d.GeomDestroy(Shell); | 1291 | d.GeomDestroy(Shell); |
1306 | AvatarGeomAndBodyCreation(_position.X, _position.Y, | 1292 | AvatarGeomAndBodyCreation( |
1307 | _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); | 1293 | _position.X, |
1294 | _position.Y, | ||
1295 | _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); | ||
1308 | 1296 | ||
1309 | // As with Size, we reset velocity. However, this isn't strictly necessary since it doesn't | 1297 | // As with Size, we reset velocity. However, this isn't strictly necessary since it doesn't |
1310 | // appear to stall initial region crossings when done here. Being done for consistency. | 1298 | // appear to stall initial region crossings when done here. Being done for consistency. |